11 typedef struct Mount Mount;
22 void xlatemnt(Mount*);
30 fprint(2, "usage: ns [-r] [pid]\n");
35 main(int argc, char **argv)
39 char buf[1024], *av[5];
58 Binit(&stdout, 1, OWRITE);
60 sprint(buf, "/proc/%d/ns", pid);
61 fd = open(buf, OREAD);
63 fprint(2, "ns: open %s: %r\n", buf);
67 for(line=1; ; line++) {
68 n = read(fd, buf, sizeof(buf));
69 if(n == sizeof(buf)) {
70 fprint(2, "ns: ns string too long\n");
74 fprint(2, "ns: read %r\n");
81 m = mallocz(sizeof(Mount), 1);
83 fprint(2, "ns: no memory: %r\n");
87 n = tokenize(buf, av, 5);
90 if(strcmp(av[0], "cd") == 0){
91 Bprint(&stdout, "%s %s\n", av[0], quote(av[1]));
96 fprint(2, "ns: unrecognized format of ns file: %d elements on line %d\n", n, line);
99 m->cmd = strdup(av[0]);
100 m->flag = strdup(av[1]);
101 m->new = strdup(av[2]);
102 m->old = strdup(av[3]);
103 m->spec = strdup(av[4]);
107 m->cmd = strdup(av[0]);
108 m->flag = strdup(av[1]);
109 m->new = strdup(av[2]);
110 m->old = strdup(av[3]);
111 m->spec = strdup("");
113 m->cmd = strdup(av[0]);
114 m->flag = strdup("");
115 m->new = strdup(av[1]);
116 m->old = strdup(av[2]);
117 m->spec = strdup(av[3]);
121 m->cmd = strdup(av[0]);
122 m->flag = strdup("");
123 m->new = strdup(av[1]);
124 m->old = strdup(av[2]);
125 m->spec = strdup("");
129 if(!rflag && strcmp(m->cmd, "mount")==0)
132 Bprint(&stdout, "%s %s %s %s %s\n", m->cmd, m->flag,
133 quote(m->new), quote(m->old), quote(m->spec));
150 char *s, *t, *net, *port;
153 if(strncmp(m->new, "/net/", 5) != 0)
158 for(t=net; *t!='/'; t++)
163 for(t=port; *t!='/'; t++)
167 if(strcmp(t+1, "data") != 0)
169 snprint(buf, sizeof buf, "/net/%s/%s/remote", net, port);
170 fd = open(buf, OREAD);
173 n = read(fd, buf, sizeof buf);
175 if(n<=1 || n>sizeof buf)
180 t = malloc(strlen(net)+1+n+1);
183 sprint(t, "%s!%s", net, buf);
194 static char buf[3][1024];
198 if(strpbrk(s, " '\\\t#$") == nil)