summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--utils/old-settrans.c45
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)