Annotation of uae/amiga/source/uae_rcli.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.