|
|
1.1 root 1: ;/* compile with: execute uae_rcli.c
2: failat 11
3: sc uae_rcli.c opt link to uae_rcli noicons
4: if ERROR
5: gcc uae_rcli.c -O3 -o uae_rcli -noixemul
6: endif
7: quit
8: */
9:
10: /*
11: * uae_rcli.c - UAE remote cli
12: *
13: * (c) 1997 by Samuel Devulder
14: */
15:
16: #include <ctype.h>
17: #include <stdio.h>
18: #include <stdlib.h>
19: #include <string.h>
20: #include <unistd.h>
21: #include <proto/dos.h>
22: #include <proto/exec.h>
23: #include <libraries/dosextens.h>
24:
25: #ifdef __GNUC__
26: #include "../../src/include/uaeexe.h"
27: #else
28: #include "//src/include/uaeexe.h"
29: #endif
30:
31: #define NAME "uae_rcli"
32: #define LEN 512
33:
34: static int (*calltrap)(char *, int) = (void*)UAEEXE_ORG;
35: static int delay = 20;
36: static int debug = 0;
37: static int nofifo = 0;
38: static ULONG fifo;
39: static char buf[LEN];
40:
41: /*
42: * lowlevel I/O
43: */
44: static void WR(ULONG f,char *s)
45: {
46: Write(f,s,strlen(s));
47: }
48: static void PR(char *s)
49: {
50: WR(Output(),s);
51: }
52:
53: /*
54: * self explanatory
55: */
56: static void usage(char *name)
57: {
58: PR("Usage: ");PR(name);PR(" [-h|?] [-debug] [-nofifo] [<delay>]\n");
59: exit(0);
60: }
61:
62: /*
63: * grab options
64: */
65: static void parse_cmdline(int ac, char **av)
66: {
67: char *name = *av++;
68:
69: for(;--ac;++av) {
70: if(!strcmp(*av,"-debug")) debug = 1; else
71: if(!strcmp(*av,"-nofifo")) nofifo = 1; else
72: if(!strcmp(*av,"-h")) usage(name); else
73: if(!strcmp(*av,"?")) usage(name); else
74: if(**av>='0' && **av<='9') delay = atoi(*av); else
75: {PR("Bad argument: \"");PR(*av);PR("\"\n");exit(0);}
76: }
77: if(!delay) delay = 1;
78: }
79:
80: /*
81: * See if command matches. Returns pointer to arguments.
82: */
83: static char *match(char *src,char *cmd)
84: {
85: while(*src == ' ' || *src == '\t') ++src;
86: while(*src && tolower(*src) == tolower(*cmd)) {++src;++cmd;}
87: while(*src==' ' || *src=='\t') ++src;
88: return (*cmd)?NULL:src;
89: }
90:
91: /*
92: * get command
93: */
94: static int getcmd(void)
95: {
96: if(debug) PR("-> Calltrap\n");
97: if(calltrap(buf, LEN-1)) {
98: if(debug) PR("-> 1\n");
99: return 1;
100: } else {
101: if(debug) PR("-> 0\n");
102: return 0;
103: }
104: /*
105: PR(">> ");
106: if(fgets(buf,LEN-1,stdin) == NULL) strcpy(buf,"quit");
107: if(*buf=='\n') return 0;
108: return 1;
109: */
110: }
111:
112: /*
113: * execute command
114: */
115: static void my_exec(void)
116: {
117: if(debug) {PR("-> Exec \"");PR(buf);PR("\"\n");}
118: if(fifo) {
119: WR(fifo,buf);
120: WR(fifo,"\n");
121: } else { /* nofifo => emulate cli */
122: char *s;
123: if((s=match(buf,"cd"))) {
124: if(*s==';' || !*s) {
125: char buff[128];
126: getcwd(buff,sizeof(buff)-1);
127: PR(buff);PR("\n");
128: } else {
129: chdir(s);
130: }
131: } else {
132: System(buf, NULL);
133: }
134: }
135: *buf = '\0';
136: }
137:
138: /*
139: * Open without requester
140: */
141: ULONG myOpen(char *name, ULONG mode)
142: {
143: ULONG rt, wd;
144: struct Process *pr;
145:
146: pr = (void*)FindTask(NULL);
147: if(pr->pr_Task.tc_Node.ln_Type != NT_PROCESS) return 0;
148:
149: wd = (ULONG)pr->pr_WindowPtr;
150: pr->pr_WindowPtr = (APTR)-1;
151: rt = Open(name,mode);
152: pr->pr_WindowPtr = (APTR)wd;
153:
154: return rt;
155: }
156:
157: /*
158: * Guess :)
159: */
160: int main(int ac, char **av)
161: {
162: int running = 1;
163:
164: parse_cmdline(ac,av);
165: if(!nofifo) {
166: if(debug) PR("-> Open fifo\n");
167: fifo = myOpen("fifo:"NAME"/wmke",MODE_NEWFILE);
168: if(!fifo) {
169: if(debug) PR("-> Starting fifo-handler\n");
170: System("run <nil: >nil: l:fifo-handler",NULL);
171: Delay(100);
172: if(debug) PR("-> Reopen fifo\n");
173: fifo = myOpen("fifo:"NAME"/wmke",MODE_NEWFILE);
174: }
175: }
176:
177: if(fifo) {
178: if(debug) PR("-> Spawning shell\n");
179: System("run execute fifo:"NAME"/rsk",NULL);
180: if(debug) WR(fifo,"echo \"-> Remote cli running\"\n");
181: } else if(debug) PR("-> No fifo found\n");
182:
183: do {
184: while(running && getcmd()) {
185: if(match(buf,"endcli")) running = 0; else
186: if(match(buf,"endshell")) running = 0; else
187: if(match(buf,"quit")) running = 0;
188: if(SetSignal(0L, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D) &
189: (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D)) {
190: running = 0;
191: }
192: if(running) my_exec();
193: }
194: if(running) Delay(delay);
195: } while(running);
196: if(debug) PR("-> Exiting\n");
197: (*calltrap)(0,0);
198: if(fifo) {
199: Close(fifo);
200: }
201: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.