home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3299 / mntops.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-07  |  4.0 KB  |  215 lines

  1. /* History:
  2. 5/1/91 DJB baseline
  3. Originally stolen from Dupuy ofiles.
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include "rpcnfs.h" /* XXX: see structmtab.h */
  10. #include "structmtab.h"
  11. #include "stattimeout.h"
  12. #include "mallocfree.h"
  13. #include "mntops.h"
  14. #include "confslowstat.h"
  15. #include "confmntent.h"
  16. #include "confmntult.h"
  17.  
  18. #ifdef SLOWSTAT
  19. #define STAT_TIMEOUT 5 /* time out stat() calls after 5 sec */
  20. #endif
  21. #ifndef STAT_TIMEOUT
  22. #define STAT_TIMEOUT 0
  23. #endif
  24.  
  25. #ifdef MNTULT
  26. static struct fs_data mntdata;
  27. #else
  28. static FILE *mnttab;
  29. #endif
  30.  
  31. struct statlist *stats = 0;
  32.  
  33. #ifdef MNTULT
  34.  
  35. int get_mntlist()
  36. {
  37.  register struct statlist *statp;
  38.  int mnt = 0;
  39.  int result;
  40.  
  41. #ifdef NOSTAT_MANY
  42.  while (result = getmnt(&mnt,&mntdata,sizeof(mntdata),NOSTAT_MANY,0))
  43. #else
  44.  while (result = getmnt(&mnt,&mntdata,sizeof(mntdata),mnt))
  45. #endif
  46.   {
  47.    if (!(statp = (struct statlist *) malloc(sizeof(struct statlist))))
  48.       break;
  49.    statp->next = stats;
  50.    stats = statp;
  51.  
  52.    (void) strcpy(statp->filename,mntdata.fd_path);
  53.    (void) strcpy(statp->fsname,mntdata.fd_devname);
  54.    statp->device = mntdata.fd_dev;
  55.   }
  56.  
  57.  if (result < 0)
  58.    return -1;
  59.  return 0;
  60. }
  61.  
  62. struct mounted *getmntname(name)
  63. char *name;
  64. {
  65.  static struct mounted mounted;
  66.  int result;
  67.  
  68. #ifdef NOSTAT_ONE
  69.  if (!(result = getmnt(0,&mntdata,0,NOSTAT_ONE,name)))
  70.    return 0;
  71. #else
  72.  int mnt = 0;
  73.  
  74.  while (result = getmnt(&mnt,&mntdata,sizeof(mntdata),mnt))
  75.   {
  76.    if (strcmp(name,mntdata.fd_devname) == 0)
  77.      break;
  78.    if (strcmp(name,mntdata.fd_path) == 0)
  79.      break;
  80.   }
  81.  
  82.  if (mnt == 0)
  83.    return 0;
  84. #endif
  85.  
  86.  if (result < 0)
  87.    return 0;
  88.  
  89.  mounted.mountpoint = mntdata.fd_path;
  90.  mounted.filesystem = mntdata.fd_devname;
  91.  return &mounted;
  92. }
  93.  
  94. struct mounted *getmntfile(filestats)
  95. struct stat *filestats;
  96. {
  97.  static struct mounted mounted;
  98.  int context;
  99.  
  100.  while (getmnt(&context,&mntdata,sizeof(mntdata)),context)
  101.    if (filestats->st_dev == mntdata.fd_dev)
  102.       break;
  103.  
  104.  if (!context)
  105.    return 0;
  106.  
  107.  mounted.mountpoint = mntdata.fd_path;
  108.  mounted.filesystem = mntdata.fd_devname;
  109.  return &mounted;
  110. }
  111.  
  112. #else
  113.  
  114. #ifndef MNTENT
  115.  
  116. struct mtab *getmntent(mntfile)
  117. FILE *mntfile;
  118. {
  119.  static struct mtab mtab;
  120.  char devname[MNTMAXSTR];
  121.  
  122.  if (fread((char *) &mtab,sizeof(mtab),1,mntfile) != 1)
  123.    return 0;
  124.  strncpy(devname,mtab.m_dname,MNTMAXSTR);
  125.  strcpy(mtab.m_dname,"/dev/");
  126.  strncat(mtab.m_dname,devname,MNTMAXSTR - 5);
  127.  return &mtab;
  128. }
  129.  
  130. #endif
  131.  
  132. int get_mntlist()
  133. {
  134.  register struct statlist *statp;
  135.  struct stat status;
  136.  struct mntent *mnt;
  137.  
  138. #ifdef MNTENT
  139.  mnttab = setmntent(MOUNTED,"r");
  140. #else
  141.  mnttab = fopen("/etc/mtab","r");
  142. #endif
  143.  
  144.  if (!mnttab)
  145.    return -1;
  146.  
  147.  while (mnt = getmntent(mnttab))
  148.   {
  149.    if (!(statp = (struct statlist *) malloc(sizeof(struct statlist))))
  150.      break;
  151.    statp->next = stats;
  152.    stats = statp;
  153.  
  154.    (void) strncpy(statp->filename,mnt->mnt_dir,MNTMAXSTR);
  155.    (void) strncpy(statp->fsname,mnt->mnt_fsname,MNTMAXSTR);
  156.    statp->filename[MNTMAXSTR - 1] = '\0';
  157.    statp->fsname[MNTMAXSTR - 1] = '\0';
  158.  
  159.    if (stattimeout(statp->filename,&status,STAT_TIMEOUT))
  160.     {        /* find out what it is */
  161.      /*XXX: report error on statp->filename */
  162.      stats = statp->next;
  163.      free((char *) statp);
  164.      continue;
  165.     }
  166.    statp->device = status.st_dev;
  167.   }
  168. }
  169.  
  170. struct mounted *getmntname(name)
  171. char *name;
  172. {
  173.  static struct mounted mounted;
  174.  register struct mntent *mnt;
  175.  
  176.  rewind(mnttab);
  177.  while ((mnt = getmntent(mnttab)))
  178.   {
  179.    if (strncmp(name,mnt->mnt_fsname,MNTMAXSTR) == 0)
  180.      break;
  181.    if (strncmp(name,mnt->mnt_dir,MNTMAXSTR) == 0)
  182.      break;
  183.   }
  184.  
  185.  if (!mnt)
  186.    return 0;
  187.  
  188.  mounted.mountpoint = mnt->mnt_dir;
  189.  mounted.filesystem = mnt->mnt_fsname;
  190.  return &mounted;
  191. }
  192.  
  193. struct mounted *getmntfile(filestats)
  194. struct stat *filestats;
  195. {
  196.  static struct mounted mounted;
  197.  register struct mntent *mnt;
  198.  struct stat dirstats;
  199.  
  200.  rewind(mnttab);
  201.  while (mnt = getmntent(mnttab))
  202.    if ((stat(mnt->mnt_dir,&dirstats) >= 0) &&
  203.        (filestats->st_dev == dirstats.st_dev))
  204.      break;
  205.  
  206.  if (!mnt)
  207.    return 0;
  208.  
  209.  mounted.mountpoint = mnt->mnt_dir;
  210.  mounted.filesystem = mnt->mnt_fsname;
  211.  return &mounted;
  212. }
  213.  
  214. #endif
  215.