Annotation of coherent/g/usr/bin/vi/amiga.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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