| 1316 | } |
| 1317 | |
| 1318 | static int |
| 1319 | sysctl_sysctl_name2oid(SYSCTL_HANDLER_ARGS) |
| 1320 | { |
| 1321 | char *p; |
| 1322 | int error, oid[CTL_MAXNAME], len = 0; |
| 1323 | struct sysctl_oid *op = NULL; |
| 1324 | struct rm_priotracker tracker; |
| 1325 | char buf[32]; |
| 1326 | |
| 1327 | if (!req->newlen) |
| 1328 | return (ENOENT); |
| 1329 | if (req->newlen >= MAXPATHLEN) /* XXX arbitrary, undocumented */ |
| 1330 | return (ENAMETOOLONG); |
| 1331 | |
| 1332 | p = buf; |
| 1333 | if (req->newlen >= sizeof(buf)) |
| 1334 | p = malloc(req->newlen+1, M_SYSCTL, M_WAITOK); |
| 1335 | |
| 1336 | error = SYSCTL_IN(req, p, req->newlen); |
| 1337 | if (error) { |
| 1338 | if (p != buf) |
| 1339 | free(p, M_SYSCTL); |
| 1340 | return (error); |
| 1341 | } |
| 1342 | |
| 1343 | p [req->newlen] = '\0'; |
| 1344 | |
| 1345 | SYSCTL_RLOCK(&tracker); |
| 1346 | error = name2oid(p, oid, &len, &op); |
| 1347 | SYSCTL_RUNLOCK(&tracker); |
| 1348 | |
| 1349 | if (p != buf) |
| 1350 | free(p, M_SYSCTL); |
| 1351 | |
| 1352 | if (error) |
| 1353 | return (error); |
| 1354 | |
| 1355 | error = SYSCTL_OUT(req, oid, len * sizeof *oid); |
| 1356 | return (error); |
| 1357 | } |
| 1358 | |
| 1359 | /* |
| 1360 | * XXXRW/JA: Shouldn't return name2oid data for nodes that we don't permit in |