|
|
1.1 ! root 1: /* amiga.c */ ! 2: ! 3: /*- ! 4: * Mike Rieser Dale Rahn ! 5: * 2410 Happy Hollow Rd. Apt D-10 540 Vine St. ! 6: * West Lafayette, IN 47906 West Lafayette, IN 47906 ! 7: * [email protected] [email protected] ! 8: */ ! 9: ! 10: #include <string.h> ! 11: #include <fcntl.h> ! 12: #include <exec/memory.h> ! 13: #include <dos/dostags.h> /* for system() and rpipe() */ ! 14: #include <dos/var.h> ! 15: #include <clib/exec_protos.h> ! 16: #include <clib/dos_protos.h> ! 17: ! 18: #if AZTEC_C ! 19: #include <pragmas/exec_lib.h> ! 20: #include <pragmas/dos_lib.h> ! 21: #else ! 22: #include <pragmas/exec.h> ! 23: #include <pragmas/dos.h> ! 24: #endif ! 25: ! 26: #include "config.h" ! 27: ! 28: static struct TagItem systags[]= ! 29: { ! 30: {SYS_Input, 0L}, ! 31: {SYS_Output, 0L}, ! 32: {SYS_UserShell, TRUE}, ! 33: {SYS_Asynch, TRUE}, ! 34: {TAG_DONE} ! 35: }; ! 36: ! 37: #define ENVSIZE 1028 ! 38: #define FILE_SEP ' ' ! 39: ! 40: #ifdef LATTICE ! 41: /* INDENT OFF */ ! 42: int CXBRK(void) { return 0; } /* Disable Lattice CTRL/C handling */ ! 43: int chkabort(void) { return 0; } ! 44: #elif AZTEC_C ! 45: long Chk_Abort(void) { return 0; } /* Disable Aztec CTRL/C handling */ ! 46: /* INDENT ON */ ! 47: #endif ! 48: ! 49: ! 50: /* ! 51: * getpid() - This is only used to make tmpfiles. ! 52: */ ! 53: int ! 54: getpid() ! 55: { ! 56: return (int) FindTask(0L); ! 57: } ! 58: ! 59: ! 60: /* ! 61: * rpipe() - gets a `cmd' to run and a `file descriptor' to use as its stdin. ! 62: */ ! 63: int ! 64: rpipe(UBYTE * cmd, int fd) ! 65: { ! 66: BPTR fdFH = 0, /* FileHandle of passed file descriptor */ ! 67: outPH = 0, /* Pipe (File) Handle for child to write to. */ ! 68: inPH = 0, /* Pipe (File) Handle for child to read from. */ ! 69: lock = 0; ! 70: int fdr = 0; ! 71: char pname[32], *pc; ! 72: extern char o_shell[]; ! 73: ! 74: if (isOldDOS()) ! 75: return -1; ! 76: ! 77: /*- ! 78: * Sorry, I'm playing with an AZTEC internal here: ! 79: * _devtab[fd].fd is Aztec's FileHandle for the file descriptor `fd'. ! 80: * ! 81: * HINT: For your compiler, look in your compiler's fcntl.h. ! 82: */ ! 83: ! 84: switch (fd) ! 85: { ! 86: case 0: ! 87: inPH = Open((UBYTE *) "*", MODE_READWRITE); ! 88: break; ! 89: default: ! 90: ! 91: #ifdef AZTEC_C ! 92: fdFH = _devtab[fd].fd; /* Grab FileHandle from fd */ ! 93: #elif _DCC ! 94: fdFH = fdtofh(fd); /* DCC does it right! */ ! 95: #else ! 96: return -1; /* Sorry, can't help you. */ ! 97: #endif ! 98: ! 99: /* ! 100: * Get a FileHandle to use for the child's stdin. ! 101: * The only reason we Dup is because we'll run the child ASynch, ! 102: * and it will close its Input and Output on exit. ! 103: */ ! 104: lock = DupLockFromFH(fdFH); ! 105: if (!lock) ! 106: return -1; ! 107: inPH = OpenFromLock(lock); ! 108: } ! 109: ! 110: if (!inPH) ! 111: { ! 112: if (lock) ! 113: UnLock(lock); ! 114: return -1; ! 115: } ! 116: ! 117: /* ! 118: * Get a pipe to use for the child's stdout, which we will read from. ! 119: */ ! 120: strcpy(pname, "PIPE:ElvisXXX.XXX"); ! 121: pc = mktemp(pname); /* Get a unique PIPE: */ ! 122: if (!*pc) ! 123: { ! 124: Close(inPH); ! 125: return -1; /* Failure. */ ! 126: } ! 127: ! 128: /* ! 129: * Get a FileHandle to use for the child's stdout. ! 130: */ ! 131: if ((BPTR) 0 == (outPH = Open((UBYTE *) pc, MODE_NEWFILE))) ! 132: { ! 133: Close(inPH); ! 134: return -1; /* Failure. */ ! 135: } ! 136: ! 137: /* Get a file descriptor to return to the calling function */ ! 138: if ((fdr = open(pc, O_RDONLY)) < 0) ! 139: { ! 140: Close(inPH); ! 141: Close(outPH); ! 142: return -1; /* Failure. */ ! 143: } ! 144: ! 145: /* exec the cmd */ ! 146: systags[0].ti_Data = inPH; /* Input FileHandle for child */ ! 147: systags[1].ti_Data = outPH; /* Output FileHandle for child */ ! 148: systags[2].ti_Data = (long) o_shell;/* which shell to use */ ! 149: ! 150: if (System((UBYTE *) cmd, systags)) ! 151: { ! 152: close(fdr); ! 153: return -1; /* Failure. */ ! 154: } ! 155: ! 156: return fdr; /* Success! */ ! 157: } ! 158: ! 159: ! 160: /* ! 161: * This is supposed to wait till the child process is done. Unfortunately, I'm ! 162: * not sure how to do that. ! 163: */ ! 164: int ! 165: rpclose(int fd) ! 166: { ! 167: close(fd); ! 168: return 0; ! 169: } ! 170: ! 171: ! 172: int ! 173: sleep(unsigned seconds) ! 174: { ! 175: if (seconds) ! 176: Delay(seconds * TICKS_PER_SECOND); ! 177: return 0; ! 178: } ! 179: ! 180: ! 181: int ! 182: system(UBYTE * command) ! 183: { ! 184: return (isOldDOS()) ? -1 : System((UBYTE *) command, TAG_DONE); ! 185: } ! 186: ! 187: ! 188: #ifdef AZTEC_C ! 189: ! 190: /* ! 191: * Aztec's library getenv() doesn't allow for Environment variables larger than ! 192: * 256 bytes. It also doesn't check the local environment, which would make ! 193: * elvis running on an AUX: port more useful. ! 194: */ ! 195: char * ! 196: getenv(char *var) ! 197: { ! 198: static char *buf; ! 199: ! 200: buf = (char *) malloc(sizeof(*buf) * (ENVSIZE + 1)); ! 201: if ((char *) 0 == buf) ! 202: { ! 203: return 0; ! 204: } ! 205: if (isOldDOS()) ! 206: { ! 207: int bytes; ! 208: BPTR fh; ! 209: ! 210: strcpy(buf, "env:"); ! 211: strcat(buf, var); ! 212: fh = Open((UBYTE *) buf, MODE_OLDFILE); ! 213: if ((BPTR) 0 == fh) ! 214: { ! 215: _free_(buf); ! 216: return (char *) 0; /* return null for not defined */ ! 217: } ! 218: bytes = Read(fh, (UBYTE *) buf, ENVSIZE); ! 219: Close(fh); ! 220: if (bytes == -1) ! 221: { ! 222: _free_(buf); ! 223: return (char *) 0; /* return null for not defined */ ! 224: } ! 225: buf[bytes] = '\000'; ! 226: } else if (-1 == GetVar((UBYTE *) var, (UBYTE *) buf, ENVSIZE, GVF_BINARY_VAR)) ! 227: { /* no varible defined, free memory */ ! 228: _free_(buf); ! 229: return (char *) 0; /* return null for not defined */ ! 230: } ! 231: return (char *) buf; ! 232: } ! 233: ! 234: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.