[BACK]Return to os9.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot

Annotation of OpenXM_contrib/gnuplot/os9.c, Revision 1.1.1.1

1.1       maekawa     1: /* $Id: os9.c,v 1.2 1998/03/22 22:31:54 drd Exp $ */
                      2:
                      3: /* GNUPLOT - os9.c */
                      4:
                      5: /*[
                      6:  * Copyright 1986 - 1993, 1998   Thomas Williams, Colin Kelley
                      7:  *
                      8:  * Permission to use, copy, and distribute this software and its
                      9:  * documentation for any purpose with or without fee is hereby granted,
                     10:  * provided that the above copyright notice appear in all copies and
                     11:  * that both that copyright notice and this permission notice appear
                     12:  * in supporting documentation.
                     13:  *
                     14:  * Permission to modify the software is granted, but not the right to
                     15:  * distribute the complete modified source code.  Modifications are to
                     16:  * be distributed as patches to the released version.  Permission to
                     17:  * distribute binaries produced by compiling modified sources is granted,
                     18:  * provided you
                     19:  *   1. distribute the corresponding source modifications from the
                     20:  *    released version in the form of a patch file along with the binaries,
                     21:  *   2. add special version identification to distinguish your version
                     22:  *    in addition to the base release version number,
                     23:  *   3. provide your name and address as the primary contact for the
                     24:  *    support of your modified version, and
                     25:  *   4. retain our contact information in regard to use of the base
                     26:  *    software.
                     27:  * Permission to distribute the released version of the source code along
                     28:  * with corresponding source modifications in the form of a patch file is
                     29:  * granted with same provisions 2 through 4 for binary distributions.
                     30:  *
                     31:  * This software is provided "as is" without express or implied warranty
                     32:  * to the extent permitted by applicable law.
                     33: ]*/
                     34:
                     35:
                     36: /*
                     37:  * Some Unix like functions that gnuplot uses.
                     38:  * Original sources from the blars lib.
                     39:  */
                     40:
                     41: #include <stdio.h>
                     42: #include <modes.h>
                     43: #include <direct.h>
                     44: #include <sgstat.h>
                     45:
                     46: #ifdef PIPES
                     47:
                     48: /* Original version by Robert A. Larson */
                     49: /* Adapted by M.N. Schipper */
                     50:
                     51: #include <string.h>
                     52: #include <module.h>
                     53:
                     54: extern char *_environ;
                     55: extern int os9fork();
                     56: extern mh_com *modlink();
                     57: extern mh_com *modloadp();
                     58:
                     59: static int proc[_NFILE];
                     60: static mh_com *loadmods[_NFILE];
                     61:
                     62: FILE *popen(command, mode)
                     63: char *command;
                     64: char *mode;
                     65: {
                     66:     int temp, fd;
                     67:     FILE *pipe;
                     68:     char *argv[4];
                     69:     register char *cp;
                     70:     mh_com *mod;
                     71:     int linked = 0;
                     72:
                     73:     if(mode[1]!='\0' || (*mode!='r' && *mode!='w')) return (FILE *)NULL;
                     74:     fd = (*mode=='r');
                     75:     if((temp = dup(fd)) <= 0) return (FILE *)NULL;
                     76:     if((pipe = fopen("/pipe", "r+")) == NULL) {
                     77:        close(temp);
                     78:        return (FILE *)NULL;
                     79:     }
                     80:     close(fd);
                     81:     dup(fileno(pipe));
                     82:
                     83:     if (strrchr (command, '/') == NULL)
                     84:                mod = modlink (command, 0);
                     85:        else
                     86:                mod = (mh_com *) -1;
                     87:        if (mod == (mh_com *) -1)
                     88:                loadmods[fileno(pipe)] = mod = modloadp (command, 0, NULL);
                     89:        else
                     90:        {
                     91:                linked = 1;
                     92:                loadmods[fileno(pipe)] = (mh_com *) -1;
                     93:        }
                     94:
                     95:     argv[0] = "shell";
                     96:     if (mod != (mh_com *) -1)
                     97:     {
                     98:            argv[1] = "ex";
                     99:            argv[2] = command;
                    100:        argv[3] = (char *)NULL;
                    101:     }
                    102:     else
                    103:     {
                    104:        argv[1] = command;
                    105:            argv[2] = (char *)NULL;
                    106:        }
                    107:     if((proc[fileno(pipe)] = os9exec(os9fork, argv[0], argv, _environ, 0, 0)) < 0)
                    108:     {
                    109:                fclose(pipe);
                    110:                pipe = NULL;
                    111:        }
                    112:     close(fd);
                    113:     dup(temp);
                    114:     close(temp);
                    115:        if (linked && mod != (mh_com *) -1)
                    116:                munlink (mod);
                    117:     return pipe;
                    118: }
                    119:
                    120: int pclose(pipe)
                    121: FILE *pipe;
                    122: {
                    123:     int p, stat, w;
                    124:
                    125:     if((p = proc[fileno(pipe)]) <= 0) return -1;
                    126:     proc[fileno(pipe)] = 0;
                    127:     fflush(pipe);
                    128:        if (loadmods[fileno(pipe)] != (mh_com *) -1)
                    129:                munlink (loadmods[fileno(pipe)]);
                    130:     fclose(pipe);
                    131:     while((w=wait(&stat)) != -1 && w!=p) {}
                    132:     return w==-1 ? -1 : stat;
                    133: }
                    134:
                    135: #endif /* PIPES */
                    136:
                    137:
                    138: int isatty(f)
                    139: int f;
                    140: {
                    141:     struct sgbuf sgbuf;
                    142:
                    143:     if(_gs_opt(f, &sgbuf) < 0) return -1;
                    144:     return sgbuf.sg_class == 0;
                    145: }
                    146:
                    147:
                    148: char *getwd(p)
                    149: char *p;
                    150: {
                    151:     register char *cp;
                    152:     register struct dirent *dp;
                    153:     register int l, olddot = 0, i, d, dot, dotdot;
                    154:     struct dirent db[8];
                    155:     char buf[1024];
                    156:
                    157:     cp = &buf[1024-1];
                    158:     *cp = '\0';
                    159:     for(;;) {
                    160:        if((d = open(".", S_IREAD | S_IFDIR)) < 0) {
                    161:            if(*cp) chdir(cp+1);
                    162:            return NULL;
                    163:        }
                    164:        if((i = read(d, (char *)db, sizeof(db))) == 0) {
                    165:            if(*cp) chdir(cp+1);
                    166:            close(d);
                    167:            return NULL;
                    168:        }
                    169:        dotdot = db[0].dir_addr;
                    170:        dot = db[1].dir_addr;
                    171:        if(olddot) {
                    172:            i -= 2 * sizeof(struct dirent);
                    173:            dp = &db[2];
                    174:            for(;;) {
                    175:                if(i <= 0) {
                    176:                    if((i = read(d, (char *)db, sizeof(db))) == 0) {
                    177:                        if(*cp) chdir(cp+1);
                    178:                        close(d);
                    179:                        return NULL;
                    180:                    }
                    181:                    dp = &db[0];
                    182:                }
                    183:                if(olddot == dp->dir_addr) {
                    184:                    l = strlen(dp->dir_name);
                    185:                    /* last character has parity bit set... */
                    186:                    *--cp = dp->dir_name[--l] & 0x7f;
                    187:                    while(l) *--cp = dp->dir_name[--l];
                    188:                    *--cp = '/';
                    189:                    break;
                    190:                }
                    191:                i -= sizeof(struct dirent);
                    192:                dp++;
                    193:            }
                    194:        }
                    195:        if(dot==dotdot) {
                    196:            if(*cp) chdir(cp+1);
                    197:            *p = '/';
                    198:            if(_gs_devn(d, p+1) < 0) {
                    199:                close(d);
                    200:                return NULL;
                    201:            }
                    202:            close(d);
                    203:            strcat(p, cp);
                    204:            return p;
                    205:        }
                    206:        close(d);
                    207:        if(chdir("..") != 0) {
                    208:            if(*cp) chdir(cp+1);
                    209:            return NULL;
                    210:        }
                    211:        olddot = dot;
                    212:     }
                    213: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>