⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hr_filesys.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 2 页
字号:
#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_HSFS        else if (!strcmp(mnt_type, MNTTYPE_HSFS))            fsys_type_id[fsys_type_len - 1] = 13;#endif#ifdef MNTTYPE_ISO9660        else if (!strcmp(mnt_type, MNTTYPE_ISO9660))            fsys_type_id[fsys_type_len - 1] = 12;#endif#ifdef MNTTYPE_CD9660        else if (!strcmp(mnt_type, MNTTYPE_CD9660))            fsys_type_id[fsys_type_len - 1] = 12;#endif#ifdef MNTTYPE_SMBFS        else if (!strcmp(mnt_type, MNTTYPE_SMBFS))            fsys_type_id[fsys_type_len - 1] = 14;#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))            fsys_type_id[fsys_type_len - 1] = 14;#endif#ifdef MNTTYPE_MFS        else if (!strcmp(mnt_type, MNTTYPE_MFS))            fsys_type_id[fsys_type_len - 1] = 8;#endif#ifdef MNTTYPE_EXT2FS        else if (!strcmp(mnt_type, MNTTYPE_EXT2FS))            fsys_type_id[fsys_type_len - 1] = 23;#endif#ifdef MNTTYPE_EXT3FS        else if (!strcmp(mnt_type, MNTTYPE_EXT3FS))            fsys_type_id[fsys_type_len - 1] = 23;#endif#ifdef MNTTYPE_NTFS        else if (!strcmp(mnt_type, MNTTYPE_NTFS))            fsys_type_id[fsys_type_len - 1] = 9;#endif        else            fsys_type_id[fsys_type_len - 1] = 1;        /* Other */#endif                          /* HAVE_GETFSSTAT */        }        *var_len = sizeof(fsys_type_id);        return (u_char *) fsys_type_id;    case HRFSYS_ACCESS:#if defined(HAVE_STATVFS) && defined(__NetBSD__)	long_return = HRFS_entry->f_flag & MNT_RDONLY ? 2 : 1;#elif defined(HAVE_GETFSSTAT)        long_return = HRFS_entry->f_flags & MNT_RDONLY ? 2 : 1;#elif defined(cygwin)        long_return = 1;#else        if (hasmntopt(HRFS_entry, "ro") != NULL)            long_return = 2;    /* Read Only */        else            long_return = 1;    /* Read-Write */#endif        return (u_char *) & long_return;    case HRFSYS_BOOT:        if (HRFS_entry->HRFS_mount[0] == '/' &&            HRFS_entry->HRFS_mount[1] == 0)            long_return = 1;    /* root is probably bootable! */        else            long_return = 2;    /* others probably aren't */        return (u_char *) & long_return;    case HRFSYS_STOREIDX:        long_return = fsys_idx + HRS_TYPE_FIXED_MAX;        return (u_char *) & long_return;    case HRFSYS_FULLDUMP:        return when_dumped(HRFS_entry->HRFS_name, FULL_DUMP, var_len);    case HRFSYS_PARTDUMP:        return when_dumped(HRFS_entry->HRFS_name, PART_DUMP, var_len);    default:        DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrfilesys\n",                    vp->magic));    }    return NULL;}        /*********************	 *	 *  Internal implementation functions	 *	 *********************/static int      HRFS_index;#ifndef HAVE_GETFSSTATstatic FILE    *fp;#endifvoidInit_HR_FileSys(void){#if HAVE_GETFSSTAT    fscount = getfsstat(NULL, 0, MNT_NOWAIT);    if (fsstats)        free((char *) fsstats);    fsstats = NULL;    fsstats = malloc(fscount * sizeof(*fsstats));    getfsstat(fsstats, fscount * sizeof(*fsstats), MNT_NOWAIT);    HRFS_index = 0;#else    HRFS_index = 1;    if (fp != NULL)        fclose(fp);    fp = fopen(ETC_MNTTAB, "r");#endif}const char     *HRFS_ignores[] = {#ifdef MNTTYPE_IGNORE    MNTTYPE_IGNORE,#endif#ifdef MNTTYPE_SWAP    MNTTYPE_SWAP,#endif#ifdef MNTTYPE_PROC    MNTTYPE_PROC,#endif#ifdef MNTTYPE_PROCFS    MNTTYPE_PROCFS,#endif#ifdef MNTTYPE_AUTOFS    MNTTYPE_AUTOFS,#else    "autofs",#endif#ifdef linux    "devpts",    "devfs",    "usbdevfs",    "tmpfs",    "shm",#endif#ifdef solaris2    "mntfs",    "proc",    "fd",#endif    0};intGet_Next_HR_FileSys(void){#if HAVE_GETFSSTAT    if (HRFS_index >= fscount)        return -1;    HRFS_entry = fsstats + HRFS_index;    return ++HRFS_index;#else    const char    **cpp;    if (fp == NULL)        return -1;#ifdef solaris2    if (getmntent(fp, HRFS_entry) != 0)        return -1;#else    HRFS_entry = getmntent(fp);    if (HRFS_entry == NULL)        return -1;#endif                          /* solaris2 */    for (cpp = HRFS_ignores; *cpp != NULL; ++cpp)        if (!strcmp(HRFS_entry->HRFS_type, *cpp))            return Get_Next_HR_FileSys();    /*     * Try and ensure that index values are persistent     *   at least within a single run of the agent     */    HRFS_index = se_find_value_in_slist("filesys", HRFS_entry->HRFS_name );    if (HRFS_index == SE_DNE) {        HRFS_index = se_find_free_value_in_slist("filesys");        if (HRFS_index == SE_DNE) { HRFS_index = 1; }        se_add_pair_to_slist( "filesys",                              strdup( HRFS_entry->HRFS_name ), HRFS_index);    }    return HRFS_index++;#endif                          /* HAVE_GETFSSTAT */}/* * this function checks whether the current file system (info can be found * in HRFS_entry) is a NFS file system * HRFS_entry must be valid prior to calling this function * returns 1 if NFS file system, 0 otherwise */intCheck_HR_FileSys_NFS (void){#if HAVE_GETFSSTAT#if defined(MFSNAMELEN)    if (!strcmp(HRFS_entry->HRFS_type, MOUNT_NFS))#else    if (HRFS_entry->HRFS_type == MOUNT_NFS)#endif#else /* HAVE_GETFSSTAT */    if ( HRFS_entry->HRFS_type != NULL && (#if defined(MNTTYPE_NFS)	!strcmp( HRFS_entry->HRFS_type, MNTTYPE_NFS) ||#else	!strcmp( HRFS_entry->HRFS_type, "nfs") ||#endif#if defined(MNTTYPE_NFS3)	    !strcmp( HRFS_entry->HRFS_type, MNTTYPE_NFS3) ||#endif#if defined(MNTTYPE_SMBFS)	    !strcmp( HRFS_entry->HRFS_type, MNTTYPE_SMBFS) ||#endif#if defined(MNTTYPE_LOFS)	    !strcmp( HRFS_entry->HRFS_type, MNTTYPE_LOFS) ||#endif	    /*	     * MVFS is Rational ClearCase's view file system	     * it is similiar to NFS file systems in that it is mounted	     * locally or remotely from the ClearCase server	     */	    !strcmp( HRFS_entry->HRFS_type, "mvfs")))#endif /* HAVE_GETFSSTAT */	return 1;	/* NFS file system */    return 0;		/* no NFS file system */}voidEnd_HR_FileSys(void){#ifdef HAVE_GETFSSTAT    if (fsstats)        free((char *) fsstats);    fsstats = NULL;#else    if (fp != NULL)        fclose(fp);    fp = NULL;#endif}static u_char  *when_dumped(char *filesys, int level, size_t * length){    time_t          dumpdate = 0, tmp;    FILE           *dump_fp;    char            line[1024];    char           *cp1, *cp2, *cp3;    /*     * Look for the relevent entries in /etc/dumpdates     *     * This is complicated by the fact that disks are     *   mounted using block devices, but dumps are     *   done via the raw character devices.     * Thus the device names in /etc/dumpdates and     *   /etc/mnttab don't match.     *   These comparisons are therefore made using the     *   final portion of the device name only.     */    if (*filesys == '\0')       /* No filesystem name? */        return date_n_time(NULL, length);    cp1 = strrchr(filesys, '/');        /* Find the last element of the current FS */    if (cp1 == NULL)        cp1 = filesys;    if ((dump_fp = fopen("/etc/dumpdates", "r")) == NULL)        return date_n_time(NULL, length);    while (fgets(line, sizeof(line), dump_fp) != NULL) {        cp2 = strchr(line, ' ');        /* Start by looking at the device name only */        if (cp2 != NULL) {            *cp2 = '\0';            cp3 = strrchr(line, '/');   /* and find the last element */            if (cp3 == NULL)                cp3 = line;            if (strcmp(cp1, cp3) != 0)  /* Wrong FS */                continue;            ++cp2;            while (isspace(*cp2))                ++cp2;          /* Now find the dump level */            if (level == FULL_DUMP) {                if (*(cp2++) != '0')                    continue;   /* Not interested in partial dumps */                while (isspace(*cp2))                    ++cp2;                dumpdate = ctime_to_timet(cp2);                fclose(dump_fp);                return date_n_time(&dumpdate, length);            } else {            /* Partial Dump */                if (*(cp2++) == '0')                    continue;   /* Not interested in full dumps */                while (isspace(*cp2))                    ++cp2;                tmp = ctime_to_timet(cp2);                if (tmp > dumpdate)                    dumpdate = tmp;     /* Remember the 'latest' partial dump */            }        }    }    fclose(dump_fp);    return date_n_time(&dumpdate, length);}#define RAW_DEVICE_PREFIX	"/dev/rdsk"#define COOKED_DEVICE_PREFIX	"/dev/dsk"char           *cook_device(char *dev){    static char     cooked_dev[SNMP_MAXPATH+1];    if (!strncmp(dev, RAW_DEVICE_PREFIX, strlen(RAW_DEVICE_PREFIX))) {        strncpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev)-1);        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;        strncat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX),                sizeof(cooked_dev)-strlen(cooked_dev)-1);        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;    } else {        strncpy(cooked_dev, dev, sizeof(cooked_dev)-1);        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;    }    return (cooked_dev);}intGet_FSIndex(char *dev){    int             iindex;    Init_HR_FileSys();    while ((iindex = Get_Next_HR_FileSys()) != -1)        if (!strcmp(HRFS_entry->HRFS_name, cook_device(dev))) {            End_HR_FileSys();            return iindex;        }    End_HR_FileSys();    return 0;}longGet_FSSize(char *dev){    struct HRFS_statfs statfs_buf;    Init_HR_FileSys();    while (Get_Next_HR_FileSys() != -1)        if (!strcmp(HRFS_entry->HRFS_name, cook_device(dev))) {            End_HR_FileSys();            if (HRFS_statfs(HRFS_entry->HRFS_mount, &statfs_buf) != -1)  		/*  		 * with large file systems the following calculation produces  		 * an overflow:  		 * (statfs_buf.f_blocks*statfs_buf.f_bsize)/1024  		 *  		 * assumption: f_bsize is either 512 or a multiple of 1024  		 * in case of 512 (f_blocks/2) is returned  		 * otherwise (f_blocks*(f_bsize/1024)) is returned  		 */#if defined(solaris2) && defined(STRUCT_STATVFS_HAS_F_FRSIZE)                return (statfs_buf.f_blocks*(statfs_buf.f_frsize/1024));#else  		if (statfs_buf.f_bsize == 512)  		    return (statfs_buf.f_blocks/2);                else  		    return (statfs_buf.f_blocks*(statfs_buf.f_bsize/1024));#endif            else                return -1;        }    End_HR_FileSys();    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -