summaryrefslogtreecommitdiffstats
path: root/Modules/posixmodule.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-05-22 15:12:39 (GMT)
committerGuido van Rossum <guido@python.org>1997-05-22 15:12:39 (GMT)
commitb9f866cb7c019c3416b7ae18d7cdb6bd20106f5b (patch)
tree232987016b94a3f5cf76d31e5eea3941937f7815 /Modules/posixmodule.c
parentb6190d35fc1bc781ed2887b4020b8251bca4c6ae (diff)
downloadcpython-b9f866cb7c019c3416b7ae18d7cdb6bd20106f5b.zip
cpython-b9f866cb7c019c3416b7ae18d7cdb6bd20106f5b.tar.gz
cpython-b9f866cb7c019c3416b7ae18d7cdb6bd20106f5b.tar.bz2
Enable putenv and waitpid (== wait4) for NeXT.
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r--Modules/posixmodule.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 7307743..5ce985f 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -123,6 +123,7 @@ PERFORMANCE OF THIS SOFTWARE.
/* NeXT's <unistd.h> and <utime.h> aren't worth much */
#undef HAVE_UNISTD_H
#undef HAVE_UTIME_H
+#define HAVE_WAITPID
/* #undef HAVE_GETCWD */
#endif
@@ -1168,7 +1169,11 @@ posix_waitpid(self, args)
if (!PyArg_Parse(args, "(ii)", &pid, &options))
return NULL;
Py_BEGIN_ALLOW_THREADS
+#ifdef NeXT
+ pid = wait4(pid, (union wait *)&sts, options, NULL);
+#else
pid = waitpid(pid, &sts, options);
+#endif
Py_END_ALLOW_THREADS
if (pid == -1)
return posix_error();
@@ -1185,7 +1190,11 @@ posix_wait(self, args)
{
int pid, sts;
Py_BEGIN_ALLOW_THREADS
+#ifdef NeXT
+ pid = wait((union wait *)&sts);
+#else
pid = wait(&sts);
+#endif
Py_END_ALLOW_THREADS
if (pid == -1)
return posix_error();
@@ -1616,6 +1625,84 @@ posix_ftruncate(self, args)
}
#endif
+#ifdef NeXT
+#define HAVE_PUTENV
+/* Steve Spicklemire got this putenv from NeXTAnswers */
+static int
+putenv(char *newval)
+{
+ extern char **environ;
+
+ static int firstTime = 1;
+ char **ep;
+ char *cp;
+ int esiz;
+ char *np;
+
+ if (!(np = strchr(newval, '=')))
+ return 1;
+ *np = '\0';
+
+ /* look it up */
+ for (ep=environ ; *ep ; ep++)
+ {
+ /* this should always be true... */
+ if (cp = strchr(*ep, '='))
+ {
+ *cp = '\0';
+ if (!strcmp(*ep, newval))
+ {
+ /* got it! */
+ *cp = '=';
+ break;
+ }
+ *cp = '=';
+ }
+ else
+ {
+ *np = '=';
+ return 1;
+ }
+ }
+
+ *np = '=';
+ if (*ep)
+ {
+ /* the string was already there:
+ just replace it with the new one */
+ *ep = newval;
+ return 0;
+ }
+
+ /* expand environ by one */
+ for (esiz=2, ep=environ ; *ep ; ep++)
+ esiz++;
+ if (firstTime)
+ {
+ char **epp;
+ char **newenv;
+ if (!(newenv = malloc(esiz * sizeof(char *))))
+ return 1;
+
+ for (ep=environ, epp=newenv ; *ep ;)
+ *epp++ = *ep++;
+ *epp++ = newval;
+ *epp = (char *) 0;
+ environ = newenv;
+ }
+ else
+ {
+ if (!(environ = realloc(environ, esiz * sizeof(char *))))
+ return 1;
+ environ[esiz - 2] = newval;
+ environ[esiz - 1] = (char *) 0;
+ firstTime = 0;
+ }
+
+ return 0;
+}
+#endif NeXT
+
#ifdef HAVE_PUTENV
static PyObject *
posix_putenv(self,args)