|
|
1.1 root 1: /*
2: * uaeexe.c - UAE remote cli
3: *
4: * (c) 1997 by Samuel Devulder
5: */
6:
7: #include "sysconfig.h"
8: #include "sysdeps.h"
9:
10: #include "config.h"
11: #include "options.h"
12: #include "uae.h"
13: #include "memory.h"
14: #include "custom.h"
15: #include "readcpu.h"
16: #include "newcpu.h"
17: #include "autoconf.h"
18: #include "uaeexe.h"
19:
20: static struct uae_xcmd *first = NULL;
21: static struct uae_xcmd *last = NULL;
22: static char running = 0;
23: static uae_u32 uaeexe_server(void);
24:
25: /*
26: * Install the server
27: */
28: void uaeexe_install(void)
29: {
30: uaecptr loop;
31:
32: loop = here ();
33: org(UAEEXE_ORG);
34: calltrap (deftrap (uaeexe_server));
35: dw(RTS);
36: org(loop);
37: }
38:
39: /*
40: * Send command to the remote cli.
41: *
42: * To use this, just call uaeexe("command") and the command will be
43: * executed by the remote cli (provided you've started it in the
44: * s:user-startup for example). Be sure to add "run" if you want
45: * to launch the command asynchronously. Please note also that the
46: * remote cli works better if you've got the fifo-handler installed.
47: */
48: int uaeexe(char *cmd)
49: {
50: struct uae_xcmd *nw;
51:
52: if (!running)
53: goto NORUN;
54:
55: nw = (struct uae_xcmd *)malloc (sizeof *nw);
56: if (!nw)
57: goto NOMEM;
58: nw->cmd = (char *)malloc (strlen (cmd) + 1);
59: if (!nw->cmd) {
60: free (nw);
61: goto NOMEM;
62: }
63:
64: strcpy (nw->cmd, cmd);
65: nw->prev = last;
66: nw->next = NULL;
67:
68: if(!first) first = nw;
69: if(last) {
70: last->next = nw;
71: last = nw;
72: } else last = nw;
73:
74: return UAEEXE_OK;
75: NOMEM:
76: return UAEEXE_NOMEM;
77: NORUN:
78: write_log("Remote cli is not running.\n");
79: return UAEEXE_NOTRUNNING;
80: }
81:
82: /*
83: * returns next command to be executed
84: */
85: static char *get_cmd(void)
86: {
87: struct uae_xcmd *cmd;
88: char *s;
89:
90: if(!first) return NULL;
91: s = first->cmd;
92: cmd = first; first = first->next;
93: if(!first) last = NULL;
94: free(cmd);
95: return s;
96: }
97:
98: /*
99: * helper function
100: */
101: #define ARG(x) (get_long (m68k_areg (regs, 7) + 4*(x+1)))
102: static uae_u32 uaeexe_server(void)
103: {
104: int len;
105: char *cmd;
106: char *dst;
107:
108: if(ARG(0) && !running) {
109: running = 1;
110: write_log("Remote CLI started.\n");
111: }
112:
113: cmd = get_cmd(); if(!cmd) return 0;
114: if(!ARG(0)) {running = 0;return 0;}
115:
116: dst = (char *)get_real_address(ARG(0));
117: len = ARG(1);
118: strncpy(dst,cmd,len);
119: printf("Sending '%s' to remote cli\n",cmd); /**/
120: free(cmd);
121: return ARG(0);
122: }
123:
124:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.