/* ufs_vnops.c 4.21 82/03/18 */
#include "../h/socketvar.h"
register struct inode
**ipp
;
register struct inode
*ip
;
if((ip
->i_mode
&IFMT
) != IFDIR
) {
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
open1(ip
, ++uap
->rwmode
, 0);
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
ip
= maknode(uap
->fmode
&07777&(~ISVTX
));
* Common code for open and creat.
* Check permissions, allocate an open file structure,
* and call the device open routine if any.
register struct inode
*ip
;
register struct file
*fp
;
(void) access(ip
, IREAD
);
(void) access(ip
, IWRITE
);
if ((ip
->i_mode
&IFMT
) == IFDIR
)
if ((fp
= falloc()) == NULL
)
fp
->f_flag
= mode
&(FREAD
|FWRITE
);
openi(ip
, mode
&(FREAD
|FWRITE
));
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
ip
= maknode(uap
->fmode
);
* Want to be able to use this to make badblock
* inodes, so don't truncate the dev number.
ip
->i_un
.i_rdev
= uap
->dev
;
ip
->i_flag
|= IACC
|IUPD
|ICHG
;
register struct inode
*ip
, *xp
;
uap
= (struct a
*)u
.u_ap
;
ip
= namei(uchar
, 0, 1); /* well, this routine is doomed anyhow */
if ((ip
->i_mode
&IFMT
)==IFDIR
&& !suser())
iupdat(ip
, &time
, &time
, 1);
u
.u_dirp
= (caddr_t
)uap
->linkname
;
if (u
.u_pdir
->i_dev
!= ip
->i_dev
) {
* symlink -- make a symbolic link
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
u
.u_dirp
= uap
->linkname
;
ip
= maknode(IFLNK
| 0777);
* Hard to avoid races here, especially
* in unlinking directories.
register struct inode
*ip
, *pp
;
* to avoid hanging on the iget
if (pp
->i_number
== u
.u_dent
.d_ino
) {
ip
= iget(pp
->i_dev
, u
.u_dent
.d_ino
);
if((ip
->i_mode
&IFMT
)==IFDIR
&& !suser())
* Don't unlink a mounted file.
if (ip
->i_dev
!= pp
->i_dev
) {
xrele(ip
); /* try once to free text */
if ((ip->i_flag&ITEXT) && ip->i_nlink==1) {
u
.u_offset
-= sizeof(struct direct
);
u
.u_base
= (caddr_t
)&u
.u_dent
;
u
.u_count
= sizeof(struct direct
);
register struct file
*fp
;
uap
= (struct a
*)u
.u_ap
;
if (fp
->f_flag
&FSOCKET
) {
uap
->off
+= fp
->f_offset
;
else if (uap
->sbase
== 2)
uap
->off
+= fp
->f_inode
->i_size
;
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
if (uap
->fmode
&(IREAD
>>6))
(void) access(ip
, IREAD
);
if (uap
->fmode
&(IWRITE
>>6))
(void) access(ip
, IWRITE
);
if (uap
->fmode
&(IEXEC
>>6))
(void) access(ip
, IEXEC
);
register struct file
*fp
;
uap
= (struct a
*)u
.u_ap
;
if (fp
->f_flag
& FSOCKET
)
u
.u_error
= sostat(fp
->f_socket
, uap
->sb
);
stat1(fp
->f_inode
, uap
->sb
);
* Stat system call. This version does not follow links.
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
* Lstat system call. This version does follow links.
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
* The basic routine for fstat and stat:
* get the inode and pass appropriate parts back.
register struct inode
*ip
;
register struct dinode
*dp
;
IUPDAT(ip
, &time
, &time
, 0);
* First copy from inode table
ds
.st_ino
= ip
->i_number
;
ds
.st_nlink
= ip
->i_nlink
;
ds
.st_rdev
= (dev_t
)ip
->i_un
.i_rdev
;
* next the dates in the disk
bp
= bread(ip
->i_dev
, itod(ip
->i_number
));
dp
+= itoo(ip
->i_number
);
ds
.st_atime
= dp
->di_atime
;
ds
.st_mtime
= dp
->di_mtime
;
ds
.st_ctime
= dp
->di_ctime
;
if (copyout((caddr_t
)&ds
, (caddr_t
)ub
, sizeof(ds
)) < 0)
* Return target name of a symbolic link
register struct inode
*ip
;
if ((ip
->i_mode
&IFMT
) != IFLNK
) {
uap
= (struct a
*)u
.u_ap
;
u
.u_r
.r_val1
= uap
->count
- u
.u_count
;
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
if ((ip
= owner(1)) == NULL
)
ip
->i_mode
|= uap
->fmode
&07777;
if (ip
->i_flag
&ITEXT
&& (ip
->i_mode
&ISVTX
)==0)
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
if (!suser() || (ip
= owner(0)) == NULL
)
ip
->i_mode
&= ~(ISUID
|ISGID
);
* Set IUPD and IACC times on file.
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
if ((ip
= owner(1)) == NULL
)
if (copyin((caddr_t
)uap
->tptr
, (caddr_t
)tv
, sizeof(tv
))) {
ip
->i_flag
|= IACC
|IUPD
|ICHG
;
iupdat(ip
, &tv
[0], &tv
[1], 0);