|
Maps a devfs path to the corresponding standard dev path
- Parameters:
-
| path | an existing device |
| ret | device |
| len | len of ret |
00042 {
00043 static struct entry
00044 {
00045 unsigned char major;
00046 unsigned char minor;
00047 char *name;
00048 enum { ENTRY_TYPE_ONE, ENTRY_TYPE_NUMBER, ENTRY_TYPE_DISC, ENTRY_TYPE_DISC_ARRAY } type;
00049 unsigned char entry_first;
00050 unsigned char entry_disc_minor_shift;
00051 enum { FORMAT_DEFAULT, FORMAT_NOCONTROLLER } format;
00052 }
00053 entries[] =
00054 {
00055
00056
00057
00058
00059
00060 { 2, 0, "fd", ENTRY_TYPE_NUMBER, 0, 0, FORMAT_DEFAULT },
00061 { 3, 0, "hd", ENTRY_TYPE_DISC, 0, 6, FORMAT_DEFAULT },
00062 { 4, 64, "ttyS", ENTRY_TYPE_NUMBER, 0, 0, FORMAT_DEFAULT },
00063 { 4, 0, "tty", ENTRY_TYPE_NUMBER, 0, 0, FORMAT_DEFAULT },
00064 { 8, 0, "sd", ENTRY_TYPE_DISC, 0, 4, FORMAT_DEFAULT },
00065 { 9, 0, "md", ENTRY_TYPE_NUMBER, 0, 0, FORMAT_DEFAULT },
00066 { 11, 0, "scd", ENTRY_TYPE_NUMBER, 0, 0, FORMAT_DEFAULT },
00067 { 22, 0, "hd", ENTRY_TYPE_DISC, 2, 6, FORMAT_DEFAULT },
00068 { 33, 0, "hd", ENTRY_TYPE_DISC, 4, 6, FORMAT_DEFAULT },
00069 { 34, 0, "hd", ENTRY_TYPE_DISC, 6, 6, FORMAT_DEFAULT },
00070 { 48, 0, "rd", ENTRY_TYPE_DISC_ARRAY, 0, 3, FORMAT_DEFAULT },
00071 { 49, 0, "rd", ENTRY_TYPE_DISC_ARRAY, 1, 3, FORMAT_DEFAULT },
00072 { 50, 0, "rd", ENTRY_TYPE_DISC_ARRAY, 2, 3, FORMAT_DEFAULT },
00073 { 51, 0, "rd", ENTRY_TYPE_DISC_ARRAY, 3, 3, FORMAT_DEFAULT },
00074 { 52, 0, "rd", ENTRY_TYPE_DISC_ARRAY, 4, 3, FORMAT_DEFAULT },
00075 { 53, 0, "rd", ENTRY_TYPE_DISC_ARRAY, 5, 3, FORMAT_DEFAULT },
00076 { 54, 0, "rd", ENTRY_TYPE_DISC_ARRAY, 6, 3, FORMAT_DEFAULT },
00077 { 55, 0, "rd", ENTRY_TYPE_DISC_ARRAY, 7, 3, FORMAT_DEFAULT },
00078 { 56, 0, "hd", ENTRY_TYPE_DISC, 8, 6, FORMAT_DEFAULT },
00079 { 57, 0, "hd", ENTRY_TYPE_DISC, 10, 6, FORMAT_DEFAULT },
00080 { 65, 0, "sd", ENTRY_TYPE_DISC, 16, 4, FORMAT_DEFAULT },
00081 { 66, 0, "sd", ENTRY_TYPE_DISC, 32, 4, FORMAT_DEFAULT },
00082 { 67, 0, "sd", ENTRY_TYPE_DISC, 48, 4, FORMAT_DEFAULT },
00083 { 68, 0, "sd", ENTRY_TYPE_DISC, 64, 4, FORMAT_DEFAULT },
00084 { 69, 0, "sd", ENTRY_TYPE_DISC, 80, 4, FORMAT_DEFAULT },
00085 { 70, 0, "sd", ENTRY_TYPE_DISC, 96, 4, FORMAT_DEFAULT },
00086 { 71, 0, "sd", ENTRY_TYPE_DISC, 112, 4, FORMAT_DEFAULT },
00087 { 72, 0, "ida", ENTRY_TYPE_DISC_ARRAY, 0, 4, FORMAT_DEFAULT },
00088 { 73, 0, "ida", ENTRY_TYPE_DISC_ARRAY, 1, 4, FORMAT_DEFAULT },
00089 { 74, 0, "ida", ENTRY_TYPE_DISC_ARRAY, 2, 4, FORMAT_DEFAULT },
00090 { 75, 0, "ida", ENTRY_TYPE_DISC_ARRAY, 3, 4, FORMAT_DEFAULT },
00091 { 76, 0, "ida", ENTRY_TYPE_DISC_ARRAY, 4, 4, FORMAT_DEFAULT },
00092 { 77, 0, "ida", ENTRY_TYPE_DISC_ARRAY, 5, 4, FORMAT_DEFAULT },
00093 { 78, 0, "ida", ENTRY_TYPE_DISC_ARRAY, 6, 4, FORMAT_DEFAULT },
00094 { 79, 0, "ida", ENTRY_TYPE_DISC_ARRAY, 7, 4, FORMAT_DEFAULT },
00095 { 88, 0, "hd", ENTRY_TYPE_DISC, 12, 6, FORMAT_DEFAULT },
00096 { 89, 0, "hd", ENTRY_TYPE_DISC, 14, 6, FORMAT_DEFAULT },
00097 { 90, 0, "hd", ENTRY_TYPE_DISC, 16, 6, FORMAT_DEFAULT },
00098 { 91, 0, "hd", ENTRY_TYPE_DISC, 18, 6, FORMAT_DEFAULT },
00099 { 94, 0, "dasd", ENTRY_TYPE_DISC, 0, 2, FORMAT_DEFAULT },
00100 { 104, 0, "cciss", ENTRY_TYPE_DISC_ARRAY, 0, 4, FORMAT_DEFAULT },
00101 { 105, 0, "cciss", ENTRY_TYPE_DISC_ARRAY, 1, 4, FORMAT_DEFAULT },
00102 { 106, 0, "cciss", ENTRY_TYPE_DISC_ARRAY, 2, 4, FORMAT_DEFAULT },
00103 { 107, 0, "cciss", ENTRY_TYPE_DISC_ARRAY, 3, 4, FORMAT_DEFAULT },
00104 { 108, 0, "cciss", ENTRY_TYPE_DISC_ARRAY, 4, 4, FORMAT_DEFAULT },
00105 { 109, 0, "cciss", ENTRY_TYPE_DISC_ARRAY, 5, 4, FORMAT_DEFAULT },
00106 { 110, 0, "cciss", ENTRY_TYPE_DISC_ARRAY, 6, 4, FORMAT_DEFAULT },
00107 { 111, 0, "cciss", ENTRY_TYPE_DISC_ARRAY, 7, 4, FORMAT_DEFAULT },
00108 { 114, 0, "ataraid", ENTRY_TYPE_DISC_ARRAY, 0, 4, FORMAT_NOCONTROLLER },
00109 { 0, 0, NULL, ENTRY_TYPE_ONE, 0, 0, FORMAT_DEFAULT },
00110 };
00111
00112 struct stat s;
00113 struct entry *e;
00114
00115 ssize_t ret = 0;
00116
00117 unsigned int disc;
00118 unsigned int part;
00119
00120 if (!strcmp ( "none", path))
00121 return snprintf (buf, n, "%s", path);
00122
00123 if (stat (path,&s) == -1)
00124 return 0;
00125
00126 e = entries;
00127 while (e->name != NULL) {
00128 if (major (s.st_rdev) == e->major &&
00129 ((e->type == ENTRY_TYPE_ONE && minor (s.st_rdev) == e->minor) ||
00130 (e->type != ENTRY_TYPE_ONE && minor (s.st_rdev) >= e->minor))) {
00131 break;
00132 }
00133 e++;
00134 }
00135 if (!e->name) {
00136 #ifdef TEST
00137 fprintf(stderr, "(unknown device)\n");
00138 #endif
00139
00140 return snprintf (buf, n, "%s", path);
00141 }
00142
00143 strcat (buf, "/dev/");
00144
00145 switch (e->type)
00146 {
00147 case ENTRY_TYPE_ONE:
00148 ret = di_snprintfcat (buf, n, "%s", e->name);
00149 break;
00150
00151 case ENTRY_TYPE_NUMBER:
00152 disc = minor (s.st_rdev) - e->minor + e->entry_first;
00153
00154 ret = di_snprintfcat (buf, n, "%s%d", e->name, disc);
00155 break;
00156
00157 case ENTRY_TYPE_DISC:
00158 case ENTRY_TYPE_DISC_ARRAY:
00159 disc = (minor (s.st_rdev) >> e->entry_disc_minor_shift);
00160 part = (minor (s.st_rdev) & ((1 << e->entry_disc_minor_shift) - 1));
00161
00162 switch (e->type)
00163 {
00164 case ENTRY_TYPE_DISC:
00165 disc += e->entry_first;
00166
00167 if (disc + 'a' > 'z')
00168 {
00169 disc -= 26;
00170 ret = di_snprintfcat (buf, n, "%s%c%c", e->name, 'a' + disc / 26, 'a' + disc % 26);
00171 }
00172 else
00173 ret = di_snprintfcat (buf, n, "%s%c", e->name, 'a' + disc);
00174
00175 if (part)
00176 ret = di_snprintfcat (buf, n, "%d", part);
00177
00178 break;
00179 case ENTRY_TYPE_DISC_ARRAY:
00180 if (e->format == FORMAT_DEFAULT)
00181 ret = di_snprintfcat (buf, n, "%s/c%dd%d", e->name, e->entry_first, disc);
00182 else if (e->format == FORMAT_NOCONTROLLER)
00183 ret = di_snprintfcat (buf, n, "%s/d%d", e->name, disc);
00184
00185 if (part)
00186 ret = di_snprintfcat (buf, n, "p%d", part);
00187
00188 break;
00189 default:
00190 break;
00191 }
00192 break;
00193 };
00194
00195 return ret;
00196 }
|