summaryrefslogtreecommitdiff
path: root/netware/pipe.c
diff options
context:
space:
mode:
Diffstat (limited to 'netware/pipe.c')
-rw-r--r--netware/pipe.c329
1 files changed, 329 insertions, 0 deletions
diff --git a/netware/pipe.c b/netware/pipe.c
new file mode 100644
index 0000000000..c302fdf3e0
--- /dev/null
+++ b/netware/pipe.c
@@ -0,0 +1,329 @@
+/*
+ * FILENAME : pipe.c
+ * DESCRIPTION : Functions to implement pipes on NetWare.
+ * Author : Anantha Kesari H Y, Venkat Raghavan S, Srivathsa M
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "netware/pipe.h"
+#include "netware/mktemp.h"
+
+
+/* Following definitions unavailable in LibC, hence borrowed from CLib */
+#define P_WAIT 0
+#define P_NOWAIT 1
+
+#define WHITESPACE " \t"
+#define MAX_ARGS 10
+
+
+FILE* popen(const char* commandline, const char* mode)
+{
+ int err, count;
+ char pszPipestr[32] = {'\0'};
+ char *command = NULL, *argv[MAX_ARGS] = {'\0'};
+ int fd = -1;
+ fd_set myfds;
+ wiring_t wiring;
+ pid_t pid=0;
+ FILE *fp=NULL;
+ char *ptr = NULL;
+ int ptrLen = 0, argc = 0, i = 0;
+
+
+ /* Get a temporary name */
+ (void) tmpnam(strecpy(pszPipestr, "PHP/php$pipe/"));
+
+ wiring.infd=FD_UNUSED;
+ wiring.outfd=FD_UNUSED;
+ wiring.errfd=FD_UNUSED;
+
+ /* Open a pipe */
+ if ( *mode=='r') {
+ fd = pipe_open (pszPipestr, O_RDONLY);
+ if (fd == -1)
+ return NULL;
+
+ wiring.outfd=fd;
+ } else if (*mode=='w') {
+ fd = pipe_open (pszPipestr, O_WRONLY);
+ if (fd == -1)
+ return NULL;
+
+ wiring.infd=fd;
+ } else {
+ consoleprintf ("Unsupported pipe open mode \n");
+ return NULL;
+ }
+
+ /* Get the file pointer */
+ fp = fdopen(fd, mode);
+ if (fp == NULL) {
+ consoleprintf ("Failure in fdopen \n");
+ close (fd);
+ return NULL;
+ }
+
+ /* Separate commandline string into words */
+ ptr = strtok((char*)commandline, WHITESPACE);
+ ptrLen = strlen(ptr);
+
+ /* Get the command */
+ command = (char*)malloc(ptrLen + 1);
+ if(command == NULL) {
+ consoleprintf ("Failure in memory allocation \n");
+ close (fd);
+ fclose (fp);
+ return NULL;
+ }
+ strcpy (command, ptr);
+
+ /* Command as the first argument into prcessve */
+ argv[argc] = (char*)malloc(ptrLen + 1);
+ if(argv[argc] == NULL) {
+ consoleprintf ("Failure in memory allocation \n");
+ close (fd);
+ fclose (fp);
+ if(command) {
+ free(command);
+ command = NULL;
+ }
+ return NULL;
+ }
+ strcpy (argv[argc], ptr);
+ argc++;
+
+ /* Get more arguments if any to be passed to prcessve */
+ ptr = strtok(NULL, WHITESPACE);
+ while (ptr && (argc < MAX_ARGS))
+ {
+ ptrLen = strlen(ptr);
+
+ argv[argc] = (char*)malloc(ptrLen + 1);
+ if(argv[argc] == NULL) {
+ consoleprintf ("Failure in memory allocation \n");
+ close (fd);
+ fclose (fp);
+ if(command) {
+ free(command);
+ command = NULL;
+ }
+ return NULL;
+ }
+ strcpy (argv[argc], ptr);
+ argc++;
+
+ ptr = strtok(NULL, WHITESPACE);
+ }
+ argv[argc] = NULL;
+
+ FD_ZERO(&myfds);
+ FD_SET(fd, &myfds);
+
+ pid = processve(command, PROC_CURRENT_SPACE, NULL, &wiring,
+ &myfds, NULL, (const char **)argv );
+ if (pid == -1) {
+ consoleprintf ("Failure in processve call \n");
+ close (fd);
+ fclose(fp);
+ if(command) {
+ free(command);
+ command = NULL;
+ }
+ for(i=0; i<argc; i++) {
+ if(argv[i]) {
+ free(argv[i]);
+ argv[i] = NULL;
+ }
+ }
+ return NULL;
+ }
+
+ close (fd);
+ if(command) {
+ free(command);
+ command = NULL;
+ }
+ for(i=0; i<argc; i++) {
+ if(argv[i]) {
+ free(argv[i]);
+ argv[i] = NULL;
+ }
+ }
+
+ return fp;
+}
+
+
+int pclose(FILE* stream)
+{
+ fclose(stream);
+ return 0;
+}
+
+
+
+#if 0
+
+FILE* popen2(const char* commandline, const char* mode)
+{
+ int err, count, var, replaced;
+ char **env, pszPipestr[32];
+ NXVmId_t newVM;
+ NXExecEnvSpec_t envSpec;
+ char *command = NULL, *argv[MAX_ARGS] = {"\0"};
+ NXHandle_t fd;
+
+ fd = (NXHandle_t) -1;
+
+ count = NXGetEnvCount() + 1; // (add one for NULL)
+ env = (char **) NXMemAlloc(sizeof(char *) * count, 0);
+
+ if (!env)
+ return 0;
+
+ err = NXCopyEnv(env, count); // ensure NULL added at end
+ if ( *mode='r'){
+ (void) tmpnam(strecpy(pszPipestr, "PHPPIPE/stdin/"));
+ err = NXFifoOpen(0, pszPipestr, NX_O_RDONLY, 0, &fd);
+ if (err)
+ return 0;
+
+ envSpec.esStdin.ssType = NX_OBJ_CONSOLE;
+ envSpec.esStdout.ssType = NX_OBJ_FIFO;
+ envSpec.esStdout.ssPath = pszPipestr;
+ }
+ else if (*mode='w') then{
+ (void) tmpnam(strecpy(pszPipestr, "PHPPIPE/stdout/"));
+ err = NXFifoOpen(0, instr, NX_O_WRONLY, 0, &fd);
+ if (err)
+ return 0;
+ envSpec.esStdin.ssType = NX_OBJ_FIFO;
+ envSpec.esStdout.ssType = NX_OBJ_CONSOLE;
+ envSpec.esStdin.ssPath = pszPipestr;
+ }
+ else
+ consoleprintf ("Unsupported pipe open mode \n");
+
+
+ /* Separate commandline string into words */
+
+ ptr = strtok((char*)commandline, WHITESPACE);
+ ptrLen = strlen(ptr);
+
+ command = (char*)malloc(ptrLen + 1);
+ strcpy (command, ptr);
+
+ ptr = strtok(NULL, WHITESPACE);
+ while (ptr && (argc < MAX_ARGS))
+ {
+ ptrLen = strlen(ptr);
+
+ argv[argc] = (char*)malloc(ptrLen + 1);
+ strcpy (argv[argc], ptr);
+
+ argc++;
+
+ ptr = strtok(NULL, WHITESPACE);
+ }
+/* consoleprintf ("PHP | popen: command = %s\n", command); */
+
+ //
+
+ envSpec.esArgc = argc;
+ envSpec.esArgv = argv;
+ envSpec.esEnv = env;
+
+ envSpec.esStderr.ssType = NX_OBJ_CONSOLE;
+
+ envSpec.esStdin.ssHandle =
+ envSpec.esStdout.ssHandle =
+ envSpec.esStderr.ssHandle = -1;
+
+ envSpec.esStdin.ssPathCtx =
+ envSpec.esStdout.ssPathCtx =
+ envSpec.esStderr.ssPathCtx = NULL;
+
+ envSpec.esStderr.ssPath = NULL;
+
+ err = NXVmSpawn(NULL, command, &envSpec, NX_VM_CREATE_DETACHED, &newVM);
+ return fd;
+
+}
+
+int pclose2(FILE* stream)
+{
+ NXClose(*(NXHandle_t *)stream);
+ return 0;
+}
+
+FILE* popen1(const char* commandline, const char* mode)
+{
+ char *command = NULL, *argv[MAX_ARGS] = {"\0"};
+ char *tempName = "phpXXXXXX.tmp";
+ char *filePath = NULL;
+ FILE *fp = NULL;
+ char *ptr = NULL;
+ int ptrLen = 0, argc = 0, i = 0;
+
+ /* Check for validity of input parameters */
+ if (!commandline || !mode)
+ return NULL;
+
+ /* Get temporary file name */
+ filePath = mktemp(tempName);
+ if (!filePath)
+ return NULL;
+
+ /* Separate commandline string into words */
+
+ ptr = strtok((char*)commandline, WHITESPACE);
+ ptrLen = strlen(ptr);
+
+ command = (char*)malloc(ptrLen + 1);
+ strcpy (command, ptr);
+
+ ptr = strtok(NULL, WHITESPACE);
+ while (ptr && (argc < MAX_ARGS))
+ {
+ ptrLen = strlen(ptr);
+
+ argv[argc] = (char*)malloc(ptrLen + 1);
+ strcpy (argv[argc], ptr);
+
+ argc++;
+
+ ptr = strtok(NULL, WHITESPACE);
+ }
+/*consoleprintf ("PHP | popen: command = %s\n", command);*/
+ if(strchr(mode,'r') != 0)
+ {
+ /*spawnvp(P_WAIT, command, argv);*/
+
+ fp = fopen(filePath, "r"); /* Get the file handle of the pipe */
+ }
+ else if(strchr(mode,'w') != 0)
+ fp = fopen(filePath, "w"); /* Get the file handle of the pipe */
+
+ /* Free resources */
+ free (command);
+ for (i = 0; i < argc; i++)
+ {
+/*consoleprintf ("%s\t", argv[i]);*/
+ free (argv[i]);
+ }
+/*consoleprintf ("\n");*/
+
+ return fp; /* Return the file handle.*/
+}
+
+int pclose1(FILE* stream)
+{
+ return (fclose(stream));
+}
+
+# endif