xref: /csrg-svn/sys/netccitt/pk_acct.c (revision 69450)
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