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>