Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/cs/vcs_src/mnt_imount.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1990-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
/*
21
* imount: generic interface to Ifs internet service
22
*
23
*/
24
25
#include "mnt_imount.h"
26
27
#include <ctype.h>
28
29
int im_mount();
30
int im_mount_help();
31
int im_umount();
32
int im_umount_help();
33
int im_restart();
34
int im_restart_help();
35
int im_vcs_main();
36
int im_vcs_help();
37
int im_list();
38
int im_list_help();
39
int im_touch();
40
int im_touch_help();
41
int im_help();
42
int im_help_help();
43
int im_bye();
44
int im_system();
45
46
typedef int (*func_t)();
47
struct command_t
48
{
49
int len;
50
char* name;
51
func_t main;
52
func_t help;
53
char* man;
54
};
55
56
#define CMD_MAX 15
57
#define CMD_MASTER "imount"
58
#define ENTRY(s,f,h) {sizeof(s)-1, s, f, h, NULL}
59
60
struct command_t COMMAND[CMD_MAX] =
61
{
62
ENTRY("mount", im_mount, im_mount_help), /* 0 */
63
ENTRY("umount", im_umount, im_umount_help), /* 1 */
64
ENTRY("list", im_list, im_list_help), /* 2 */
65
ENTRY("connect",im_vcs_main, im_vcs_help), /* 3 */
66
ENTRY("kill", im_vcs_main, im_vcs_help), /* 4 */
67
ENTRY("reset", im_restart, im_restart_help), /* 5 */
68
ENTRY("version",im_vcs_main, im_vcs_help), /* 6 */
69
ENTRY("rm", im_touch, im_touch_help), /* 7 */
70
ENTRY("log", im_vcs_main, im_vcs_help), /* 8 */
71
ENTRY("cs", im_vcs_main, im_vcs_help), /* 9 */
72
ENTRY("!", im_system, NULL), /* 10 */
73
ENTRY("sh", im_system, NULL), /* 11 */
74
ENTRY("help", im_help, im_help_help), /* 12 */
75
ENTRY("quit", im_bye, NULL), /* 13 */
76
ENTRY("exit", im_bye, NULL), /* 14 */
77
};
78
79
#define cmdeq(s,i,l) (strncmp(s, COMMAND[i].name, (l<COMMAND[i].len?l:COMMAND[i].len)) == 0)
80
81
struct istate_t istate=
82
{
83
"/dev/tcp/local/vcs/user", /* default cs server */
84
-1, /* fd */
85
NULL, /* hash table */
86
};
87
88
main(argc, argv)
89
int argc;
90
char** argv;
91
{
92
register char* cmd;
93
register int i;
94
register char* s;
95
int ret;
96
char buf[1024];
97
char* elist[20 + 1];
98
int nlist;
99
int n;
100
int fd;
101
int len;
102
int xjade = 0;
103
104
if (cmd = strrchr(argv[0], '/')) cmd++;
105
else cmd = argv[0];
106
107
if (strcmp(cmd, CMD_MASTER))
108
{
109
if (*cmd == 'i') cmd++;
110
len = strlen(cmd);
111
for (i=0; i < CMD_MAX; i++)
112
{
113
if (cmdeq(cmd, i, len))
114
{
115
argv[0] = cmd;
116
ret = (*COMMAND[i].main)(argc, argv);
117
exit(ret);
118
}
119
}
120
}
121
error_info.id = cmd;
122
123
while (n = optget(argv, "hxs:[cs_server]"))
124
switch (n)
125
{
126
case 'h':
127
elist[0] = argv[0];
128
im_help(1, elist);
129
break;
130
case 's':
131
s = opt_info.arg;
132
if ((fd = csopen(s, CS_OPEN_READ)) < 0)
133
printf("cannot connect cs server %s\n", s);
134
else
135
{
136
istate.cs_svc = strdup(s);
137
istate.fd = fd;
138
}
139
break;
140
case 'x':
141
xjade = 1;
142
break;
143
case '?':
144
case ':':
145
printf("im [-s server]\n");
146
break;
147
}
148
149
if (error_info.errors)
150
error(ERROR_USAGE|4, optusage(NULL));
151
152
#define PROMPT() {printf("[%s]> ", (istate.fd > 0 ? istate.cs_svc : "IM")); if (xjade) printf("\n"); fflush(stdout);}
153
154
PROMPT();
155
while (s = gets(buf))
156
{
157
if (*s == '\0')
158
{
159
PROMPT();
160
continue;
161
}
162
nlist = mkargv(s, elist, 20);
163
cmd = elist[0];
164
len = strlen(cmd);
165
for (i=0; i < CMD_MAX; i++)
166
{
167
if (cmdeq(cmd, i, len))
168
{
169
(void) (*COMMAND[i].main)(nlist, elist);
170
break;
171
}
172
}
173
if (i == CMD_MAX)
174
printf("command not found\n");
175
PROMPT();
176
}
177
}
178
179
int mkargv(s, w, n)
180
register char* s;
181
char** w;
182
int n;
183
{
184
register int i;
185
186
for(i = 0; i < n && *s; )
187
{
188
while (*s && isspace(*s))
189
s++;
190
if (!*s)
191
break;
192
w[i++] = s;
193
while (*s && !isspace(*s))
194
s++;
195
if(!*s)
196
break;
197
*s++ = '\0';
198
}
199
while (i < n)
200
w[--n] = s;
201
return i;
202
}
203
204
int im_help_help(cmd)
205
char* cmd;
206
{
207
printf("\t%s command\n", cmd);
208
return (0);
209
210
}
211
212
int im_help(argc, argv)
213
int argc;
214
char** argv;
215
{
216
register int i;
217
register char* s;
218
int len;
219
220
if (argc == 1)
221
{
222
for (i=0; i < CMD_MAX; i++)
223
{
224
if (COMMAND[i].help != NULL)
225
(void) (*COMMAND[i].help)(COMMAND[i].name);
226
else
227
printf("\t%s\n", COMMAND[i].name);
228
}
229
return (0);
230
}
231
232
while((--argc) > 0)
233
{
234
s = *(++argv);
235
len = strlen(s);
236
for (i=0; i < CMD_MAX; i++)
237
{
238
if (cmdeq(s, i, len))
239
{
240
if (COMMAND[i].help != NULL)
241
(void) (*COMMAND[i].help)(COMMAND[i].name);
242
else
243
printf("\t%s\n", COMMAND[i].name);
244
break;
245
}
246
}
247
if (i==CMD_MAX)
248
printf("command %s not undefined\n", s);
249
}
250
return (0);
251
}
252
253
254
255
256
/* chop(s,w,n,c) - break string into fields
257
* a common usage:
258
* elist[num=chop(s, elist, MAXDEPTH, '/')] = NULL;
259
* s is modified in place with '\0' replacing occurrences of separator char c.
260
* w is an array of n char pointers to receive addresses of the fields. The
261
* return value gives the number of fields actually found; additional entries
262
* in w are given the address of a null string.
263
*/
264
265
int chop(s,w,n,c)
266
register char *s;
267
char *w[];
268
int n;
269
char c;
270
{
271
register int i;
272
273
for (i = 0; i < n && *s;)
274
{
275
w[i++] = s;
276
while (*s && *s != c)
277
s++;
278
if (!*s)
279
break;
280
*s++ = '\0';
281
}
282
while (i < n)
283
w[--n] = s;
284
return i;
285
}
286
287
int im_bye(argc, argv)
288
int argc;
289
char** argv;
290
{
291
exit(0);
292
return -1;
293
}
294
295
/*
296
* skip(w,n)
297
* skip empty string in w;
298
*
299
*/
300
301
int skip(w, n)
302
char *w[];
303
register int n;
304
{
305
register int i;
306
register int j;
307
308
for (i = 0, j = 0; i < n; i++)
309
if (w[i][0]) w[j++] = w[i];
310
return (j);
311
}
312
313
int im_system(argc, argv)
314
int argc;
315
register char** argv;
316
{
317
register char* s;
318
char buf[2048];
319
int len;
320
321
s = *argv;
322
s++;
323
if (*s != '\0')
324
{
325
len = sfsprintf(buf, 2048, "%s ", s);
326
s = buf + len;
327
}
328
else
329
s = buf;
330
argc--;
331
argv++;
332
if (argc > 0)
333
{
334
argv[argc] = NULL;
335
arr2str(s, argv, ' ');
336
}
337
return(system(buf));
338
}
339
340
341
int arr2str(s,arr, c)
342
register char *s;
343
char *arr[];
344
char c;
345
{
346
register int i;
347
register char* t;
348
349
for (i=0; arr[i]; i++)
350
{
351
if (i) *s++ = c;
352
for (t = arr[i]; *t; t++, s++)
353
*s = *t;
354
}
355
*s = '\0';
356
return(0);
357
}
358
359