📄 hr_filesys.c
字号:
/* * Host Resources MIB - File System device group implementation - hr_filesys.c * */#include <net-snmp/net-snmp-config.h>#include "host_res.h"#include "hr_filesys.h"#include "hr_storage.h"#include <net-snmp/utilities.h>#if HAVE_MNTENT_H#include <mntent.h>#endif#if HAVE_SYS_MNTENT_H#include <sys/mntent.h>#endif#if HAVE_SYS_MNTTAB_H#include <sys/mnttab.h>#endif#if HAVE_SYS_STATVFS_H#include <sys/statvfs.h>#endif#if HAVE_SYS_VFS_H#include <sys/vfs.h>#endif#ifdef HAVE_SYS_PARAM_H#include <sys/param.h>#endif#ifdef HAVE_SYS_MOUNT_H#include <sys/mount.h>#endif#include <ctype.h>#if HAVE_STRING_H#include <string.h>#endif#if HAVE_STDLIB_H#include <stdlib.h>#endif#if defined(bsdi4) || defined(freebsd3) || defined(freebsd4) || defined(freebsd5)#if HAVE_GETFSSTAT#if defined(MFSNAMELEN)#define MOUNT_NFS "nfs"#define MNTTYPE_UFS "ufs"#define BerkelyFS#define MNTTYPE_FFS "ffs"#define MNTTYPE_NFS "nfs"#define MNTTYPE_NFS3 "nfs"#define MNTTYPE_MFS "mfs"#define MNTTYPE_MSDOS "msdos"#define MNTTYPE_LFS "lfs"#define MNTTYPE_FDESC "fdesc"#define MNTTYPE_PORTAL "portal"#define MNTTYPE_NULL "null"#define MNTTYPE_UMAP "umap"#define MNTTYPE_KERNFS "kernfs"#define MNTTYPE_PROCFS "procfs"#define MNTTYPE_AFS "afs"#define MNTTYPE_CD9660 "cd9660"#define MNTTYPE_UNION "union"#define MNTTYPE_ADOSFS "adosfs"#define MNTTYPE_EXT2FS "ext2fs"#define MNTTYPE_CFS "coda"#define MNTTYPE_NTFS "ntfs"#endif#endif#endif /* freebsd3 */#define HRFS_MONOTONICALLY_INCREASING /********************* * * Kernel & interface information, * and internal forward declarations * *********************/#ifdef solaris2struct mnttab HRFS_entry_struct;struct mnttab *HRFS_entry = &HRFS_entry_struct;#define HRFS_name mnt_special#define HRFS_mount mnt_mountp#define HRFS_type mnt_fstype#define HRFS_statfs statvfs#elif defined(HAVE_STATVFS) && defined(__NetBSD__)static struct statvfs *fsstats = NULL;struct statvfs *HRFS_entry;static int fscount;#define HRFS_mount f_mntonname#define HRFS_name f_mntfromname#define HRFS_statfs statvfs#define HRFS_type f_fstypename#elif defined(HAVE_GETFSSTAT)static struct statfs *fsstats = 0;static int fscount;struct statfs *HRFS_entry;#define HRFS_statfs statfs#ifdef MFSNAMELEN#define HRFS_type f_fstypename#else#define HRFS_type f_type#endif#define HRFS_mount f_mntonname#define HRFS_name f_mntfromname#elif defined(dynix)struct mntent *HRFS_entry;#define HRFS_name mnt_fsname#define HRFS_mount mnt_dir#define HRFS_type mnt_type#define HRFS_statfs statvfs#elsestruct mntent *HRFS_entry;#define HRFS_name mnt_fsname#define HRFS_mount mnt_dir#define HRFS_type mnt_type#define HRFS_statfs statfs#ifdef linux#define MNTTYPE_CD9660 "iso9660"#define MNTTYPE_EXT2FS "ext2"#define MNTTYPE_EXT3FS "ext3"#define MNTTYPE_SMBFS "smbfs"#define MNTTYPE_MSDOS "msdos"#define MNTTYPE_FAT32 "vfat"#define MNTTYPE_NTFS "ntfs"#endif /* linux */#endif#define FULL_DUMP 0#define PART_DUMP 1extern void Init_HR_FileSys(void);extern int Get_Next_HR_FileSys(void);char *cook_device(char *);static u_char *when_dumped(char *filesys, int level, size_t * length);int header_hrfilesys(struct variable *, oid *, size_t *, int, size_t *, WriteMethod **); /********************* * * Initialisation & common implementation functions * *********************/#define HRFSYS_INDEX 1#define HRFSYS_MOUNT 2#define HRFSYS_RMOUNT 3#define HRFSYS_TYPE 4#define HRFSYS_ACCESS 5#define HRFSYS_BOOT 6#define HRFSYS_STOREIDX 7#define HRFSYS_FULLDUMP 8#define HRFSYS_PARTDUMP 9struct variable4 hrfsys_variables[] = { {HRFSYS_INDEX, ASN_INTEGER, RONLY, var_hrfilesys, 2, {1, 1}}, {HRFSYS_MOUNT, ASN_OCTET_STR, RONLY, var_hrfilesys, 2, {1, 2}}, {HRFSYS_RMOUNT, ASN_OCTET_STR, RONLY, var_hrfilesys, 2, {1, 3}}, {HRFSYS_TYPE, ASN_OBJECT_ID, RONLY, var_hrfilesys, 2, {1, 4}}, {HRFSYS_ACCESS, ASN_INTEGER, RONLY, var_hrfilesys, 2, {1, 5}}, {HRFSYS_BOOT, ASN_INTEGER, RONLY, var_hrfilesys, 2, {1, 6}}, {HRFSYS_STOREIDX, ASN_INTEGER, RONLY, var_hrfilesys, 2, {1, 7}}, {HRFSYS_FULLDUMP, ASN_OCTET_STR, RONLY, var_hrfilesys, 2, {1, 8}}, {HRFSYS_PARTDUMP, ASN_OCTET_STR, RONLY, var_hrfilesys, 2, {1, 9}},};oid hrfsys_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 3, 8 };voidinit_hr_filesys(void){ REGISTER_MIB("host/hr_filesys", hrfsys_variables, variable4, hrfsys_variables_oid);}/* * header_hrfilesys(... * Arguments: * vp IN - pointer to variable entry that points here * name IN/OUT - IN/name requested, OUT/name found * length IN/OUT - length of IN/OUT oid's * exact IN - TRUE if an exact match was requested * var_len OUT - length of variable or 0 if function returned * write_method * */intheader_hrfilesys(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method){#define HRFSYS_ENTRY_NAME_LENGTH 11 oid newname[MAX_OID_LEN]; int fsys_idx, LowIndex = -1; int result; DEBUGMSGTL(("host/hr_filesys", "var_hrfilesys: ")); DEBUGMSGOID(("host/hr_filesys", name, *length)); DEBUGMSG(("host/hr_filesys", " %d\n", exact)); memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid)); /* * Find "next" file system entry */ Init_HR_FileSys(); for (;;) { fsys_idx = Get_Next_HR_FileSys(); if (fsys_idx == -1) break; newname[HRFSYS_ENTRY_NAME_LENGTH] = fsys_idx; result = snmp_oid_compare(name, *length, newname, vp->namelen + 1); if (exact && (result == 0)) { LowIndex = fsys_idx; break; } if ((!exact && (result < 0)) && (LowIndex == -1 || fsys_idx < LowIndex)) { LowIndex = fsys_idx;#ifdef HRFS_MONOTONICALLY_INCREASING break;#endif } } if (LowIndex == -1) { DEBUGMSGTL(("host/hr_filesys", "... index out of range\n")); return (MATCH_FAILED); } memcpy((char *) name, (char *) newname, (vp->namelen + 1) * sizeof(oid)); *length = vp->namelen + 1; *write_method = 0; *var_len = sizeof(long); /* default to 'long' results */ DEBUGMSGTL(("host/hr_filesys", "... get filesys stats ")); DEBUGMSGOID(("host/hr_filesys", name, *length)); DEBUGMSG(("host/hr_filesys", "\n")); return LowIndex;}oid fsys_type_id[] = { 1, 3, 6, 1, 2, 1, 25, 3, 9, 1 }; /* hrFSOther */int fsys_type_len = sizeof(fsys_type_id) / sizeof(fsys_type_id[0]); /********************* * * System specific implementation functions * *********************/u_char *var_hrfilesys(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method){ int fsys_idx; static char string[1024]; char *mnt_type; fsys_idx = header_hrfilesys(vp, name, length, exact, var_len, write_method); if (fsys_idx == MATCH_FAILED) return NULL; switch (vp->magic) { case HRFSYS_INDEX: long_return = fsys_idx; return (u_char *) & long_return; case HRFSYS_MOUNT: snprintf(string, sizeof(string), HRFS_entry->HRFS_mount); string[ sizeof(string)-1 ] = 0; *var_len = strlen(string); return (u_char *) string; case HRFSYS_RMOUNT: if (Check_HR_FileSys_NFS()) { snprintf(string, sizeof(string), HRFS_entry->HRFS_name); string[ sizeof(string)-1 ] = 0; } else string[0] = '\0'; *var_len = strlen(string); return (u_char *) string; case HRFSYS_TYPE: if (Check_HR_FileSys_NFS()) fsys_type_id[fsys_type_len - 1] = 14; else { /* * Not sufficient to identity the file * type precisely, but it's a start. */#if HAVE_GETFSSTAT && !defined(MFSNAMELEN) switch (HRFS_entry->HRFS_type) { case MOUNT_UFS: fsys_type_id[fsys_type_len - 1] = 3; break; case MOUNT_NFS: fsys_type_id[fsys_type_len - 1] = 14; break; case MOUNT_MFS: fsys_type_id[fsys_type_len - 1] = 8; break; case MOUNT_MSDOS: fsys_type_id[fsys_type_len - 1] = 5; break; case MOUNT_LFS: fsys_type_id[fsys_type_len - 1] = 1; break; case MOUNT_LOFS: fsys_type_id[fsys_type_len - 1] = 1; break; case MOUNT_FDESC: fsys_type_id[fsys_type_len - 1] = 1; break; case MOUNT_PORTAL: fsys_type_id[fsys_type_len - 1] = 1; break; case MOUNT_NULL: fsys_type_id[fsys_type_len - 1] = 1; break; case MOUNT_UMAP: fsys_type_id[fsys_type_len - 1] = 1; break; case MOUNT_KERNFS: fsys_type_id[fsys_type_len - 1] = 1; break; case MOUNT_PROCFS: fsys_type_id[fsys_type_len - 1] = 1; break; case MOUNT_AFS: fsys_type_id[fsys_type_len - 1] = 16; break; case MOUNT_CD9660: fsys_type_id[fsys_type_len - 1] = 12; break; case MOUNT_UNION: fsys_type_id[fsys_type_len - 1] = 1; break; case MOUNT_DEVFS: fsys_type_id[fsys_type_len - 1] = 1; break;#ifdef MOUNT_EXT2FS case MOUNT_EXT2FS: fsys_type_id[fsys_type_len - 1] = 23; break;#endif#ifdef MOUNT_TFS case MOUNT_TFS: fsys_type_id[fsys_type_len - 1] = 15; break;#endif }#else mnt_type = HRFS_entry->HRFS_type; if (mnt_type == NULL) fsys_type_id[fsys_type_len - 1] = 2; /* unknown */#ifdef MNTTYPE_HFS else if (!strcmp(mnt_type, MNTTYPE_HFS))#ifdef BerkelyFS fsys_type_id[fsys_type_len - 1] = 3;#else /* SysV */ fsys_type_id[fsys_type_len - 1] = 4;#endif#endif#ifdef MNTTYPE_UFS else if (!strcmp(mnt_type, MNTTYPE_UFS))#if (defined(BerkelyFS) && !defined(MNTTYPE_HFS)) || defined(solaris2) fsys_type_id[fsys_type_len - 1] = 3;#else /* SysV */ fsys_type_id[fsys_type_len - 1] = 4; /* or 3? XXX */#endif#endif#ifdef MNTTYPE_SYSV else if (!strcmp(mnt_type, MNTTYPE_SYSV)) fsys_type_id[fsys_type_len - 1] = 4;#endif#ifdef MNTTYPE_PC else if (!strcmp(mnt_type, MNTTYPE_PC)) fsys_type_id[fsys_type_len - 1] = 5;#endif#ifdef MNTTYPE_MSDOS else if (!strcmp(mnt_type, MNTTYPE_MSDOS)) fsys_type_id[fsys_type_len - 1] = 5;#endif#ifdef MNTTYPE_FAT32 else if (!strcmp(mnt_type, MNTTYPE_FAT32)) fsys_type_id[fsys_type_len - 1] = 22;#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -