141707Ssklower /* 241707Ssklower * Copyright (c) University of British Columbia, 1984 341707Ssklower * Copyright (c) 1990 The Regents of the University of California. 441707Ssklower * All rights reserved. 541707Ssklower * 641707Ssklower * This code is derived from software contributed to Berkeley by 741707Ssklower * the Laboratory for Computation Vision and the Computer Science Department 841707Ssklower * of the University of British Columbia. 941707Ssklower * 1041707Ssklower * %sccs.include.redist.c% 1141707Ssklower * 12*56530Sbostic * @(#)pk_acct.c 7.10 (Berkeley) 10/11/92 1341707Ssklower */ 1441590Ssklower 15*56530Sbostic #include <sys/param.h> 16*56530Sbostic #include <sys/systm.h> 17*56530Sbostic #include <sys/namei.h> 18*56530Sbostic #include <sys/proc.h> 19*56530Sbostic #include <sys/vnode.h> 20*56530Sbostic #include <sys/kernel.h> 21*56530Sbostic #include <sys/file.h> 22*56530Sbostic #include <sys/socket.h> 23*56530Sbostic #include <sys/socketvar.h> 2441590Ssklower 25*56530Sbostic #include <net/if.h> 2641590Ssklower 27*56530Sbostic #include <netccitt/x25.h> 28*56530Sbostic #include <netccitt/pk.h> 29*56530Sbostic #include <netccitt/pk_var.h> 30*56530Sbostic #include <netccitt/x25acct.h> 3141590Ssklower 3245165Ssklower 3341590Ssklower struct vnode *pkacctp; 3441590Ssklower /* 3541590Ssklower * Turn on packet accounting 3641590Ssklower */ 3741590Ssklower 3841590Ssklower pk_accton (path) 3941590Ssklower char *path; 4041590Ssklower { 4145165Ssklower register struct vnode *vp = NULL; 4250157Ssklower struct nameidata nd; 4345165Ssklower struct vnode *oacctp = pkacctp; 4450157Ssklower struct proc *p = curproc; 4545165Ssklower int error; 4641590Ssklower 4750157Ssklower if (path == 0) 4850157Ssklower goto close; 4952385Ssklower NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, path, p); 5052385Ssklower if (error = vn_open (&nd, FWRITE, 0644)) 5141590Ssklower return (error); 5250157Ssklower vp = nd.ni_vp; 5350157Ssklower VOP_UNLOCK(vp); 5445165Ssklower if (vp -> v_type != VREG) { 5545165Ssklower vrele (vp); 5641590Ssklower return (EACCES); 5741590Ssklower } 5841590Ssklower pkacctp = vp; 5950157Ssklower if (oacctp) { 6050157Ssklower close: 6150157Ssklower error = vn_close (oacctp, FWRITE, p -> p_ucred, p); 6241590Ssklower } 6350157Ssklower return (error); 6441590Ssklower } 6541590Ssklower 6641590Ssklower /* 6741590Ssklower * Write a record on the accounting file. 6841590Ssklower */ 6941590Ssklower 7041590Ssklower pk_acct (lcp) 7141590Ssklower register struct pklcd *lcp; 7241590Ssklower { 7341590Ssklower register struct vnode *vp; 7441590Ssklower register struct sockaddr_x25 *sa; 7541590Ssklower register char *src, *dst; 7641590Ssklower register int len; 7741590Ssklower register long etime; 7841590Ssklower static struct x25acct acbuf; 7941590Ssklower 8041590Ssklower if ((vp = pkacctp) == 0) 8141590Ssklower return; 8241590Ssklower bzero ((caddr_t)&acbuf, sizeof (acbuf)); 8341590Ssklower if (lcp -> lcd_ceaddr != 0) 8441590Ssklower sa = lcp -> lcd_ceaddr; 8541590Ssklower else if (lcp -> lcd_craddr != 0) { 8641590Ssklower sa = lcp -> lcd_craddr; 8741590Ssklower acbuf.x25acct_callin = 1; 8841590Ssklower } else 8941590Ssklower return; 9041590Ssklower 9141590Ssklower if (sa -> x25_opts.op_flags & X25_REVERSE_CHARGE) 9241590Ssklower acbuf.x25acct_revcharge = 1; 9341590Ssklower acbuf.x25acct_stime = lcp -> lcd_stime; 9441590Ssklower acbuf.x25acct_etime = time.tv_sec - acbuf.x25acct_stime; 9550157Ssklower acbuf.x25acct_uid = curproc -> p_cred -> p_ruid; 9641590Ssklower acbuf.x25acct_psize = sa -> x25_opts.op_psize; 9741590Ssklower acbuf.x25acct_net = sa -> x25_net; 9841590Ssklower /* 9941590Ssklower * Convert address to bcd 10041590Ssklower */ 10141590Ssklower src = sa -> x25_addr; 10241590Ssklower dst = acbuf.x25acct_addr; 10341590Ssklower for (len = 0; *src; len++) 10441590Ssklower if (len & 01) 10541590Ssklower *dst++ |= *src++ & 0xf; 10641590Ssklower else 10741590Ssklower *dst = *src++ << 4; 10841590Ssklower acbuf.x25acct_addrlen = len; 10941590Ssklower 11041590Ssklower bcopy (sa -> x25_udata, acbuf.x25acct_udata, 11141590Ssklower sizeof (acbuf.x25acct_udata)); 11241590Ssklower acbuf.x25acct_txcnt = lcp -> lcd_txcnt; 11341590Ssklower acbuf.x25acct_rxcnt = lcp -> lcd_rxcnt; 11441590Ssklower 11541590Ssklower (void) vn_rdwr(UIO_WRITE, vp, (caddr_t)&acbuf, sizeof (acbuf), 11650157Ssklower (off_t)0, UIO_SYSSPACE, IO_UNIT|IO_APPEND, 11750157Ssklower curproc -> p_ucred, (int *)0, 11847973Smckusick (struct proc *)0); 11941590Ssklower } 120