isofs_open(vp
, mode
, cred
, p
)
* Update the times on the inode on writeable file systems.
isofs_close(vp
, fflag
, cred
, p
)
* Check mode permission on inode pointer. Mode is READ, WRITE or EXEC.
* The mode is shifted to select the owner/group/other fields. The
* super user is granted all permissions.
isofs_access(vp
, mode
, cred
, p
)
isofs_getattr(vp
, vap
, cred
, p
)
register struct vattr
*vap
;
register struct iso_node
*ip
= VTOI(vp
);
int year
, month
, day
, hour
,minute
, second
, tz
;
year
= ip
->iso_time
[0] - 70;
minute
= ip
->iso_time
[4];
second
= ip
->iso_time
[5];
int monlen
[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
for (i
= 1; i
< month
; i
++)
if (((year
+2) % 4) == 0 && month
> 2)
crtime
= ((((days
* 24) + hour
) * 60 + minute
) * 60)
/* timezone offset is unreliable on some disks */
if (-48 <= tz
&& tz
<= 52)
vap
->va_fsid
= ip
->i_dev
;
vap
->va_fileid
= ip
->i_number
;
vap
->va_mode
= VREAD
|VEXEC
;
vap
->va_mode
|= (vap
->va_mode
>> 3) | (vap
->va_mode
>> 6);
vap
->va_size
= ip
->i_size
;
vap
->va_atime
.tv_sec
= crtime
;
vap
->va_atime
.tv_usec
= 0;
vap
->va_mtime
.tv_sec
= crtime
;
vap
->va_mtime
.tv_usec
= 0;
vap
->va_ctime
.tv_sec
= crtime
;
vap
->va_ctime
.tv_usec
= 0;
vap
->va_blocksize
= ip
->i_mnt
->logical_block_size
;
vap
->va_bytes
= ip
->i_size
;
vap
->va_type
= vp
->v_type
;
isofs_read(vp
, uio
, ioflag
, cred
)
register struct uio
*uio
;
register struct iso_node
*ip
= VTOI(vp
);
register struct iso_mnt
*imp
;
daddr_t lbn
, bn
, rablock
;
int size
, diff
, error
= 0;
if (uio
->uio_rw
!= UIO_READ
)
panic("isofs_read mode");
type
= ip
->i_mode
& IFMT
;
if (type
!= IFDIR
&& type
!= IFREG
&& type
!= IFLNK
)
panic("isofs_read type");
lbn
= iso_lblkno(imp
, uio
->uio_offset
);
on
= iso_blkoff(imp
, uio
->uio_offset
);
n
= MIN((unsigned)(imp
->im_bsize
- on
), uio
->uio_resid
);
diff
= ip
->i_size
- uio
->uio_offset
;
size
= iso_blksize(imp
, ip
, lbn
);
if (vp
->v_lastr
+ 1 == lbn
&&
iso_lblktosize(imp
, rablock
) < ip
->i_size
)
error
= breada(ITOV(ip
), lbn
, size
, rablock
,
iso_blksize(imp
, ip
, rablock
), NOCRED
, &bp
);
error
= bread(ITOV(ip
), lbn
, size
, NOCRED
, &bp
);
n
= MIN(n
, size
- bp
->b_resid
);
error
= uiomove(bp
->b_un
.b_addr
+ on
, (int)n
, uio
);
if (n
+ on
== imp
->im_bsize
|| uio
->uio_offset
== ip
->i_size
)
} while (error
== 0 && uio
->uio_resid
> 0 && n
!= 0);
isofs_ioctl(vp
, com
, data
, fflag
, cred
, p
)
isofs_select(vp
, which
, fflags
, cred
, p
)
* We should really check to see if I/O is possible.
* NB Currently unsupported.
isofs_mmap(vp
, fflags
, cred
, p
)
* Nothing to do, so just return.
isofs_seek(vp
, oldoff
, newoff
, cred
)
isofs_readdir(vp
, uio
, cred
, eofflagp
)
register struct uio
*uio
;
struct iso_directory_record
*ep
;
iso_offset
= uio
->uio_offset
;
entryoffsetinblock
= iso_blkoff(imp
, iso_offset
);
if (entryoffsetinblock
!= 0) {
if (error
= iso_blkatoff(ip
, iso_offset
, (char **)0, &bp
))
while (iso_offset
< endsearch
&& uio
->uio_resid
> 0) {
* If offset is on a block boundary,
* read the next directory block.
* Release previous if it exists.
if (iso_blkoff(imp
, iso_offset
) == 0) {
if (error
= iso_blkatoff(ip
, iso_offset
,
* Get pointer to next entry.
ep
= (struct iso_directory_record
*)
(bp
->b_un
.b_addr
+ entryoffsetinblock
);
reclen
= isonum_711 (ep
->length
);
/* skip to next block, if any */
iso_offset
= roundup (iso_offset
,
imp
->logical_block_size
);
if (reclen
< sizeof (struct iso_directory_record
))
/* illegal entry, stop */
if (entryoffsetinblock
+ reclen
>= imp
->logical_block_size
)
/* illegal directory, so stop looking */
dirent
.d_fileno
= isonum_733 (ep
->extent
);
dirent
.d_namlen
= isonum_711 (ep
->name_len
);
if (reclen
< sizeof (struct iso_directory_record
)
/* illegal entry, stop */
/*bcopy (ep->name, dirent.d_name, dirent.d_namlen);*/
isofntrans(ep
->name
, dirent
.d_namlen
,
dirent
.d_name
, &dirent
.d_namlen
);
if (dirent
.d_namlen
== 1) {
switch (dirent
.d_name
[0]) {
dirent
.d_name
[dirent
.d_namlen
] = 0;
dirent
.d_reclen
= DIRSIZ (&dirent
);
if (uio
->uio_resid
< dirent
.d_reclen
)
if (error
= uiomove (&dirent
, dirent
.d_reclen
, uio
))
entryoffsetinblock
+= reclen
;
if (end_flag
|| (VTOI(vp
)->i_size
- iso_offset
) <= 0)
uio
->uio_offset
= iso_offset
;
* Ufs abort op, called after namei() when a CREATE/DELETE isn't actually
* done. If a buffer has been saved in anticipation of a CREATE, delete it.
if ((ndp
->ni_nameiop
& (HASBUF
| SAVESTART
)) == HASBUF
)
FREE(ndp
->ni_pnbuf
, M_NAMEI
);
register struct iso_node
*ip
= VTOI(vp
);
register struct iso_node
*ip
= VTOI(vp
);
if (!(ip
->i_flag
& ILOCKED
))
panic("isofs_unlock NOT LOCKED");
* Check for a locked inode.
if (VTOI(vp
)->i_flag
& ILOCKED
)
* Calculate the logical to physical mapping if not done already,
* then call the device strategy routine.
register struct iso_node
*ip
= VTOI(bp
->b_vp
);
if (bp
->b_vp
->v_type
== VBLK
|| bp
->b_vp
->v_type
== VCHR
)
panic("isofs_strategy: spec");
if (bp
->b_blkno
== bp
->b_lblkno
) {
if (error
= iso_bmap(ip
, bp
->b_lblkno
, &bp
->b_blkno
))
if ((long)bp
->b_blkno
== -1)
if ((long)bp
->b_blkno
== -1) {
(*(vp
->v_op
->vop_strategy
))(bp
);
* Print out the contents of an inode.
* Global vfs data structures for isofs
struct vnodeops isofs_vnodeops
= {
isofs_lookup
, /* lookup */
(void *)enodev
, /* create */
(void *)enodev
, /* mknod */
isofs_access
, /* access */
isofs_getattr
, /* getattr */
(void *)enodev
, /* setattr */
(void *)enodev
, /* write */
isofs_select
, /* select */
(void *)nullop
, /* fsync */
(void *)enodev
, /* remove */
(void *)enodev
, /* link */
(void *)enodev
, /* rename */
(void *)enodev
, /* mkdir */
(void *)enodev
, /* rmdir */
(void *)enodev
, /* symlink */
isofs_readdir
, /* readdir */
(void *)enodev
, /* readlink */
isofs_abortop
, /* abortop */
isofs_inactive
, /* inactive */
isofs_reclaim
, /* reclaim */
isofs_unlock
, /* unlock */
(void *)enodev
, /* bmap */
isofs_strategy
, /* strategy */
isofs_islocked
, /* islocked */
(void *)enodev
, /* advlock */