From owner-freebsd-bugs Fri May 11 8:30:26 2001 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 5EC6E37B423 for ; Fri, 11 May 2001 08:30:03 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.1/8.11.1) id f4BFU3l07328; Fri, 11 May 2001 08:30:03 -0700 (PDT) (envelope-from gnats) Date: Fri, 11 May 2001 08:30:03 -0700 (PDT) Message-Id: <200105111530.f4BFU3l07328@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Jim Pirzyk Subject: Re: bin/27240: df does not support '-l' option Reply-To: Jim Pirzyk Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org The following reply was made to PR bin/27240; it has been noted by GNATS. From: Jim Pirzyk To: Garrett Wollman Cc: FreeBSD-gnats-submit@FreeBSD.ORG Subject: Re: bin/27240: df does not support '-l' option Date: Fri, 11 May 2001 08:18:39 -0700 So here is the complete patch using VFCF_NETWORK flag to generate the list of networked filesystems. On Thursday 10 May 2001 07:50 am, Garrett Wollman wrote: > < > + case 'l': > > + if (vfslist != NULL) > > + errx(1, "-l and -t are mutally exclusive."); > > + vfslist = makevfslist("nonfs"); > > + break; > > Actually, that's not the right way to implement this function. The > correct way would be to scan the list of available filesystem types > and look for ones without the VFCF_NETWORK flag. > > -GAWollman *** ./bin/df/df.1.orig Mon Mar 5 01:55:59 2001 --- ./bin/df/df.1 Thu May 10 12:01:01 2001 *************** *** 44,50 **** .Fl b | h | H | k | .Fl m | P .Oc ! .Op Fl ain .Op Fl t Ar type .Op Ar file | filesystem ... .Sh DESCRIPTION --- 44,50 ---- .Fl b | h | H | k | .Fl m | P .Oc ! .Op Fl ailn .Op Fl t Ar type .Op Ar file | filesystem ... .Sh DESCRIPTION *************** *** 91,96 **** --- 91,98 ---- this overrides the .Ev BLOCKSIZE specification from the environment. + .It Fl l + Only display information about locally-mounted filesystems. .It Fl m Use 1048576-byte (1-Mbyte) blocks rather than the default. Note that this overrides the *************** *** 106,112 **** will not request new statistics from the filesystems, but will respond with the possibly stale statistics that were previously obtained. .It Fl P ! Use POSIX compliant output of 512-byte blocks rather than the default. Note that this overrides the .Ev BLOCKSIZE specification from the environment. --- 108,114 ---- will not request new statistics from the filesystems, but will respond with the possibly stale statistics that were previously obtained. .It Fl P ! Use POSIX compliant output of 512-byte blocks rather than the default. Note that this overrides the .Ev BLOCKSIZE specification from the environment. *** ./bin/df/df.c.orig Mon Jun 12 20:19:40 2000 --- ./bin/df/df.c Fri May 11 08:15:02 2001 *************** *** 54,59 **** --- 54,60 ---- #include #include #include + #include #include #include *************** *** 96,101 **** --- 97,103 ---- int unitp [] = { NONE, KILO, MEGA, GIGA, TERA, PETA }; int checkvfsname __P((const char *, char **)); + char *makenetvfslist __P((void)); char **makevfslist __P((char *)); long regetmntinfo __P((struct statfs **, long, char **)); int bread __P((off_t, void *, int)); *************** *** 122,128 **** char *mntpt, *mntpath, **vfslist; vfslist = NULL; ! while ((ch = getopt(argc, argv, "abgHhikmnPt:")) != -1) switch (ch) { case 'a': aflag = 1; --- 124,130 ---- char *mntpt, *mntpath, **vfslist; vfslist = NULL; ! while ((ch = getopt(argc, argv, "abgHhiklmnPt:")) != -1) switch (ch) { case 'a': aflag = 1; *************** *** 152,157 **** --- 154,164 ---- putenv("BLOCKSIZE=1k"); hflag = 0; break; + case 'l': + if (vfslist != NULL) + errx(1, "-l and -t are mutually exclusive."); + vfslist = makevfslist(makenetvfslist()); + break; case 'm': putenv("BLOCKSIZE=1m"); hflag = 0; *************** *** 506,511 **** { (void)fprintf(stderr, ! "usage: df [-b | -H | -h | -k | -m | -P] [-ain] [-t type] [file | filesystem ...]\n"); exit(EX_USAGE); } --- 513,564 ---- { (void)fprintf(stderr, ! "usage: df [-b | -H | -h | -k | -m | -P] [-ailn] [-t type] [file | filesystem ...]\n"); exit(EX_USAGE); + } + + char *makenetvfslist() + { + char *str, *strptr, **listptr; + int mib[3], maxvfsconf, miblen, cnt=0, i; + struct ovfsconf *ptr; + + mib[0] = CTL_VFS; mib[1] = VFS_GENERIC; mib[2] = VFS_MAXTYPENUM; + miblen=sizeof(maxvfsconf); + if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), &maxvfsconf, &miblen, NULL, 0)) { + warnx("sysctl failed"); + return (NULL); + } + + if ((listptr=malloc(sizeof(char*) * maxvfsconf)) == NULL) { + warnx("malloc failed"); + return (NULL); + } + + for (ptr=getvfsent();ptr;ptr=getvfsent()) + if (ptr->vfc_flags & VFCF_NETWORK) { + listptr[cnt++] = strdup (ptr->vfc_name); + if (! listptr[cnt-1]) { + warnx("malloc failed"); + return (NULL); + } + } + + if ((str = malloc(sizeof(char)*(32*cnt+cnt+2))) == NULL) { + warnx("malloc failed"); + free(listptr); + return (NULL); + } + + *str = 'n'; *(str+1) = 'o'; + for (i = 0,strptr=str+2; i < cnt; i++,strptr++) { + strncpy (strptr, listptr[i], 32); + strptr+=strlen(listptr[i]); + *strptr=','; + free(listptr[i]); + } + *(--strptr) = NULL; + + free(listptr); + return (str); } -- --- @(#) $Id: dot.signature,v 1.9 2000/07/10 16:43:05 pirzyk Exp $ __o Jim.Pirzyk@disney.com ------------------------------------- _'\<,_ Senior Systems Engineer, Walt Disney Feature Animation (*)/ (*) To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message