diff options
Diffstat (limited to 'utils/old-settrans.c')
-rw-r--r-- | utils/old-settrans.c | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/utils/old-settrans.c b/utils/old-settrans.c index 32a7494d..4d1ba167 100644 --- a/utils/old-settrans.c +++ b/utils/old-settrans.c @@ -22,24 +22,63 @@ #include <string.h> #include <errno.h> #include <stdio.h> +#include <fcntl.h> int main (int argc, char **argv) { - /* This is pretty kludgy for now */ + /* This is pretty kludgy for now. */ mach_port_t file; char *buf, *bp; int buflen; int i; - file = file_name_lookup (argv[1], 0, 0); + if (argc < 2) + { + fprintf (stderr, "\ +Usage: %s FILE TRANSLATOR [ARG ...]\n\ + or: %s FILE -show\n", argv[0], argv[0]); + exit (1); + } + + /* Use the O_NOTRANS flag so that we replace any existing + translator rather than piggybacking on top of it. */ + file = file_name_lookup (argv[1], O_NOTRANS, 0); if (file == MACH_PORT_NULL) { perror (argv[1]); exit (1); } + if (argc == 3 && !strcmp (argv[2], "-show")) + { + char buf[1024], *trans = buf; + unsigned int len = sizeof buf; + errno = file_get_translator (file, &trans, &len); + if (errno) + { + perror ("file_get_translator"); + exit (1); + } + printf ("%s translated by:", argv[1]); + do + { + char *next; + printf (" %.*s", (int) len, trans); + next = memchr (trans, '\0', len); + if (! next) + { + printf ("<unterminated>"); + break; + } + len -= ++next - trans; + trans = next; + } while (len > 0); + putchar ('\n'); + exit (0); + } + buflen = 0; for (i = 2; i < argc; i++) buflen += strlen (argv[i]) + 1; @@ -49,7 +88,7 @@ main (int argc, char **argv) for (i = 2; i < argc; i++) bp = stpcpy (bp, argv[i]) + 1; - errno = file_set_translator (file, FS_TRANS_SET|FS_TRANS_EXCL, 0, 0, + errno = file_set_translator (file, FS_TRANS_SET, 0, 0, buf, buflen, MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND); if (errno != 0) |