7 #pragma varargck type "P" char*
13 typedef struct Mount Mount;
24 void xlatemnt(Mount*);
32 fprint(2, "usage: ns [-r] [pid]\n");
37 main(int argc, char **argv)
41 char buf[1024], *av[5];
60 Binit(&stdout, 1, OWRITE);
62 sprint(buf, "/proc/%d/ns", pid);
63 fd = open(buf, OREAD);
65 fprint(2, "ns: open %s: %r\n", buf);
69 for(line=1; ; line++) {
70 n = read(fd, buf, sizeof(buf));
71 if(n == sizeof(buf)) {
72 fprint(2, "ns: ns string too long\n");
76 fprint(2, "ns: read %r\n");
83 m = mallocz(sizeof(Mount), 1);
85 fprint(2, "ns: no memory: %r\n");
89 n = tokenize(buf, av, 5);
92 if(strcmp(av[0], "cd") == 0){
93 Bprint(&stdout, "%s %s\n", av[0], av[1]);
98 fprint(2, "ns: unrecognized format of ns file: %d elements on line %d\n", n, line);
101 m->cmd = strdup(av[0]);
102 m->flag = strdup(av[1]);
103 m->new = strdup(av[2]);
104 m->old = strdup(av[3]);
105 m->spec = strdup(av[4]);
109 m->cmd = strdup(av[0]);
110 m->flag = strdup(av[1]);
111 m->new = strdup(av[2]);
112 m->old = strdup(av[3]);
113 m->spec = strdup("");
115 m->cmd = strdup(av[0]);
116 m->flag = strdup("");
117 m->new = strdup(av[1]);
118 m->old = strdup(av[2]);
119 m->spec = strdup(av[3]);
123 m->cmd = strdup(av[0]);
124 m->flag = strdup("");
125 m->new = strdup(av[1]);
126 m->old = strdup(av[2]);
127 m->spec = strdup("");
131 if(!rflag && strcmp(m->cmd, "mount")==0)
134 Bprint(&stdout, "%s %s %s %s %s\n", m->cmd, m->flag,
135 quote(m->new), quote(m->old), quote(m->spec));
152 char *s, *t, *net, *port;
155 if(strncmp(m->new, "/net/", 5) != 0)
160 for(t=net; *t!='/'; t++)
165 for(t=port; *t!='/'; t++)
169 if(strcmp(t+1, "data") != 0)
171 snprint(buf, sizeof buf, "/net/%s/%s/remote", net, port);
172 fd = open(buf, OREAD);
175 n = read(fd, buf, sizeof buf);
177 if(n<=1 || n>sizeof buf)
182 t = malloc(strlen(net)+1+n+1);
185 sprint(t, "%s!%s", net, buf);
196 static char buf[3][1024];
200 if(strpbrk(s, " '\\\t#$") == nil)