diff options
author | Miles Bader <miles@gnu.org> | 1995-04-07 19:51:39 +0000 |
---|---|---|
committer | Miles Bader <miles@gnu.org> | 1995-04-07 19:51:39 +0000 |
commit | 56e4296b88e48eefa1594219d416954d7b57b4de (patch) | |
tree | b144ff2faf888e303935576083e0990eee22da47 /libps/tty.c | |
parent | 44c033fee5eebb8010fcd72ee0d5020958220ce3 (diff) |
(ps_tty_short_name): New function; functionality used to be in spec.c.
(ps_tty_create, ps_tty_free): Add short_name fields.
Tighten up types used (i.e., don't use int for everything).
Diffstat (limited to 'libps/tty.c')
-rw-r--r-- | libps/tty.c | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/libps/tty.c b/libps/tty.c index 3e20e267..53dfcc8b 100644 --- a/libps/tty.c +++ b/libps/tty.c @@ -21,6 +21,7 @@ #include <hurd.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <assert.h> #include <hurd/term.h> @@ -40,6 +41,8 @@ ps_tty_create(file_t port, ps_tty_t *tty) (*tty)->port = port; (*tty)->name_state = PS_TTY_NAME_PENDING; + (*tty)->short_name = NULL; + (*tty)->short_name_alloced = FALSE; return 0; } @@ -51,6 +54,8 @@ ps_tty_free(ps_tty_t tty) mach_port_deallocate(mach_task_self(), tty->port); if (tty->name_state == PS_TTY_NAME_OK && tty->name != NULL) free(tty->name); + if (tty->short_name_alloced) + free(tty->short_name); free(tty); } @@ -63,7 +68,7 @@ char *ps_tty_name(ps_tty_t tty) { string_t buf; - if (term_get_nodename(tty->port, &buf) != 0) + if (term_get_nodename(tty->port, buf) != 0) /* There is a terminal there, but we can't figure out its name. */ tty->name_state = PS_TTY_NAME_ERROR; else @@ -84,3 +89,67 @@ char *ps_tty_name(ps_tty_t tty) else return NULL; } + +/* ---------------------------------------------------------------- */ + +struct ps_tty_abbrev +{ + char *pfx; + char *subst; +}; + +struct ps_tty_abbrev ps_tty_abbrevs[] = +{ + { "/tmp/console", "oc" }, /* temp hack */ + { "/dev/console", "co"}, + { "/dev/tty", ""}, + { "/dev/pty", ""}, + { "/dev/", ""}, + { 0 } +}; + +/* Returns the standard abbreviated name of the tty, the whole name if there + is no standard abbreviation, or NULL if it can't be figured out. */ +char * +ps_tty_short_name(ps_tty_t tty) +{ + if (tty->short_name != NULL) + return tty->short_name; + else + { + struct ps_tty_abbrev *abbrev; + char *name = ps_tty_name(tty); + + if (name) + for (abbrev = ps_tty_abbrevs; abbrev->pfx != NULL; abbrev++) + { + char *subst = abbrev->subst; + unsigned pfx_len = strlen(abbrev->pfx); + + if (strncmp(name, abbrev->pfx, pfx_len) == 0) + { + if (name[pfx_len] == '\0') + tty->short_name = abbrev->subst; + else if (subst[0] = '\0') + tty->short_name = name + pfx_len; + else + { + tty->short_name = + malloc(strlen(subst) + strlen(name + pfx_len)); + if (tty->short_name) + { + tty->short_name_alloced = TRUE; + strcpy(tty->short_name, subst); + strcat(tty->short_name, name + pfx_len); + } + } + break; + } + } + + if (tty->short_name == NULL) + tty->short_name = name; + + return tty->short_name; + } +} |