2012-02-24 3 views
2

カーネルのコマンドラインroot=mtd:nameでMTDデバイスを名前で指定し、名前mount mtd:nameでマウントすることができます。私は私のアプリが同じことをすることができるようにしたい。それは開いて呼び出す必要がありますが、open("mtd:name", ...)はそのようなファイルまたはディレクトリで失敗します。openの呼び出しで/ dev/mtd#の代わりにmtd:nameを指定してください

どのように 'mtd:name'から '/ dev/mtd#'になるのですか?

これは、私はそれが他の誰かに便利だ場合に思い付いたコードである

更新しました。

int mtd_lookup_minor(const char * mtdname) 
{ 
    int minor; 
    unsigned int size, erasesize; 
    char name[65]; 
    char line[128]; 

    if (mtdname == NULL) 
    { 
     errno = EINVAL; 
     return -1; 
    } 

    FILE * fp = fopen("/proc/mtd", "r"); 
    if (fp == NULL) 
     return -1; 

    while (fgets(line, sizeof(line), fp)) 
    { 
     if (sscanf(line, "mtd%d: %x %x \"%64[^\"]\"", &minor, &size, &erasesize, name) == 4 && strcmp(name, mtdname) == 0) 
     { 
      fclose(fp); 
      return minor; 
     } 
    } 

    fclose(fp); 
    errno = ENODEV; 
    return -1; 
} 

/* 
* mtd_open_char allows specifying "mtd:name" instead of /dev/mtd# 
* to refer to the MTD char device by name. 
*/ 
int mtd_open_char(const char * mtdpath, int oflag) 
{ 
    int minor; 
    char pathbuffer[16]; 

    if (mtdpath == NULL) 
    { 
     errno = EINVAL; 
     return -1; 
    } 

    if (strlen(mtdpath) > 4 && strncmp(mtdpath, "mtd:", 4) == 0) 
    { 
     minor = mtd_lookup_minor(mtdpath + 4); 
     if (minor < 0 || minor > 9999999) // paranoia fit into pathbuffer 
     { 
      errno = ENODEV; 
      return -1; 
     } 

     sprintf(pathbuffer, "/dev/mtd%d", minor); 
     mtdpath = pathbuffer; 
    } 

    return open(mtdpath, oflag); 
} 

答えて

1

/proc/mtdでMTDの名前とデバイスを検索できます。

+0

はい、私はファイルを解析する必要はないと考えていました。 – Tergiver

+0

これはあなたがしなければならないことです。 – duskwuff

関連する問題