/* Copyright (c) University of British Columbia, 1984 */
#include "../netccitt/pk.h"
#include "../netccitt/pk_var.h"
#include "../netccitt/x25.h"
#include "../netccitt/x25acct.h"
* Turn on packet accounting
struct nameidata
*ndp
= &u
.u_nd
;
register struct inode
*ip
;
if (error
= lookupname(path
, UIO_USERSPACE
, FOLLOW_LINK
,
(struct vnode
**)0, &vp
))
if (vp
->v_type
!= VREG
) {
if (vp
->v_vfsp
->vfs_flag
& VFS_RDONLY
) {
ndp
->ni_nameiop
= LOOKUP
| FOLLOW
;
ndp
->ni_segflg
= UIO_USERSPACE
;
ip
= namei (schar
, LOOKUP
, 1);
if ((ip
-> i_mode
& IFMT
) != IFREG
) {
if (pkacctp
->i_number
!= ip
->i_number
||
pkacctp
->i_dev
!= ip
->i_dev
)
* Turn off packet accounting
* Write a record on the accounting file.
register struct pklcd
*lcp
;
register struct vnode
*vp
;
register struct inode
*ip
;
register struct sockaddr_x25
*sa
;
register char *src
, *dst
;
static struct x25acct acbuf
;
bzero ((caddr_t
)&acbuf
, sizeof (acbuf
));
if (lcp
-> lcd_ceaddr
!= 0)
else if (lcp
-> lcd_craddr
!= 0) {
acbuf
.x25acct_callin
= 1;
if (sa
-> x25_opts
.op_flags
& X25_REVERSE_CHARGE
)
acbuf
.x25acct_revcharge
= 1;
acbuf
.x25acct_stime
= lcp
-> lcd_stime
;
acbuf
.x25acct_etime
= time
.tv_sec
- acbuf
.x25acct_stime
;
etime
= time
.tv_sec
- acbuf
.x25acct_stime
;
acbuf
.x25acct_etime
= etime
> 0xffff ? 0xffff : etime
;
acbuf
.x25acct_uid
= u
.u_uid
;
acbuf
.x25acct_psize
= sa
-> x25_opts
.op_psize
;
acbuf
.x25acct_net
= sa
-> x25_net
;
dst
= acbuf
.x25acct_addr
;
for (len
= 0; *src
; len
++)
acbuf
.x25acct_addrlen
= len
;
bcopy (sa
-> x25_udata
, acbuf
.x25acct_udata
,
sizeof (acbuf
.x25acct_udata
));
acbuf
.x25acct_txcnt
= lcp
-> lcd_txcnt
;
acbuf
.x25acct_rxcnt
= lcp
-> lcd_rxcnt
;
(void) vn_rdwr(UIO_WRITE
, vp
, (caddr_t
)&acbuf
, sizeof (acbuf
),
(off_t
)0, UIO_SYSSPACE
, IO_UNIT
|IO_APPEND
, (int *)0);
if (rdwri (UIO_WRITE
, ip
, (caddr_t
)&acbuf
, sizeof (acbuf
),
itrunc (ip
, (u_long
) siz
);