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

📄 hr_filesys.c

📁 非常不错的网管开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
	    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))			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	    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 HAVE_GETFSSTAT	    long_return = HRFS_entry->f_flags & MNT_RDONLY ? 2 : 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;		/* Use the same indices */	    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));    HRFS_index = 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	"autofs",	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;		/*		 * XXX - According to RFC 1514, hrFSIndex must		 *   "remain constant at least from one re-initialization		 *    of the agent to the next re-initialization."		 *		 *  This simple-minded counter doesn't handle filesystems		 *    being un-mounted and re-mounted.		 *  Options for fixing this include:		 *       - keeping a history of previous indices used		 *       - calculating the index from filesystem		 *		specific information		 *		 *  Note: this index is also used as hrStorageIndex		 *     which is assumed to be less than HRS_TYPE_FS_MAX		 *     This assumption may well be broken if the second		 *     option above is followed.  Consider indexing the		 *     non-filesystem-based storage entries first in this		 *     case, and assume hrStorageIndex > HRS_TYPE_FS_MIN		 *     (for file-system based storage entries)		 *		 *  But at least this gets us started.		 */    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();    return HRFS_index++;#endif /* HAVE_GETFSSTAT */}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[100];    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[MAXPATHLEN];    if ( !strncmp( dev, RAW_DEVICE_PREFIX, strlen(RAW_DEVICE_PREFIX))) {	strcpy( cooked_dev, COOKED_DEVICE_PREFIX );	strcat( cooked_dev, dev+strlen(RAW_DEVICE_PREFIX) );    }    else	strcpy( cooked_dev, dev );    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 -1;}intGet_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 )	        return (statfs_buf.f_blocks*statfs_buf.f_bsize)/1024;	    else		return -1;	}    End_HR_FileSys();    return -1;}

⌨️ 快捷键说明

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