* sysctl_kern_console() provides output parseable in conscontrol(1). */
| 314 | * sysctl_kern_console() provides output parseable in conscontrol(1). |
| 315 | */ |
| 316 | static int |
| 317 | sysctl_kern_console(SYSCTL_HANDLER_ARGS) |
| 318 | { |
| 319 | struct cn_device *cnd; |
| 320 | struct consdev *cp, **list; |
| 321 | char *p; |
| 322 | int delete, error; |
| 323 | struct sbuf *sb; |
| 324 | |
| 325 | sb = sbuf_new(NULL, NULL, CNDEVPATHMAX * 2, SBUF_AUTOEXTEND | |
| 326 | SBUF_INCLUDENUL); |
| 327 | if (sb == NULL) |
| 328 | return (ENOMEM); |
| 329 | sbuf_clear(sb); |
| 330 | STAILQ_FOREACH(cnd, &cn_devlist, cnd_next) |
| 331 | sbuf_printf(sb, "%s,", cnd->cnd_cn->cn_name); |
| 332 | sbuf_printf(sb, "/"); |
| 333 | SET_FOREACH(list, cons_set) { |
| 334 | cp = *list; |
| 335 | if (cp->cn_name[0] != '\0') |
| 336 | sbuf_printf(sb, "%s,", cp->cn_name); |
| 337 | } |
| 338 | sbuf_finish(sb); |
| 339 | error = sysctl_handle_string(oidp, sbuf_data(sb), sbuf_len(sb), req); |
| 340 | if (error == 0 && req->newptr != NULL) { |
| 341 | p = sbuf_data(sb); |
| 342 | error = ENXIO; |
| 343 | delete = 0; |
| 344 | if (*p == '-') { |
| 345 | delete = 1; |
| 346 | p++; |
| 347 | } |
| 348 | SET_FOREACH(list, cons_set) { |
| 349 | cp = *list; |
| 350 | if (strcmp(p, cp->cn_name) != 0) |
| 351 | continue; |
| 352 | if (delete) { |
| 353 | cnremove(cp); |
| 354 | error = 0; |
| 355 | } else { |
| 356 | error = cnadd(cp); |
| 357 | if (error == 0) |
| 358 | cnselect(cp); |
| 359 | } |
| 360 | break; |
| 361 | } |
| 362 | } |
| 363 | sbuf_delete(sb); |
| 364 | return (error); |
| 365 | } |
| 366 | |
| 367 | SYSCTL_PROC(_kern, OID_AUTO, console, |
| 368 | CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_NEEDGIANT, 0, 0, |
nothing calls this directly
no test coverage detected