File: [local] / OpenXM_contrib / gnuplot / Attic / os9.c (download)
Revision 1.1.1.2 (vendor branch), Sat Jan 22 14:15:54 2000 UTC (24 years, 8 months ago) by maekawa
Branch: GNUPLOT
CVS Tags: maekawa-ipv6, VERSION_3_7_3, VERSION_3_7_1, RELEASE_20000124, RELEASE_1_2_3, RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX, RELEASE_1_2_2, RELEASE_1_2_1, RELEASE_1_1_3, RELEASE_1_1_2 Changes since 1.1.1.1: +1 -1
lines
Import gnuplot 3.7.1
|
/* $Id: os9.c,v 1.1.1.2 1998/04/15 19:22:52 lhecking Exp $ */
/* GNUPLOT - os9.c */
/*[
* Copyright 1986 - 1993, 1998 Thomas Williams, Colin Kelley
*
* Permission to use, copy, and distribute this software and its
* documentation for any purpose with or without fee is hereby granted,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation.
*
* Permission to modify the software is granted, but not the right to
* distribute the complete modified source code. Modifications are to
* be distributed as patches to the released version. Permission to
* distribute binaries produced by compiling modified sources is granted,
* provided you
* 1. distribute the corresponding source modifications from the
* released version in the form of a patch file along with the binaries,
* 2. add special version identification to distinguish your version
* in addition to the base release version number,
* 3. provide your name and address as the primary contact for the
* support of your modified version, and
* 4. retain our contact information in regard to use of the base
* software.
* Permission to distribute the released version of the source code along
* with corresponding source modifications in the form of a patch file is
* granted with same provisions 2 through 4 for binary distributions.
*
* This software is provided "as is" without express or implied warranty
* to the extent permitted by applicable law.
]*/
/*
* Some Unix like functions that gnuplot uses.
* Original sources from the blars lib.
*/
#include <stdio.h>
#include <modes.h>
#include <direct.h>
#include <sgstat.h>
#ifdef PIPES
/* Original version by Robert A. Larson */
/* Adapted by M.N. Schipper */
#include <string.h>
#include <module.h>
extern char *_environ;
extern int os9fork();
extern mh_com *modlink();
extern mh_com *modloadp();
static int proc[_NFILE];
static mh_com *loadmods[_NFILE];
FILE *popen(command, mode)
char *command;
char *mode;
{
int temp, fd;
FILE *pipe;
char *argv[4];
register char *cp;
mh_com *mod;
int linked = 0;
if(mode[1]!='\0' || (*mode!='r' && *mode!='w')) return (FILE *)NULL;
fd = (*mode=='r');
if((temp = dup(fd)) <= 0) return (FILE *)NULL;
if((pipe = fopen("/pipe", "r+")) == NULL) {
close(temp);
return (FILE *)NULL;
}
close(fd);
dup(fileno(pipe));
if (strrchr (command, '/') == NULL)
mod = modlink (command, 0);
else
mod = (mh_com *) -1;
if (mod == (mh_com *) -1)
loadmods[fileno(pipe)] = mod = modloadp (command, 0, NULL);
else
{
linked = 1;
loadmods[fileno(pipe)] = (mh_com *) -1;
}
argv[0] = "shell";
if (mod != (mh_com *) -1)
{
argv[1] = "ex";
argv[2] = command;
argv[3] = (char *)NULL;
}
else
{
argv[1] = command;
argv[2] = (char *)NULL;
}
if((proc[fileno(pipe)] = os9exec(os9fork, argv[0], argv, _environ, 0, 0)) < 0)
{
fclose(pipe);
pipe = NULL;
}
close(fd);
dup(temp);
close(temp);
if (linked && mod != (mh_com *) -1)
munlink (mod);
return pipe;
}
int pclose(pipe)
FILE *pipe;
{
int p, stat, w;
if((p = proc[fileno(pipe)]) <= 0) return -1;
proc[fileno(pipe)] = 0;
fflush(pipe);
if (loadmods[fileno(pipe)] != (mh_com *) -1)
munlink (loadmods[fileno(pipe)]);
fclose(pipe);
while((w=wait(&stat)) != -1 && w!=p) {}
return w==-1 ? -1 : stat;
}
#endif /* PIPES */
int isatty(f)
int f;
{
struct sgbuf sgbuf;
if(_gs_opt(f, &sgbuf) < 0) return -1;
return sgbuf.sg_class == 0;
}
char *getwd(p)
char *p;
{
register char *cp;
register struct dirent *dp;
register int l, olddot = 0, i, d, dot, dotdot;
struct dirent db[8];
char buf[1024];
cp = &buf[1024-1];
*cp = '\0';
for(;;) {
if((d = open(".", S_IREAD | S_IFDIR)) < 0) {
if(*cp) chdir(cp+1);
return NULL;
}
if((i = read(d, (char *)db, sizeof(db))) == 0) {
if(*cp) chdir(cp+1);
close(d);
return NULL;
}
dotdot = db[0].dir_addr;
dot = db[1].dir_addr;
if(olddot) {
i -= 2 * sizeof(struct dirent);
dp = &db[2];
for(;;) {
if(i <= 0) {
if((i = read(d, (char *)db, sizeof(db))) == 0) {
if(*cp) chdir(cp+1);
close(d);
return NULL;
}
dp = &db[0];
}
if(olddot == dp->dir_addr) {
l = strlen(dp->dir_name);
/* last character has parity bit set... */
*--cp = dp->dir_name[--l] & 0x7f;
while(l) *--cp = dp->dir_name[--l];
*--cp = '/';
break;
}
i -= sizeof(struct dirent);
dp++;
}
}
if(dot==dotdot) {
if(*cp) chdir(cp+1);
*p = '/';
if(_gs_devn(d, p+1) < 0) {
close(d);
return NULL;
}
close(d);
strcat(p, cp);
return p;
}
close(d);
if(chdir("..") != 0) {
if(*cp) chdir(cp+1);
return NULL;
}
olddot = dot;
}
}