hr_filesys.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:22k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  *  Host Resources MIB - File System device group implementation - hr_filesys.c
  3.  *
  4.  */
  5. #include <net-snmp/net-snmp-config.h>
  6. #include "host_res.h"
  7. #include "hr_filesys.h"
  8. #include "hr_storage.h"
  9. #include <net-snmp/utilities.h>
  10. #if HAVE_MNTENT_H
  11. #include <mntent.h>
  12. #endif
  13. #if HAVE_SYS_MNTENT_H
  14. #include <sys/mntent.h>
  15. #endif
  16. #if HAVE_SYS_MNTTAB_H
  17. #include <sys/mnttab.h>
  18. #endif
  19. #if HAVE_SYS_STATVFS_H
  20. #include <sys/statvfs.h>
  21. #endif
  22. #if HAVE_SYS_VFS_H
  23. #include <sys/vfs.h>
  24. #endif
  25. #ifdef HAVE_SYS_PARAM_H
  26. #include <sys/param.h>
  27. #endif
  28. #ifdef HAVE_SYS_MOUNT_H
  29. #include <sys/mount.h>
  30. #endif
  31. #include <ctype.h>
  32. #if HAVE_STRING_H
  33. #include <string.h>
  34. #endif
  35. #if HAVE_STDLIB_H
  36. #include <stdlib.h>
  37. #endif
  38. #if defined(bsdi4) || defined(freebsd3) || defined(freebsd4) || defined(freebsd5)
  39. #if HAVE_GETFSSTAT
  40. #if defined(MFSNAMELEN)
  41. #define MOUNT_NFS "nfs"
  42. #define MNTTYPE_UFS "ufs"
  43. #define BerkelyFS
  44. #define MNTTYPE_FFS "ffs"
  45. #define MNTTYPE_NFS "nfs"
  46. #define MNTTYPE_NFS3 "nfs"
  47. #define MNTTYPE_MFS "mfs"
  48. #define MNTTYPE_MSDOS "msdos"
  49. #define MNTTYPE_LFS "lfs"
  50. #define MNTTYPE_FDESC "fdesc"
  51. #define MNTTYPE_PORTAL "portal"
  52. #define MNTTYPE_NULL "null"
  53. #define MNTTYPE_UMAP "umap"
  54. #define MNTTYPE_KERNFS "kernfs"
  55. #define MNTTYPE_PROCFS "procfs"
  56. #define MNTTYPE_AFS "afs"
  57. #define MNTTYPE_CD9660 "cd9660"
  58. #define MNTTYPE_UNION "union"
  59. #define MNTTYPE_ADOSFS "adosfs"
  60. #define MNTTYPE_EXT2FS "ext2fs"
  61. #define MNTTYPE_CFS "coda"
  62. #define MNTTYPE_NTFS "ntfs"
  63. #endif
  64. #endif
  65. #endif                          /* freebsd3 */
  66. #define HRFS_MONOTONICALLY_INCREASING
  67.         /*********************
  68.  *
  69.  *  Kernel & interface information,
  70.  *   and internal forward declarations
  71.  *
  72.  *********************/
  73. #ifdef solaris2
  74. struct mnttab   HRFS_entry_struct;
  75. struct mnttab  *HRFS_entry = &HRFS_entry_struct;
  76. #define HRFS_name mnt_special
  77. #define HRFS_mount mnt_mountp
  78. #define HRFS_type mnt_fstype
  79. #define HRFS_statfs statvfs
  80. #elif defined(HAVE_STATVFS) && defined(__NetBSD__)
  81. static struct statvfs *fsstats = NULL;
  82. struct statvfs *HRFS_entry;
  83. static int fscount;
  84. #define HRFS_mount f_mntonname
  85. #define HRFS_name f_mntfromname
  86. #define HRFS_statfs statvfs
  87. #define HRFS_type f_fstypename
  88. #elif defined(HAVE_GETFSSTAT)
  89. static struct statfs *fsstats = 0;
  90. static int      fscount;
  91. struct statfs  *HRFS_entry;
  92. #define HRFS_statfs statfs
  93. #ifdef MFSNAMELEN
  94. #define HRFS_type f_fstypename
  95. #else
  96. #define HRFS_type f_type
  97. #endif
  98. #define HRFS_mount f_mntonname
  99. #define HRFS_name f_mntfromname
  100. #elif defined(dynix)
  101. struct mntent  *HRFS_entry;
  102. #define HRFS_name mnt_fsname
  103. #define HRFS_mount mnt_dir
  104. #define HRFS_type mnt_type
  105. #define HRFS_statfs statvfs
  106. #else
  107. struct mntent  *HRFS_entry;
  108. #define HRFS_name mnt_fsname
  109. #define HRFS_mount mnt_dir
  110. #define HRFS_type mnt_type
  111. #define HRFS_statfs statfs
  112. #ifdef linux
  113. #define MNTTYPE_CD9660 "iso9660"
  114. #define MNTTYPE_EXT2FS "ext2"
  115. #define MNTTYPE_EXT3FS "ext3"
  116. #define MNTTYPE_SMBFS "smbfs"
  117. #define MNTTYPE_MSDOS "msdos"
  118. #define MNTTYPE_FAT32 "vfat"
  119. #define MNTTYPE_NTFS "ntfs"
  120. #endif /* linux */
  121. #endif
  122. #define FULL_DUMP 0
  123. #define PART_DUMP 1
  124. extern void     Init_HR_FileSys(void);
  125. extern int      Get_Next_HR_FileSys(void);
  126. char           *cook_device(char *);
  127. static u_char  *when_dumped(char *filesys, int level, size_t * length);
  128. int             header_hrfilesys(struct variable *, oid *, size_t *, int,
  129.                                  size_t *, WriteMethod **);
  130.         /*********************
  131.  *
  132.  *  Initialisation & common implementation functions
  133.  *
  134.  *********************/
  135. #define HRFSYS_INDEX 1
  136. #define HRFSYS_MOUNT 2
  137. #define HRFSYS_RMOUNT 3
  138. #define HRFSYS_TYPE 4
  139. #define HRFSYS_ACCESS 5
  140. #define HRFSYS_BOOT 6
  141. #define HRFSYS_STOREIDX 7
  142. #define HRFSYS_FULLDUMP 8
  143. #define HRFSYS_PARTDUMP 9
  144. struct variable4 hrfsys_variables[] = {
  145.     {HRFSYS_INDEX, ASN_INTEGER, RONLY, var_hrfilesys, 2, {1, 1}},
  146.     {HRFSYS_MOUNT, ASN_OCTET_STR, RONLY, var_hrfilesys, 2, {1, 2}},
  147.     {HRFSYS_RMOUNT, ASN_OCTET_STR, RONLY, var_hrfilesys, 2, {1, 3}},
  148.     {HRFSYS_TYPE, ASN_OBJECT_ID, RONLY, var_hrfilesys, 2, {1, 4}},
  149.     {HRFSYS_ACCESS, ASN_INTEGER, RONLY, var_hrfilesys, 2, {1, 5}},
  150.     {HRFSYS_BOOT, ASN_INTEGER, RONLY, var_hrfilesys, 2, {1, 6}},
  151.     {HRFSYS_STOREIDX, ASN_INTEGER, RONLY, var_hrfilesys, 2, {1, 7}},
  152.     {HRFSYS_FULLDUMP, ASN_OCTET_STR, RONLY, var_hrfilesys, 2, {1, 8}},
  153.     {HRFSYS_PARTDUMP, ASN_OCTET_STR, RONLY, var_hrfilesys, 2, {1, 9}},
  154. };
  155. oid             hrfsys_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 3, 8 };
  156. void
  157. init_hr_filesys(void)
  158. {
  159.     REGISTER_MIB("host/hr_filesys", hrfsys_variables, variable4,
  160.                  hrfsys_variables_oid);
  161. }
  162. /*
  163.  * header_hrfilesys(...
  164.  * Arguments:
  165.  * vp     IN      - pointer to variable entry that points here
  166.  * name    IN/OUT  - IN/name requested, OUT/name found
  167.  * length  IN/OUT  - length of IN/OUT oid's 
  168.  * exact   IN      - TRUE if an exact match was requested
  169.  * var_len OUT     - length of variable or 0 if function returned
  170.  * write_method
  171.  * 
  172.  */
  173. int
  174. header_hrfilesys(struct variable *vp,
  175.                  oid * name,
  176.                  size_t * length,
  177.                  int exact, size_t * var_len, WriteMethod ** write_method)
  178. {
  179. #define HRFSYS_ENTRY_NAME_LENGTH 11
  180.     oid             newname[MAX_OID_LEN];
  181.     int             fsys_idx, LowIndex = -1;
  182.     int             result;
  183.     DEBUGMSGTL(("host/hr_filesys", "var_hrfilesys: "));
  184.     DEBUGMSGOID(("host/hr_filesys", name, *length));
  185.     DEBUGMSG(("host/hr_filesys", " %dn", exact));
  186.     memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
  187.     /*
  188.      * Find "next" file system entry 
  189.      */
  190.     Init_HR_FileSys();
  191.     for (;;) {
  192.         fsys_idx = Get_Next_HR_FileSys();
  193.         if (fsys_idx == -1)
  194.             break;
  195.         newname[HRFSYS_ENTRY_NAME_LENGTH] = fsys_idx;
  196.         result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
  197.         if (exact && (result == 0)) {
  198.             LowIndex = fsys_idx;
  199.             break;
  200.         }
  201.         if ((!exact && (result < 0)) &&
  202.             (LowIndex == -1 || fsys_idx < LowIndex)) {
  203.             LowIndex = fsys_idx;
  204. #ifdef HRFS_MONOTONICALLY_INCREASING
  205.             break;
  206. #endif
  207.         }
  208.     }
  209.     if (LowIndex == -1) {
  210.         DEBUGMSGTL(("host/hr_filesys", "... index out of rangen"));
  211.         return (MATCH_FAILED);
  212.     }
  213.     memcpy((char *) name, (char *) newname,
  214.            (vp->namelen + 1) * sizeof(oid));
  215.     *length = vp->namelen + 1;
  216.     *write_method = 0;
  217.     *var_len = sizeof(long);    /* default to 'long' results */
  218.     DEBUGMSGTL(("host/hr_filesys", "... get filesys stats "));
  219.     DEBUGMSGOID(("host/hr_filesys", name, *length));
  220.     DEBUGMSG(("host/hr_filesys", "n"));
  221.     return LowIndex;
  222. }
  223. oid             fsys_type_id[] = { 1, 3, 6, 1, 2, 1, 25, 3, 9, 1 };     /* hrFSOther */
  224. int             fsys_type_len =
  225.     sizeof(fsys_type_id) / sizeof(fsys_type_id[0]);
  226.         /*********************
  227.  *
  228.  *  System specific implementation functions
  229.  *
  230.  *********************/
  231. u_char         *
  232. var_hrfilesys(struct variable *vp,
  233.               oid * name,
  234.               size_t * length,
  235.               int exact, size_t * var_len, WriteMethod ** write_method)
  236. {
  237.     int             fsys_idx;
  238.     static char     string[1024];
  239.     char           *mnt_type;
  240.     fsys_idx =
  241.         header_hrfilesys(vp, name, length, exact, var_len, write_method);
  242.     if (fsys_idx == MATCH_FAILED)
  243.         return NULL;
  244.     switch (vp->magic) {
  245.     case HRFSYS_INDEX:
  246.         long_return = fsys_idx;
  247.         return (u_char *) & long_return;
  248.     case HRFSYS_MOUNT:
  249.         snprintf(string, sizeof(string), HRFS_entry->HRFS_mount);
  250.         string[ sizeof(string)-1 ] = 0;
  251.         *var_len = strlen(string);
  252.         return (u_char *) string;
  253.     case HRFSYS_RMOUNT:
  254.         if (Check_HR_FileSys_NFS()) {
  255.             snprintf(string, sizeof(string), HRFS_entry->HRFS_name);
  256.             string[ sizeof(string)-1 ] = 0;
  257.         } else
  258.             string[0] = '';
  259.         *var_len = strlen(string);
  260.         return (u_char *) string;
  261.     case HRFSYS_TYPE:
  262.         if (Check_HR_FileSys_NFS())
  263.             fsys_type_id[fsys_type_len - 1] = 14;
  264.         else {
  265.         /*
  266.          * Not sufficient to identity the file
  267.          *   type precisely, but it's a start.
  268.          */
  269. #if HAVE_GETFSSTAT && !defined(MFSNAMELEN)
  270.         switch (HRFS_entry->HRFS_type) {
  271.         case MOUNT_UFS:
  272.             fsys_type_id[fsys_type_len - 1] = 3;
  273.             break;
  274.         case MOUNT_NFS:
  275.             fsys_type_id[fsys_type_len - 1] = 14;
  276.             break;
  277.         case MOUNT_MFS:
  278.             fsys_type_id[fsys_type_len - 1] = 8;
  279.             break;
  280.         case MOUNT_MSDOS:
  281.             fsys_type_id[fsys_type_len - 1] = 5;
  282.             break;
  283.         case MOUNT_LFS:
  284.             fsys_type_id[fsys_type_len - 1] = 1;
  285.             break;
  286.         case MOUNT_LOFS:
  287.             fsys_type_id[fsys_type_len - 1] = 1;
  288.             break;
  289.         case MOUNT_FDESC:
  290.             fsys_type_id[fsys_type_len - 1] = 1;
  291.             break;
  292.         case MOUNT_PORTAL:
  293.             fsys_type_id[fsys_type_len - 1] = 1;
  294.             break;
  295.         case MOUNT_NULL:
  296.             fsys_type_id[fsys_type_len - 1] = 1;
  297.             break;
  298.         case MOUNT_UMAP:
  299.             fsys_type_id[fsys_type_len - 1] = 1;
  300.             break;
  301.         case MOUNT_KERNFS:
  302.             fsys_type_id[fsys_type_len - 1] = 1;
  303.             break;
  304.         case MOUNT_PROCFS:
  305.             fsys_type_id[fsys_type_len - 1] = 1;
  306.             break;
  307.         case MOUNT_AFS:
  308.             fsys_type_id[fsys_type_len - 1] = 16;
  309.             break;
  310.         case MOUNT_CD9660:
  311.             fsys_type_id[fsys_type_len - 1] = 12;
  312.             break;
  313.         case MOUNT_UNION:
  314.             fsys_type_id[fsys_type_len - 1] = 1;
  315.             break;
  316.         case MOUNT_DEVFS:
  317.             fsys_type_id[fsys_type_len - 1] = 1;
  318.             break;
  319. #ifdef MOUNT_EXT2FS
  320.         case MOUNT_EXT2FS:
  321.             fsys_type_id[fsys_type_len - 1] = 23;
  322.             break;
  323. #endif
  324. #ifdef MOUNT_TFS
  325.         case MOUNT_TFS:
  326.             fsys_type_id[fsys_type_len - 1] = 15;
  327.             break;
  328. #endif
  329.         }
  330. #else
  331.         mnt_type = HRFS_entry->HRFS_type;
  332.         if (mnt_type == NULL)
  333.             fsys_type_id[fsys_type_len - 1] = 2;        /* unknown */
  334. #ifdef MNTTYPE_HFS
  335.         else if (!strcmp(mnt_type, MNTTYPE_HFS))
  336. #ifdef BerkelyFS
  337.             fsys_type_id[fsys_type_len - 1] = 3;
  338. #else                           /* SysV */
  339.             fsys_type_id[fsys_type_len - 1] = 4;
  340. #endif
  341. #endif
  342. #ifdef MNTTYPE_UFS
  343.         else if (!strcmp(mnt_type, MNTTYPE_UFS))
  344. #if (defined(BerkelyFS) && !defined(MNTTYPE_HFS)) || defined(solaris2)
  345.             fsys_type_id[fsys_type_len - 1] = 3;
  346. #else                           /* SysV */
  347.             fsys_type_id[fsys_type_len - 1] = 4;        /* or 3? XXX */
  348. #endif
  349. #endif
  350. #ifdef MNTTYPE_SYSV
  351.         else if (!strcmp(mnt_type, MNTTYPE_SYSV))
  352.             fsys_type_id[fsys_type_len - 1] = 4;
  353. #endif
  354. #ifdef MNTTYPE_PC
  355.         else if (!strcmp(mnt_type, MNTTYPE_PC))
  356.             fsys_type_id[fsys_type_len - 1] = 5;
  357. #endif
  358. #ifdef MNTTYPE_MSDOS
  359.         else if (!strcmp(mnt_type, MNTTYPE_MSDOS))
  360.             fsys_type_id[fsys_type_len - 1] = 5;
  361. #endif
  362. #ifdef MNTTYPE_FAT32
  363.         else if (!strcmp(mnt_type, MNTTYPE_FAT32))
  364.             fsys_type_id[fsys_type_len - 1] = 22;
  365. #endif
  366. #ifdef MNTTYPE_CDFS
  367.         else if (!strcmp(mnt_type, MNTTYPE_CDFS))
  368. #ifdef RockRidge
  369.             fsys_type_id[fsys_type_len - 1] = 13;
  370. #else                           /* ISO 9660 */
  371.             fsys_type_id[fsys_type_len - 1] = 12;
  372. #endif
  373. #endif
  374. #ifdef MNTTYPE_HSFS
  375.         else if (!strcmp(mnt_type, MNTTYPE_HSFS))
  376.             fsys_type_id[fsys_type_len - 1] = 13;
  377. #endif
  378. #ifdef MNTTYPE_ISO9660
  379.         else if (!strcmp(mnt_type, MNTTYPE_ISO9660))
  380.             fsys_type_id[fsys_type_len - 1] = 12;
  381. #endif
  382. #ifdef MNTTYPE_CD9660
  383.         else if (!strcmp(mnt_type, MNTTYPE_CD9660))
  384.             fsys_type_id[fsys_type_len - 1] = 12;
  385. #endif
  386. #ifdef MNTTYPE_SMBFS
  387.         else if (!strcmp(mnt_type, MNTTYPE_SMBFS))
  388.             fsys_type_id[fsys_type_len - 1] = 14;
  389. #endif
  390. #ifdef MNTTYPE_NFS
  391.         else if (!strcmp(mnt_type, MNTTYPE_NFS))
  392.             fsys_type_id[fsys_type_len - 1] = 14;
  393. #endif
  394. #ifdef MNTTYPE_NFS3
  395.         else if (!strcmp(mnt_type, MNTTYPE_NFS3))
  396.             fsys_type_id[fsys_type_len - 1] = 14;
  397. #endif
  398. #ifdef MNTTYPE_MFS
  399.         else if (!strcmp(mnt_type, MNTTYPE_MFS))
  400.             fsys_type_id[fsys_type_len - 1] = 8;
  401. #endif
  402. #ifdef MNTTYPE_EXT2FS
  403.         else if (!strcmp(mnt_type, MNTTYPE_EXT2FS))
  404.             fsys_type_id[fsys_type_len - 1] = 23;
  405. #endif
  406. #ifdef MNTTYPE_EXT3FS
  407.         else if (!strcmp(mnt_type, MNTTYPE_EXT3FS))
  408.             fsys_type_id[fsys_type_len - 1] = 23;
  409. #endif
  410. #ifdef MNTTYPE_NTFS
  411.         else if (!strcmp(mnt_type, MNTTYPE_NTFS))
  412.             fsys_type_id[fsys_type_len - 1] = 9;
  413. #endif
  414.         else
  415.             fsys_type_id[fsys_type_len - 1] = 1;        /* Other */
  416. #endif                          /* HAVE_GETFSSTAT */
  417.         }
  418.         *var_len = sizeof(fsys_type_id);
  419.         return (u_char *) fsys_type_id;
  420.     case HRFSYS_ACCESS:
  421. #if defined(HAVE_STATVFS) && defined(__NetBSD__)
  422. long_return = HRFS_entry->f_flag & MNT_RDONLY ? 2 : 1;
  423. #elif defined(HAVE_GETFSSTAT)
  424.         long_return = HRFS_entry->f_flags & MNT_RDONLY ? 2 : 1;
  425. #elif defined(cygwin)
  426.         long_return = 1;
  427. #else
  428.         if (hasmntopt(HRFS_entry, "ro") != NULL)
  429.             long_return = 2;    /* Read Only */
  430.         else
  431.             long_return = 1;    /* Read-Write */
  432. #endif
  433.         return (u_char *) & long_return;
  434.     case HRFSYS_BOOT:
  435.         if (HRFS_entry->HRFS_mount[0] == '/' &&
  436.             HRFS_entry->HRFS_mount[1] == 0)
  437.             long_return = 1;    /* root is probably bootable! */
  438.         else
  439.             long_return = 2;    /* others probably aren't */
  440.         return (u_char *) & long_return;
  441.     case HRFSYS_STOREIDX:
  442.         long_return = fsys_idx + HRS_TYPE_FIXED_MAX;
  443.         return (u_char *) & long_return;
  444.     case HRFSYS_FULLDUMP:
  445.         return when_dumped(HRFS_entry->HRFS_name, FULL_DUMP, var_len);
  446.     case HRFSYS_PARTDUMP:
  447.         return when_dumped(HRFS_entry->HRFS_name, PART_DUMP, var_len);
  448.     default:
  449.         DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrfilesysn",
  450.                     vp->magic));
  451.     }
  452.     return NULL;
  453. }
  454.         /*********************
  455.  *
  456.  *  Internal implementation functions
  457.  *
  458.  *********************/
  459. static int      HRFS_index;
  460. #ifndef HAVE_GETFSSTAT
  461. static FILE    *fp;
  462. #endif
  463. void
  464. Init_HR_FileSys(void)
  465. {
  466. #if HAVE_GETFSSTAT
  467.     fscount = getfsstat(NULL, 0, MNT_NOWAIT);
  468.     if (fsstats)
  469.         free((char *) fsstats);
  470.     fsstats = NULL;
  471.     fsstats = malloc(fscount * sizeof(*fsstats));
  472.     getfsstat(fsstats, fscount * sizeof(*fsstats), MNT_NOWAIT);
  473.     HRFS_index = 0;
  474. #else
  475.     HRFS_index = 1;
  476.     if (fp != NULL)
  477.         fclose(fp);
  478.     fp = fopen(ETC_MNTTAB, "r");
  479. #endif
  480. }
  481. const char     *HRFS_ignores[] = {
  482. #ifdef MNTTYPE_IGNORE
  483.     MNTTYPE_IGNORE,
  484. #endif
  485. #ifdef MNTTYPE_SWAP
  486.     MNTTYPE_SWAP,
  487. #endif
  488. #ifdef MNTTYPE_PROC
  489.     MNTTYPE_PROC,
  490. #endif
  491. #ifdef MNTTYPE_PROCFS
  492.     MNTTYPE_PROCFS,
  493. #endif
  494. #ifdef MNTTYPE_AUTOFS
  495.     MNTTYPE_AUTOFS,
  496. #else
  497.     "autofs",
  498. #endif
  499. #ifdef linux
  500.     "devpts",
  501.     "devfs",
  502.     "usbdevfs",
  503.     "tmpfs",
  504.     "shm",
  505. #endif
  506. #ifdef solaris2
  507.     "mntfs",
  508.     "proc",
  509.     "fd",
  510. #endif
  511.     0
  512. };
  513. int
  514. Get_Next_HR_FileSys(void)
  515. {
  516. #if HAVE_GETFSSTAT
  517.     if (HRFS_index >= fscount)
  518.         return -1;
  519.     HRFS_entry = fsstats + HRFS_index;
  520.     return ++HRFS_index;
  521. #else
  522.     const char    **cpp;
  523.     if (fp == NULL)
  524.         return -1;
  525. #ifdef solaris2
  526.     if (getmntent(fp, HRFS_entry) != 0)
  527.         return -1;
  528. #else
  529.     HRFS_entry = getmntent(fp);
  530.     if (HRFS_entry == NULL)
  531.         return -1;
  532. #endif                          /* solaris2 */
  533.     for (cpp = HRFS_ignores; *cpp != NULL; ++cpp)
  534.         if (!strcmp(HRFS_entry->HRFS_type, *cpp))
  535.             return Get_Next_HR_FileSys();
  536.     /*
  537.      * Try and ensure that index values are persistent
  538.      *   at least within a single run of the agent
  539.      */
  540.     HRFS_index = se_find_value_in_slist("filesys", HRFS_entry->HRFS_name );
  541.     if (HRFS_index == SE_DNE) {
  542.         HRFS_index = se_find_free_value_in_slist("filesys");
  543.         if (HRFS_index == SE_DNE) { HRFS_index = 1; }
  544.         se_add_pair_to_slist( "filesys",
  545.                               strdup( HRFS_entry->HRFS_name ), HRFS_index);
  546.     }
  547.     return HRFS_index++;
  548. #endif                          /* HAVE_GETFSSTAT */
  549. }
  550. /*
  551.  * this function checks whether the current file system (info can be found
  552.  * in HRFS_entry) is a NFS file system
  553.  * HRFS_entry must be valid prior to calling this function
  554.  * returns 1 if NFS file system, 0 otherwise
  555.  */
  556. int
  557. Check_HR_FileSys_NFS (void)
  558. {
  559. #if HAVE_GETFSSTAT
  560. #if defined(MFSNAMELEN)
  561.     if (!strcmp(HRFS_entry->HRFS_type, MOUNT_NFS))
  562. #else
  563.     if (HRFS_entry->HRFS_type == MOUNT_NFS)
  564. #endif
  565. #else /* HAVE_GETFSSTAT */
  566.     if ( HRFS_entry->HRFS_type != NULL && (
  567. #if defined(MNTTYPE_NFS)
  568. !strcmp( HRFS_entry->HRFS_type, MNTTYPE_NFS) ||
  569. #else
  570. !strcmp( HRFS_entry->HRFS_type, "nfs") ||
  571. #endif
  572. #if defined(MNTTYPE_NFS3)
  573.     !strcmp( HRFS_entry->HRFS_type, MNTTYPE_NFS3) ||
  574. #endif
  575. #if defined(MNTTYPE_SMBFS)
  576.     !strcmp( HRFS_entry->HRFS_type, MNTTYPE_SMBFS) ||
  577. #endif
  578. #if defined(MNTTYPE_LOFS)
  579.     !strcmp( HRFS_entry->HRFS_type, MNTTYPE_LOFS) ||
  580. #endif
  581.     /*
  582.      * MVFS is Rational ClearCase's view file system
  583.      * it is similiar to NFS file systems in that it is mounted
  584.      * locally or remotely from the ClearCase server
  585.      */
  586.     !strcmp( HRFS_entry->HRFS_type, "mvfs")))
  587. #endif /* HAVE_GETFSSTAT */
  588. return 1; /* NFS file system */
  589.     return 0; /* no NFS file system */
  590. }
  591. void
  592. End_HR_FileSys(void)
  593. {
  594. #ifdef HAVE_GETFSSTAT
  595.     if (fsstats)
  596.         free((char *) fsstats);
  597.     fsstats = NULL;
  598. #else
  599.     if (fp != NULL)
  600.         fclose(fp);
  601.     fp = NULL;
  602. #endif
  603. }
  604. static u_char  *
  605. when_dumped(char *filesys, int level, size_t * length)
  606. {
  607.     time_t          dumpdate = 0, tmp;
  608.     FILE           *dump_fp;
  609.     char            line[1024];
  610.     char           *cp1, *cp2, *cp3;
  611.     /*
  612.      * Look for the relevent entries in /etc/dumpdates
  613.      *
  614.      * This is complicated by the fact that disks are
  615.      *   mounted using block devices, but dumps are
  616.      *   done via the raw character devices.
  617.      * Thus the device names in /etc/dumpdates and
  618.      *   /etc/mnttab don't match.
  619.      *   These comparisons are therefore made using the
  620.      *   final portion of the device name only.
  621.      */
  622.     if (*filesys == '')       /* No filesystem name? */
  623.         return date_n_time(NULL, length);
  624.     cp1 = strrchr(filesys, '/');        /* Find the last element of the current FS */
  625.     if (cp1 == NULL)
  626.         cp1 = filesys;
  627.     if ((dump_fp = fopen("/etc/dumpdates", "r")) == NULL)
  628.         return date_n_time(NULL, length);
  629.     while (fgets(line, sizeof(line), dump_fp) != NULL) {
  630.         cp2 = strchr(line, ' ');        /* Start by looking at the device name only */
  631.         if (cp2 != NULL) {
  632.             *cp2 = '';
  633.             cp3 = strrchr(line, '/');   /* and find the last element */
  634.             if (cp3 == NULL)
  635.                 cp3 = line;
  636.             if (strcmp(cp1, cp3) != 0)  /* Wrong FS */
  637.                 continue;
  638.             ++cp2;
  639.             while (isspace(*cp2))
  640.                 ++cp2;          /* Now find the dump level */
  641.             if (level == FULL_DUMP) {
  642.                 if (*(cp2++) != '0')
  643.                     continue;   /* Not interested in partial dumps */
  644.                 while (isspace(*cp2))
  645.                     ++cp2;
  646.                 dumpdate = ctime_to_timet(cp2);
  647.                 fclose(dump_fp);
  648.                 return date_n_time(&dumpdate, length);
  649.             } else {            /* Partial Dump */
  650.                 if (*(cp2++) == '0')
  651.                     continue;   /* Not interested in full dumps */
  652.                 while (isspace(*cp2))
  653.                     ++cp2;
  654.                 tmp = ctime_to_timet(cp2);
  655.                 if (tmp > dumpdate)
  656.                     dumpdate = tmp;     /* Remember the 'latest' partial dump */
  657.             }
  658.         }
  659.     }
  660.     fclose(dump_fp);
  661.     return date_n_time(&dumpdate, length);
  662. }
  663. #define RAW_DEVICE_PREFIX "/dev/rdsk"
  664. #define COOKED_DEVICE_PREFIX "/dev/dsk"
  665. char           *
  666. cook_device(char *dev)
  667. {
  668.     static char     cooked_dev[SNMP_MAXPATH+1];
  669.     if (!strncmp(dev, RAW_DEVICE_PREFIX, strlen(RAW_DEVICE_PREFIX))) {
  670.         strncpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev)-1);
  671.         cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
  672.         strncat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX),
  673.                 sizeof(cooked_dev)-strlen(cooked_dev)-1);
  674.         cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
  675.     } else {
  676.         strncpy(cooked_dev, dev, sizeof(cooked_dev)-1);
  677.         cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
  678.     }
  679.     return (cooked_dev);
  680. }
  681. int
  682. Get_FSIndex(char *dev)
  683. {
  684.     int             iindex;
  685.     Init_HR_FileSys();
  686.     while ((iindex = Get_Next_HR_FileSys()) != -1)
  687.         if (!strcmp(HRFS_entry->HRFS_name, cook_device(dev))) {
  688.             End_HR_FileSys();
  689.             return iindex;
  690.         }
  691.     End_HR_FileSys();
  692.     return 0;
  693. }
  694. long
  695. Get_FSSize(char *dev)
  696. {
  697.     struct HRFS_statfs statfs_buf;
  698.     Init_HR_FileSys();
  699.     while (Get_Next_HR_FileSys() != -1)
  700.         if (!strcmp(HRFS_entry->HRFS_name, cook_device(dev))) {
  701.             End_HR_FileSys();
  702.             if (HRFS_statfs(HRFS_entry->HRFS_mount, &statfs_buf) != -1)
  703.    /*
  704.     * with large file systems the following calculation produces
  705.     * an overflow:
  706.     * (statfs_buf.f_blocks*statfs_buf.f_bsize)/1024
  707.     *
  708.     * assumption: f_bsize is either 512 or a multiple of 1024
  709.     * in case of 512 (f_blocks/2) is returned
  710.     * otherwise (f_blocks*(f_bsize/1024)) is returned
  711.     */
  712. #if defined(solaris2) && defined(STRUCT_STATVFS_HAS_F_FRSIZE)
  713.                 return (statfs_buf.f_blocks*(statfs_buf.f_frsize/1024));
  714. #else
  715.    if (statfs_buf.f_bsize == 512)
  716.        return (statfs_buf.f_blocks/2);
  717.                 else
  718.        return (statfs_buf.f_blocks*(statfs_buf.f_bsize/1024));
  719. #endif
  720.             else
  721.                 return -1;
  722.         }
  723.     End_HR_FileSys();
  724.     return 0;
  725. }