|
|
1.1 root 1: /*
2: * dkcc -- Remote Execute or Login over DATAKIT VCS to UNIX-V
3: */
4: static char SCCSID[] = "@(#)dkrx.c 2.1 DKHOST 84/07/03";
5:
6: #include <stdio.h>
7: #include "sysexits.h"
8: #include "string.h"
9: extern int dkp_ld ;
10: extern char * dkerror ;
11:
12: char system[64];
13: char *ttyname();
14:
15: main(argc, argv)
16: char **argv;
17: {
18: register int f, exitcode;
19: register char *p, *ttyn;
20: int force, env;
21: extern char *miscfield() ;
22: char * cmdname ;
23:
24: cmdname = argv[0] ;
25: if(p = strrchr(argv[0], '/'))
26: strcpy(system, p+1);
27: else
28: strcpy(system, argv[0]);
29:
30: argc--; argv++;
31:
32: if(strcmp(argv[0], "-f") == 0){
33: force = 1;
34: argc--; argv++;
35: }else
36: force = 0;
37:
38: env = 1;
39:
40: if(strcmp(system, "dkcc") == 0) {
41: if(argc == 0){
42: fprintf(stderr, "Usage: dkcc system [ command [ args ] ]\n");
43: exit(EX_USAGE);
44: }
45:
46:
47: strcpy(system, argv[0]);
48:
49: argc--; argv++;
50: }
51:
52:
53: if(argc > 0)
54: strcpy(system, maphost(system, 'x', "rx", "aevx", ""));
55: else
56: strcpy(system, maphost(system, 'l', "rl", "vx", ""));
57:
58: if(p = miscfield((argc > 0) ? 'x' : 'l', 'c'))
59: execalt(p, system, argv);
60:
61: if(p = miscfield((argc > 0) ? 'x' : 'l', 'v'))
62: env = (*p == 'y');
63:
64: f = tdkdial(system, 2);
65: if (f < 0) {
66: fprintf(stderr, "%s: call to %s failed, %s\n", cmdname, system, dkerror) ;
67: exit(-f);
68: }
69: dkproto(f, dkp_ld) ;
70:
71: exitcode = 0;
72:
73: if(env)
74: exitcode = dkxenviron(f);
75:
76: if(exitcode >= 0 && argc > 0)
77: exitcode = sendargs(f, argv, !!miscfield('x', 's'));
78:
79: if(exitcode >= 0)
80: exitcode = dkxstdio(f);
81:
82: if(exitcode == -EX_IOERR && argc == 0)
83: exit(0); /* no exitcode specified */
84: else if(exitcode < 0)
85: exit(-exitcode); /* if error processing the call */
86: else if(exitcode & 0xFF)
87: exit(exitcode | 0x80); /* remote terminated on signal */
88: else
89: exit(exitcode>>8); /* else it finished with this code */
90: }
91:
92: execalt(string, system, argv)
93: char *string, *system;
94: char *argv[];
95: {
96: char **ap, *args[32];
97:
98: ap = args;
99:
100: do{
101: *ap++ = string;
102:
103: if(string = strchr(string, ':'))
104: *string++ = '\0';
105: }while(string);
106:
107: *ap++ = system;
108: while(*ap++ = *argv++);
109:
110: execvp(args[0], args);
111:
112: fprintf(stderr, "dk: Can't exec %s\n", args[0]);
113: exit(EX_UNAVAILABLE);
114: }
115:
116: sendargs(fd, argarray, minusc)
117: char *argarray[];
118: {
119: register int aoffset;
120: char argstring[2048];
121:
122: if(minusc){
123: aoffset = 3;
124: strcpy(argstring, "-c");
125: }else
126: aoffset = 0;
127:
128: return(dkxlwrite(fd, argstring, bldargs(&argstring[aoffset], argarray) + aoffset));
129: }
130:
131: bldargs(args, argv)
132: char *args;
133: register char *argv[];
134: {
135: register char *s, *t;
136:
137: s = args;
138:
139: if (t = *argv++) {
140: while (*s++ = *t++);
141:
142: s[-1] = ' ';
143: }
144: while(t = *argv++){
145: *s++ = '"';
146:
147: while(*s++ = *t++);
148:
149: s[-1] = '"';
150: *s++ = ' ';
151: }
152: *s++ = '\0';
153: return(s - args);
154: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.