diff options
Diffstat (limited to 'dialects/freebsd/dnode.c')
-rw-r--r-- | dialects/freebsd/dnode.c | 169 |
1 files changed, 152 insertions, 17 deletions
diff --git a/dialects/freebsd/dnode.c b/dialects/freebsd/dnode.c index 84467cb..bf743df 100644 --- a/dialects/freebsd/dnode.c +++ b/dialects/freebsd/dnode.c @@ -32,7 +32,7 @@ #ifndef lint static char copyright[] = "@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n"; -static char *rcsid = "$Id: dnode.c,v 1.44 2015/07/07 20:23:43 abe Exp $"; +static char *rcsid = "$Id: dnode.c,v 1.45 2018/02/14 14:26:03 abe Exp $"; #endif @@ -52,6 +52,11 @@ _PROTOTYPE(static int lkup_dev_tty,(dev_t *dr, INODETYPE *ir)); #endif /* defined(HASFDESCFS) && HASFDESCFS==1 */ +#if defined(HASPTSFN) && defined(DTYPE_PTS) +#include <sys/tty.h> +#endif /* defined(HASPTSFN) && defined(DTYPE_PTS) */ + + #if defined(HAS_TMPFS) #define _KERNEL #include <fs/tmpfs/tmpfs.h> @@ -62,7 +67,7 @@ _PROTOTYPE(static void get_lock_state,(KA_T f)); /* - * get_lock_state() -- get the lock state + * get_lock_state() - get the lock state */ static void @@ -232,7 +237,7 @@ lkup_dev_tty_again: #if defined(HASKQUEUE) /* - * process_kqueue() -- process kqueue file + * process_kqueue() - process kqueue file * * Strictly speaking this function should appear in dfile.c, because it is * a file processing function. However, the Net and Open BSD sources don't @@ -272,6 +277,7 @@ process_node(va) struct nfsnode *n; size_t sz; char *ty; + unsigned char ums; enum vtype type; struct vnode *v, vb; struct l_vfs *vfs; @@ -320,6 +326,14 @@ process_node(va) #endif /* defined(HASFDESCFS) */ +#if defined(HASFUSEFS) + dev_t fuse_dev; + int fuse_dev_def, fuse_stat; + INODETYPE fuse_ino; + long fuse_links; + SZOFFTYPE fuse_sz; +#endif /* defined(HASFUSEFS) */ + #if FREEBSDV>=5000 # if defined(HAS_UFS1_2) int ufst; @@ -337,8 +351,8 @@ process_node(va) struct devfs_dirent *d; char vtbuf[32]; char *vtbp; - enum vtagtype { VT_DEVFS, VT_FDESC, VT_ISOFS, VT_PSEUDOFS, VT_NFS, - VT_NULL, VT_TMPFS, VT_UFS, VT_ZFS, VT_UNKNOWN + enum vtagtype { VT_DEVFS, VT_FDESC, VT_FUSEFS, VT_ISOFS, VT_PSEUDOFS, + VT_NFS, VT_NULL, VT_TMPFS, VT_UFS, VT_ZFS, VT_UNKNOWN }; # if defined(HAS_TMPFS) @@ -400,7 +414,7 @@ process_overlaid_node: * Initialize miscellaneous variables. This is done so that processing an * overlaid node will be a fresh start. */ - devs = rdevs = 0; + devs = rdevs = ums = 0; i = (struct inode *)NULL; n = (struct nfsnode *)NULL; Namech[0] = '\0'; @@ -413,6 +427,10 @@ process_overlaid_node: f = (struct fdescnode *)NULL; #endif /* defined(HASFDESCFS) */ +#if defined(HASFUSEFS) + fuse_dev_def = fuse_stat = 0; +#endif /* defined(HASFUSEFS) */ + #if FREEBSDV<5000 m = (struct mfsnode *)NULL; #else /* FREEBSDV>=5000 */ @@ -577,10 +595,14 @@ process_overlaid_node: vtag = VT_ISOFS; else if (!strcmp(vtbuf, "pseudofs")) vtag = VT_PSEUDOFS; + else if (!strcmp(vtbuf, "nullfs")) + vtag = VT_NULL; else if (!strcmp(vtbuf, "null")) vtag = VT_NULL; else if (!strcmp(vtbuf, "fdesc")) vtag = VT_FDESC; + else if (!strcmp(vtbuf, "fuse")) + vtag = VT_FUSEFS; else if (!strcmp(vtbuf, "tmpfs")) vtag = VT_TMPFS; } else @@ -631,6 +653,20 @@ process_overlaid_node: # endif /* FREEBSDV<2000 */ #endif /* defined(HASFDESCFS) */ +#if defined(HASFUSEFS) + case VT_FUSEFS: + if (read_fuse_node(v, &fuse_dev, &fuse_dev_def, &fuse_ino, + &fuse_links, &fuse_sz)) + { + (void) snpf(Namech, Namechl, "no fuse node: %s", + print_kptr((KA_T)v->v_data, (char *)NULL, 0)); + enter_nm(Namech); + return; + } + fuse_stat = 1; + break; +#endif /* defined(HASFUSEFS) */ + #if defined(HAS9660FS) case VT_ISOFS: if (read_iso_node(v, &iso_dev, &iso_dev_def, &iso_ino, &iso_links, @@ -795,6 +831,7 @@ process_overlaid_node: # if defined(HAS_UFS1_2) if (i->i_ump && !kread((KA_T)i->i_ump, (char *)&um, sizeof(um))) { + ums = 1; if (um.um_fstype == UFS1) { if (i->i_din1 && !kread((KA_T)i->i_din1, (char *)&d1, sizeof(d1))) @@ -870,26 +907,33 @@ process_overlaid_node: } else if (i) { #if FREEBSDV>=4000 +# if defined(HAS_NO_IDEV) + if (ums) { + dev = Dev2Udev((KA_T)um.um_dev); + devs = 1; + } +# else /* !defined(HAS_NO_IDEV) */ if (i->i_dev -# if !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) +# if !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) && !kread((KA_T)i->i_dev, (char *)&si, sizeof(si)) -# endif /* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */ +# endif/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */ ) { -# if defined(HAS_NO_SI_UDEV) -# if defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) +# if defined(HAS_NO_SI_UDEV) +# if defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) dev = Dev2Udev((KA_T)i->i_dev); -# else /* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */ +# else /* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */ dev = Dev2Udev(&si); -# endif /* defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) */ -# else /* !defined(HAS_NO_SI_UDEV) */ +# endif /* defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) */ +# else /* !defined(HAS_NO_SI_UDEV) */ dev = si.si_udev; -# endif /* defined(HAS_NO_SI_UDEV) */ +# endif /* defined(HAS_NO_SI_UDEV) */ devs = 1; } +# endif /* defined(HAS_NO_IDEV) */ #else /* FREEBSDV<4000 */ dev = i->i_dev; devs = 1; @@ -937,7 +981,14 @@ process_overlaid_node: * Record information returned by readzfsnode(). */ if (vfs) { - dev = vfs->fsid.val[0]; + union { + int32_t val[2]; + dev_t dev; + } vfs_fsid; + + vfs_fsid.val[0] = vfs->fsid.val[0]; + vfs_fsid.val[1] = vfs->fsid.val[1]; + dev = vfs_fsid.dev; devs = 1; } if ((type == VCHR) || (type == VBLK)) { @@ -959,7 +1010,7 @@ process_overlaid_node: # if HASFDESCFS==1 else -# endif /* HASFDESFS==1 */ +# endif /* HASFDESCFS==1 */ # endif /* defined(HASFDLINK) */ # if HASFDESCFS==1 @@ -972,7 +1023,7 @@ process_overlaid_node: devs = Lf->inp_ty = 1; } } -# endif /* HASFDESFS==1 */ +# endif /* HASFDESCFS==1 */ } #endif /* defined(HASFDESCFS) && (defined(HASFDLINK) || HASFDESCFS==1) */ @@ -984,6 +1035,13 @@ process_overlaid_node: } #endif /* defined(HAS9660FS) */ +#if defined(HASFUSEFS) + else if (fuse_stat && fuse_dev_def) { + dev = fuse_dev; + devs = Lf->inp_ty = 1; + } +#endif /* defined(HASFUSEFS) */ + #if FREEBSDV>=5000 else if (d) { if (vfs) { @@ -1074,6 +1132,13 @@ process_overlaid_node: } #endif /* defined(HAS9660FS) */ +#if defined(HASFUSEFS) + else if (fuse_stat) { + Lf->inode = fuse_ino; + Lf->inp_ty = 1; + } +#endif /* defined(HASFUSEFS) */ + #if defined(HASPROCFS) # if FREEBSDV>=2000 else if (p) { @@ -1205,8 +1270,16 @@ process_overlaid_node: Lf->sz = (SZOFFTYPE)iso_sz; Lf->sz_def = 1; } + #endif /* defined(HAS9660FS) */ +#if defined(HASFUSEFS) + else if (fuse_stat) { + Lf->sz = (SZOFFTYPE)fuse_sz; + Lf->sz_def = 1; + } +#endif /* defined(HASFUSEFS) */ + } else if ((type == VCHR || type == VBLK) && !Fsize) Lf->off_def = 1; @@ -1265,6 +1338,13 @@ process_overlaid_node: } #endif /* defined(HAS9660FS) */ +#if defined(HASFUSEFS) + else if (fuse_stat) { + Lf->nlink = fuse_links; + Lf->nlink_def = 1; + } +#endif /* defined(HASFUSEFS) */ + #if FREEBSDV>=5000 else if (d) { Lf->nlink = d->de_links; @@ -1577,3 +1657,58 @@ process_pipe(pa) enter_nm(Namech); } #endif /* FREEBSDV>=2020 */ + + +#if defined(HASPTSFN) && defined(DTYPE_PTS) +/* + * process_pts - process a file structure whose type is DTYPE_PTS + */ + +void process_pts(tp) + KA_T tp; /* f_data pointer to tty structure */ +{ + dev_t dev; /* IFCHR device number */ + struct tty t; /* tty structure */ + + (void) snpf(Lf->type, sizeof(Lf->type), "PTS"); +/* + * Read the tty structure. Quit if it can't be read. + */ + if (!tp || kread(tp, (char *)&t, sizeof(t))) { + (void) snpf(Namech, Namechl, + "can't read DTYPE_PTS tty struct: %s", + print_kptr((KA_T)tp, (char *)NULL, 0)); + enter_nm(Namech); + return; + } +/* + * Convert the tty's cdev from kernel to user form. + * + * Set the device number to DevDev, the device number of /dev. + * + * Set the inode number to the device number. + * + * Set the file type to N_CHR for a character device (That's what a PTS is.) + * + * Force the use of offset from file structure. + * + * Set rdev to the converted device. + * + * Force the reloading of the device cache. + */ + if ((dev = Dev2Udev((KA_T)t.t_dev)) == NODEV) { + (void) snpf(Namech, Namechl, + "can't convert device in DTYPE_PTS tty struct: %s", + print_kptr((KA_T)tp, (char *)NULL, 0)); + enter_nm(Namech); + return; + } + Lf->dev = DevDev; + Lf->inode = (INODETYPE)dev; + Lf->inp_ty = Lf->dev_def = Lf->rdev_def = 1; + Lf->ntype = N_CHR; + Lf->off_def = 1; + Lf->rdev = dev; + DCunsafe = 1; +} +#endif /* defined(HASPTSFN) && defined(DTYPE_PTS) */ |