home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume7 / vol_bsa < prev    next >
Text File  |  1989-07-30  |  6KB  |  236 lines

  1. Newsgroups: comp.sources.misc
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Subject: v07i112: My reworking of "vol"
  4. Reply-To: allbery@uunet.UU.NET (Your friendly neighborhood c.s.m moderator)
  5.  
  6. Posting-number: Volume 7, Issue 112
  7. Submitted-by: allbery@uunet.UU.NET (Your friendly neighborhood c.s.m moderator)
  8. Archive-name: vol_bsa
  9.  
  10. The recently submitted "vol" program will not work on any System V or Xenix
  11. 5.x that I have access to; and from the looks of it, it would not work on any
  12. standard Unix system.  Since (as per my comment in the original) it is
  13. potentially useful for sites which run C news and don't have "smart" "df"
  14. commands, I've rewritten it.
  15.  
  16. Usage:  vol [-qd] [file/directory ...]
  17.  
  18. -q suppresses the "file: " label on output, so the result can be passed to
  19. another program.  -d outputs the device instead of the filesystem root.
  20.  
  21. ++Brandon
  22. #------------------------------- cut here -------------------------------------
  23. #! /bin/sh
  24. # This file was wrapped with "dummyshar".  "sh" this file to extract.
  25. # Contents:  vol.c
  26. echo extracting 'vol.c'
  27. if test -f 'vol.c' -a -z "$1"; then echo Not overwriting 'vol.c'; else
  28. sed 's/^X//' << \EOF > 'vol.c'
  29. X/*
  30. X * The "vol" program I was passed was just plain unusable.  I'm surprised
  31. X * that it ever worked on *any* system -- certainly it is guaranteed to fail
  32. X * on all of the System V's I've ever used.  So here's my own.
  33. X * (To the original author:  watch and learn, grasshopper!  ;-)
  34. X *
  35. X * usage: vol [-q] [-d] [file ...]
  36. X *    -q: quiet, no "(file) is on " label
  37. X *    -d: report device instead of filesystem root
  38. X *    default file is current directory
  39. X */
  40. X
  41. X#include <stdio.h>
  42. X#include <sys/types.h>
  43. X#include <sys/stat.h>
  44. X#include <string.h>
  45. X#include <mnttab.h>
  46. X
  47. X#define MAXPATH        64
  48. X#define MAXFS        32
  49. X
  50. Xstatic struct fs
  51. X{
  52. X    char fs_name[MAXPATH];
  53. X    dev_t fs_devno;
  54. X};
  55. X
  56. Xstatic struct fs filesys[MAXFS];
  57. Xstatic int numfs = 0;
  58. X
  59. X#ifdef __STDC__
  60. X# define PROTO(x) x
  61. X# define generic void
  62. X#else
  63. X# define PROTO(x) ()
  64. X# define generic char
  65. X# define const
  66. X#endif
  67. X
  68. Xextern int getopt PROTO((int, const char **, const char *));
  69. Xextern void exit PROTO((int));
  70. Xextern int stat PROTO((const char *, struct stat *));
  71. Xextern void perror PROTO((const char *));
  72. Xextern int printf PROTO((const char *, ...));
  73. Xextern int strcmp PROTO((const char *, const char *));
  74. Xextern FILE *fopen PROTO((const char *, const char *));
  75. Xextern int fread PROTO((char *, unsigned, unsigned, FILE *));
  76. Xextern char *strcpy PROTO((char *, const char *));
  77. Xextern int strlen PROTO((const char *));
  78. Xextern char *strncat PROTO((char *, const char *, int));
  79. Xextern int fprintf PROTO((FILE *, const char *, ...));
  80. Xextern char *strncpy PROTO((char *, const char *, int));
  81. Xextern int fclose PROTO((FILE *));
  82. Xextern void qsort PROTO((void *, int, unsigned, int (*)()));
  83. X
  84. Xint main PROTO((int, const char **));
  85. Xint process PROTO((const char *, int));
  86. Xint revsort PROTO((const generic *, const generic *));
  87. Xint build_mount_table PROTO((int));
  88. Xchar *match PROTO((dev_t));
  89. X
  90. Xint
  91. Xmain(argc, argv)
  92. X    char *argv[];
  93. X{
  94. X    int opt, verbose, devonly, nerr;
  95. X    extern int optind;
  96. X    extern char *optarg;
  97. X
  98. X    verbose = 1;
  99. X    devonly = 0;
  100. X    nerr = 0;
  101. X    while ((opt = getopt(argc, argv, "qd")) != EOF)
  102. X    switch (opt)
  103. X    {
  104. X    case 'q':
  105. X        verbose = !verbose;
  106. X        break;
  107. X    case 'd':
  108. X        devonly = !devonly;
  109. X        break;
  110. X    default:
  111. X        nerr = 1;
  112. X    }
  113. X    if (nerr != 0)
  114. X    {
  115. X    (void) fprintf(stderr, "usage: %s [-qd] [file ...]\n",
  116. X               (argc == 0? "vol": argv[0]));
  117. X    exit(1);
  118. X    }
  119. X    if (!build_mount_table(devonly))
  120. X    exit(1);
  121. X    nerr = 0;
  122. X    if (optind == argc)
  123. X    nerr += process(".", verbose);
  124. X    else
  125. X    while (optind != argc)
  126. X        nerr += process(argv[optind++], verbose);
  127. X    exit(nerr);
  128. X}
  129. X
  130. Xint
  131. Xprocess(name, verbose)
  132. X    const char *name;
  133. X    int verbose;
  134. X{
  135. X    struct stat buf;
  136. X    char *path;
  137. X
  138. X    if (stat(name, &buf) == -1)
  139. X    {
  140. X    perror(name);
  141. X    return 1;
  142. X    }
  143. X    else if ((path = match(buf.st_dev)) == (char *) 0)
  144. X    {
  145. X    (void) fprintf(stderr, "%s: Filesystem unknown\n", name);
  146. X    return 1;
  147. X    }
  148. X    else
  149. X    {
  150. X    if (verbose)
  151. X        (void) printf("%s: ", name);
  152. X    (void) puts(path);
  153. X    return 0;
  154. X    }
  155. X}
  156. X
  157. Xint
  158. Xrevsort(p1, p2)
  159. X    const generic *p1, *p2;
  160. X{
  161. X    return - strcmp(((struct fs *) p1)->fs_name, ((struct fs *) p2)->fs_name);
  162. X}
  163. X
  164. Xint
  165. Xbuild_mount_table(use_dev)
  166. X    int use_dev;
  167. X{
  168. X    struct mnttab disk;
  169. X    struct stat buf;
  170. X    FILE *mount;
  171. X    char dev[1024];
  172. X    int start;
  173. X
  174. X    if ((mount = fopen("/etc/mnttab", "r")) == (FILE *) 0)
  175. X    {
  176. X    perror("/etc/mnttab");
  177. X    return 0;
  178. X    }
  179. X    while (fread((generic *) &disk, sizeof disk, 1, mount) == 1)
  180. X    {
  181. X    if (disk.mt_dev[0] == '\0' || disk.mt_filsys[0] == '\0')
  182. X        continue;        /* null entry -- unmounted fs */
  183. X    if (disk.mt_dev[0] != '/')
  184. X        (void) strcpy(dev, "/dev/");
  185. X    else
  186. X        dev[0] = '\0';
  187. X    start = strlen(dev);
  188. X    (void) strncat(dev, disk.mt_dev, sizeof disk.mt_dev);
  189. X    dev[start + sizeof disk.mt_dev] = '\0';
  190. X    if (stat(dev, &buf) == -1)
  191. X    {
  192. X        perror(dev);
  193. X        continue;
  194. X    }
  195. X    if ((buf.st_mode & S_IFMT) != S_IFBLK)
  196. X    {
  197. X        fprintf(stderr, "dev: Not block special\n", dev);
  198. X        continue;
  199. X    }
  200. X    if (use_dev)
  201. X        (void) strcpy(filesys[numfs].fs_name, dev);
  202. X    else
  203. X    {
  204. X        (void) strncpy(filesys[numfs].fs_name, disk.mt_filsys,
  205. X               sizeof disk.mt_filsys);
  206. X        filesys[numfs].fs_name[sizeof disk.mt_filsys] = '\0';
  207. X    }
  208. X    filesys[numfs++].fs_devno = buf.st_rdev;
  209. X    }
  210. X    (void) fclose(mount);
  211. X    qsort((generic *) filesys, numfs, sizeof *filesys, revsort);
  212. X    return 1;
  213. X}
  214. X
  215. Xchar *
  216. Xmatch(id)
  217. X    dev_t id;
  218. X{
  219. X    int fs;
  220. X
  221. X    for (fs = 0 ; fs < numfs; fs++)
  222. X    if (filesys[fs].fs_devno == id)
  223. X        return filesys[fs].fs_name;
  224. X    return (char *) 0;
  225. X}
  226. EOF
  227. chars=`wc -c < 'vol.c'`
  228. if test $chars !=     4453; then echo 'vol.c' is $chars characters, should be     4453 characters!; fi
  229. fi
  230. exit 0
  231. --
  232. Brandon S. Allbery, moderator of comp.sources.misc    allbery@uunet.uu.net
  233. Please send comp.sources.misc submissions to comp-sources-misc@<backbone>,
  234. related mail to comp-sources-misc-request@<backbone>, and personal mail ONLY
  235. to allbery@NCoast.ORG.  You have only yourself to blame if you don't.
  236.