[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     ! 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>