📄 hr_filesys.c
字号:
/* * Host Resources MIB - File System device group implementation - hr_filesys.c * */#include <config.h>#ifdef dynix#if HAVE_SYS_SELECT_H#include <sys/select.h>#endif#endif#include "host_res.h"#include "hr_filesys.h"#include "hr_utils.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_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#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 };void init_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[100]; 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: sprintf(string, HRFS_entry->HRFS_mount); *var_len = strlen(string); return (u_char *) string; case HRFSYS_RMOUNT: if (Check_HR_FileSys_NFS()) sprintf(string, HRFS_entry->HRFS_name); 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) 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_CDFS else if (!strcmp( mnt_type, MNTTYPE_CDFS))#ifdef RockRidge fsys_type_id[fsys_type_len-1] = 13;#else /* ISO 9660 */ fsys_type_id[fsys_type_len-1] = 12;#endif#endif#ifdef MNTTYPE_ISO9660 else if (!strcmp( mnt_type, MNTTYPE_ISO9660)) fsys_type_id[fsys_type_len-1] = 12;#endif#ifdef MNTTYPE_NFS else if (!strcmp( mnt_type, MNTTYPE_NFS)) fsys_type_id[fsys_type_len-1] = 14;#endif#ifdef MNTTYPE_NFS3 else if (!strcmp( mnt_type, MNTTYPE_NFS3))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -