获取solaris 11.2机器上安装的卷列表

时间:2014-10-07 19:13:17

标签: c filesystems solaris mount

我使用以下代码作为参考来获取Solaris 11.2计算机的卷列表:

#include <time.h>
#include <sys/mntent.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/vfs.h>
#include <errno.h>


struct mntent
  {
char *mnt_fsname;       /* Device or server for filesystem.  */
char *mnt_dir;      /* Directory mounted on.  */
char *mnt_type;     /* Type of filesystem: ufs, nfs, etc.  */
char *mnt_opts;     /* Comma-separated options for fs.  */
int mnt_freq;       /* Dump frequency (in days).  */
int mnt_passno;     /* Pass number for `fsck'.  */
};

char ** getVolumeList(int * size)
{
char ** volList = NULL;
int listLen = 0;
char tmp[1024];
struct mntent* vp ; 
FILE *fp=fopen("/etc/mnttab", "r");
int result;
printf("in getVolumeList\n");
printf("coming here 1\n");
volList = (char **) malloc(sizeof(char*) *  (*size));
printf("coming here \n");

vp = getmntent(fp);
    if (vp == NULL)
      printf("vp is null");
  result = getmntent(fp,vp);
  if(result == -1)
{
  printf ("getmntent returned:%d. Hence breaking from loop\n", result);
}

/*
   ignore all entries for which mount options is set to ignore
   these don't show up in dk -k also although dk -a shows them
  */

  if(vp->mnt_dir != NULL)
    {
      strcpy(tmp,vp->mnt_dir);
                   volList[listLen] = (char*) malloc(sizeof(char) * (strlen(tmp)+1));
                    strcpy(volList[listLen], tmp);
    listLen++;
  }
  else
{
  printf("\nmountp is NULL \n");
}



printf("freeing vp\n");

    if (vp != NULL)
    {
  free(vp);
    }
    if (fp != NULL)
    {
  fclose(fp);
    }

*size = listLen;
 printf("returning from getVolumeList\n");

return volList;

}

但这似乎引发了以下seg错误:

     #0  0xfe663923 in getmntent_compat () from /lib/libc.so.1

我猜这是因为solaris 11.2上的mntent.h没有定义struct mntent或者头文件中有以下方法签名: getmntent(); getmntent(FP,VP)

是否有任何其他等效方法来确定安装在solaris计算机上的卷,或者更好的是一种独立于操作系统的方法来确定当前安装的卷?

P.S。我是C的新手。

1 个答案:

答案 0 :(得分:2)

代码中存在一些不同的错误。沿着这些方向的东西可能会起作用:

#include <stdio.h>
#include <mntent.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

/* Return a NULL-terminated list of filesystem mountpoints, or NULL on error.
 * The individual strings in the result need to be freed,
 * as does the result array.
 */
char **getVolumeList(void)
{
    char **res = NULL;
    int allocated = 1;
    int size = 0;
    struct mntent *ent;

    FILE *fp = setmntent("/etc/mnttab", "r");

    if( !fp ) return NULL;

    while( (ent=getmntent(fp)) )
    {
       if(allocated <= size+1)
       {
         allocated *= 2;
         res = realloc(res, sizeof(char*)*allocated );
         if( !res ) return NULL;
       }
       res[size++] = strdup( ent->mnt_dir );
       res[size] = NULL;
    }
    endmntent(fp);
    return res;
}

此函数返回动态大小的空终止数组,该数组至少从代码中删除硬编码限制。

崩溃的实际原因可能是你没有使用正确的方法来打开文件,getmntent()需要一些额外的存储来完成它的工作(与getmntent_r不同,你负责的是创建存储空间)

此外,您不应释放getmntent返回的存储空间,因为它被记录为静态存储。

上面的函数将按以下方式使用:

int main(int argc, char **argv)
{
    int i;
    char ** list = getVolumeList();
    if(!list)
    {
       fprintf(stderr, "failed to get list\n");
       return 1;
    }

    for(int i=0; list[i]; i++ )
    {
      fprintf( stdout, "%d: %s\n", i, list[i]; );
      free( list[i] );
    }
    free( list );
}