141707Ssklower /*
241707Ssklower * Copyright (c) University of British Columbia, 1984
363216Sbostic * Copyright (c) 1990, 1993
463216Sbostic * The Regents of the University of California. 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*69450Smckusick * @(#)pk_acct.c 8.2 (Berkeley) 05/14/95
1341707Ssklower */
1441590Ssklower
1556530Sbostic #include <sys/param.h>
1656530Sbostic #include <sys/systm.h>
1756530Sbostic #include <sys/namei.h>
1856530Sbostic #include <sys/proc.h>
1956530Sbostic #include <sys/vnode.h>
2056530Sbostic #include <sys/kernel.h>
2156530Sbostic #include <sys/file.h>
2256530Sbostic #include <sys/socket.h>
2356530Sbostic #include <sys/socketvar.h>
2441590Ssklower
2556530Sbostic #include <net/if.h>
2641590Ssklower
2756530Sbostic #include <netccitt/x25.h>
2856530Sbostic #include <netccitt/pk.h>
2956530Sbostic #include <netccitt/pk_var.h>
3056530Sbostic #include <netccitt/x25acct.h>
3141590Ssklower
3245165Ssklower
3341590Ssklower struct vnode *pkacctp;
3441590Ssklower /*
3541590Ssklower * Turn on packet accounting
3641590Ssklower */
3741590Ssklower
pk_accton(path)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;
53*69450Smckusick VOP_UNLOCK(vp, 0, p);
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
pk_acct(lcp)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