comparison loadtools/initscript.c @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:e7502631a0f9
1 /*
2 * This module has been copied from ltscript.c, ltdispatch.c and ltpassthru.c:
3 * here we implement the init-script functionality for fc-xram.
4 */
5
6 #include <sys/param.h>
7 #include <stdio.h>
8 #include <string.h>
9 #include <strings.h>
10 #include <stdlib.h>
11
12 extern char default_helpers_dir[];
13
14 extern int cmd_baud();
15
16 static
17 loadagent_cmd(argc, argv)
18 char **argv;
19 {
20 if (tpinterf_make_cmd(argv) < 0) {
21 fprintf(stderr, "error: unable to form target command\n");
22 return(-1);
23 }
24 if (tpinterf_send_cmd() < 0)
25 return(-1);
26 return tpinterf_pass_output(1);
27 }
28
29 static struct cmdtab {
30 char *cmd;
31 int minargs;
32 int maxargs;
33 int (*func)();
34 } cmdtab[] = {
35 {"baud", 1, 1, cmd_baud},
36 {"w8", 2, 2, loadagent_cmd},
37 {"w16", 2, 2, loadagent_cmd},
38 {"w32", 2, 2, loadagent_cmd},
39 {0, 0, 0, 0}
40 };
41
42 static
43 dispatch_cmd(cmd)
44 char *cmd;
45 {
46 char *argv[10];
47 char *cp, **ap;
48 struct cmdtab *tp;
49
50 for (cp = cmd; isspace(*cp); cp++)
51 ;
52 if (!*cp || *cp == '#')
53 return(0);
54 printf("init-script command: %s\n", cp);
55 argv[0] = cp;
56 while (*cp && !isspace(*cp))
57 cp++;
58 if (*cp)
59 *cp++ = '\0';
60 for (tp = cmdtab; tp->cmd; tp++)
61 if (!strcmp(tp->cmd, argv[0]))
62 break;
63 if (!tp->func) {
64 fprintf(stderr, "error: no such command\n");
65 return(-1);
66 }
67 for (ap = argv + 1; ; ) {
68 while (isspace(*cp))
69 cp++;
70 if (!*cp || *cp == '#')
71 break;
72 if (ap - argv - 1 >= tp->maxargs) {
73 fprintf(stderr, "error: too many arguments\n");
74 return(-1);
75 }
76 *ap++ = cp;
77 while (*cp && !isspace(*cp))
78 cp++;
79 if (*cp)
80 *cp++ = '\0';
81 }
82 if (ap - argv - 1 < tp->minargs) {
83 fprintf(stderr, "error: too few arguments\n");
84 return(-1);
85 }
86 *ap = 0;
87 return tp->func(ap - argv, argv);
88 }
89
90 exec_init_script(script_name)
91 char *script_name;
92 {
93 char pathbuf[MAXPATHLEN], *openfname;
94 FILE *f;
95 char linebuf[512], *cp;
96 int lineno, retval = 0;
97
98 if (index(script_name, '/'))
99 openfname = script_name;
100 else {
101 sprintf(pathbuf, "%s/%s", default_helpers_dir, script_name);
102 openfname = pathbuf;
103 }
104 f = fopen(openfname, "r");
105 if (!f) {
106 perror(openfname);
107 return(-1);
108 }
109 for (lineno = 1; fgets(linebuf, sizeof linebuf, f); lineno++) {
110 cp = index(linebuf, '\n');
111 if (!cp) {
112 fprintf(stderr, "%s line %d: missing newline\n",
113 openfname, lineno);
114 fclose(f);
115 return(-1);
116 }
117 *cp = '\0';
118 retval = dispatch_cmd(linebuf);
119 if (retval)
120 break;
121 }
122 fclose(f);
123 return(retval);
124 }