Annotation of embedaddon/php/TSRM/tsrm_nw.c, revision 1.1

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | PHP Version 5                                                        |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 1997-2012 The PHP Group                                |
        !             6:    +----------------------------------------------------------------------+
        !             7:    | This source file is subject to version 3.01 of the PHP license,      |
        !             8:    | that is bundled with this package in the file LICENSE, and is        |
        !             9:    | available through the world-wide-web at the following url:           |
        !            10:    | http://www.php.net/license/3_01.txt                                  |
        !            11:    | If you did not receive a copy of the PHP license and are unable to   |
        !            12:    | obtain it through the world-wide-web, please send a note to          |
        !            13:    | license@php.net so we can mail you a copy immediately.               |
        !            14:    +----------------------------------------------------------------------+
        !            15:    | Authors: Venkat Raghavan S <rvenkat@novell.com>                      |
        !            16:    |          Anantha Kesari H Y <hyanantha@novell.com>                   |
        !            17:    +----------------------------------------------------------------------+
        !            18: */
        !            19: 
        !            20: /* $Id: tsrm_nw.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            21: 
        !            22: #include <stdlib.h>
        !            23: #include <stdio.h>
        !            24: #include <fcntl.h>
        !            25: 
        !            26: #include "TSRM.h"
        !            27: 
        !            28: #ifdef NETWARE
        !            29: 
        !            30: #ifdef USE_MKFIFO
        !            31: #include <sys/stat.h>
        !            32: #elif !defined(USE_PIPE_OPEN)   /* NXFifoOpen */
        !            33: #include <nks/fsio.h>
        !            34: #endif
        !            35: 
        !            36: #include <nks/vm.h>
        !            37: #include <nks/memory.h>
        !            38: 
        !            39: #include <string.h>
        !            40: 
        !            41: #include "mktemp.h"
        !            42: 
        !            43: /* strtok() call in LibC is abending when used in a different address space
        !            44:  * -- hence using PHP's version itself for now
        !            45:  */
        !            46: #include "tsrm_strtok_r.h"
        !            47: #define tsrm_strtok_r(a,b,c) strtok((a),(b))
        !            48: 
        !            49: #define WHITESPACE  " \t"
        !            50: #define MAX_ARGS    10
        !            51: 
        !            52: 
        !            53: TSRM_API FILE* popen(const char *commandline, const char *type)
        !            54: {
        !            55:        char *command = NULL, *argv[MAX_ARGS] = {'\0'}, **env = NULL;
        !            56:        char *tempName = "sys:/php/temp/phpXXXXXX.tmp";
        !            57:        char *filePath = NULL;
        !            58:        char *ptr = NULL;
        !            59:        int ptrLen = 0, argc = 0, i = 0, envCount = 0, err = 0;
        !            60:        FILE *stream = NULL;
        !            61: #if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
        !            62:        int pipe_handle;
        !            63:        int mode = O_RDONLY;
        !            64: #else
        !            65:        NXHandle_t pipe_handle;
        !            66:        NXMode_t mode = NX_O_RDONLY;
        !            67: #endif
        !            68:        NXExecEnvSpec_t envSpec;
        !            69:        NXNameSpec_t nameSpec;
        !            70:        NXVmId_t newVM = 0;
        !            71: 
        !            72:        /* Check for validity of input parameters */
        !            73:        if (!commandline || !type)
        !            74:                return NULL;
        !            75: 
        !            76:        /* Get temporary file name */
        !            77:        filePath = mktemp(tempName);
        !            78:        if (!filePath)
        !            79:                return NULL;
        !            80: 
        !            81:        /* Set pipe mode according to type -- for now allow only "r" or "w" */
        !            82:        if (strcmp(type, "r") == 0)
        !            83: #if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
        !            84:                mode = O_RDONLY;
        !            85: #else
        !            86:                mode = NX_O_RDONLY;
        !            87: #endif
        !            88:        else if (strcmp(type, "w") == 0)
        !            89: #if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
        !            90:                mode = O_WRONLY;
        !            91: #else
        !            92:                mode = NX_O_WRONLY;
        !            93: #endif
        !            94:        else
        !            95:                return NULL;
        !            96: 
        !            97: #ifdef USE_PIPE_OPEN
        !            98:        pipe_handle = pipe_open(filePath, mode);
        !            99:        if (pipe_handle == -1)
        !           100:                return NULL;
        !           101: #elif defined(USE_MKFIFO)
        !           102:        pipe_handle = mkfifo(filePath, mode);
        !           103:        if (pipe_handle == -1)
        !           104:                return NULL;
        !           105: #else
        !           106:        /* - NetWare doesn't require first parameter
        !           107:         * - Allowing LibC to choose the buffer size for now
        !           108:         */
        !           109:        err = NXFifoOpen(0, filePath, mode, 0, &pipe_handle);
        !           110:        if (err)
        !           111:                return NULL;
        !           112: #endif
        !           113: 
        !           114:        /* Copy the environment variables in preparation for the spawn call */
        !           115:        envCount = NXGetEnvCount() + 1;  /* add one for NULL */
        !           116:        env = (char **) NXMemAlloc(sizeof(char *) * envCount, 0);
        !           117:        if (!env)
        !           118:                return NULL;
        !           119: 
        !           120:        err = NXCopyEnv(env, envCount);
        !           121:        if (err) {
        !           122:                NXMemFree (env);
        !           123:                return NULL;
        !           124:        }
        !           125: 
        !           126:        /* Separate commandline string into words */
        !           127:        ptr = tsrm_strtok_r((char*)commandline, WHITESPACE, NULL);
        !           128:        ptrLen = strlen(ptr);
        !           129: 
        !           130:        command = (char*)malloc(ptrLen + 1);
        !           131:        if (!command) {
        !           132:                NXMemFree (env);
        !           133:                return NULL;
        !           134:        }
        !           135: 
        !           136:        strcpy (command, ptr);
        !           137: 
        !           138:        ptr = tsrm_strtok_r(NULL, WHITESPACE, NULL);
        !           139:        while (ptr && (argc < MAX_ARGS)) {
        !           140:                ptrLen = strlen(ptr);
        !           141: 
        !           142:                argv[argc] = (char*)malloc(ptrLen + 1);
        !           143:                if (!argv[argc]) {
        !           144:                        NXMemFree (env);
        !           145:                        if (command)
        !           146:                                free (command);
        !           147: 
        !           148:                        for (i = 0; i < argc; i++) {
        !           149:                                if (argv[i])
        !           150:                                        free (argv[i]);
        !           151:                        }
        !           152: 
        !           153:                        return NULL;
        !           154:                }
        !           155: 
        !           156:                strcpy (argv[argc], ptr);
        !           157:                argc++;
        !           158:                ptr = tsrm_strtok_r(NULL, WHITESPACE, NULL);
        !           159:        }
        !           160: 
        !           161:        /* Setup the execution environment and spawn new process */
        !           162:        envSpec.esFlags = 0;    /* Not used */
        !           163:        envSpec.esArgc = argc;
        !           164:        envSpec.esArgv = (void **) argv;
        !           165:        envSpec.esEnv = (void **) env;
        !           166: 
        !           167: /*     envSpec.esStdin.ssType = */
        !           168:        envSpec.esStdout.ssType = NX_OBJ_FIFO;
        !           169:        envSpec.esStderr.ssType = NX_OBJ_FILE;
        !           170: 
        !           171:        /* 'ssHandle' is not a struct/union/class member */
        !           172: /*
        !           173:        envSpec.esStdin.ssHandle =
        !           174:        envSpec.esStdout.ssHandle =
        !           175:        envSpec.esStderr.ssHandle = -1;
        !           176: */
        !           177:        envSpec.esStdin.ssPathCtx = NULL;
        !           178:        envSpec.esStdout.ssPathCtx = NULL;
        !           179:        envSpec.esStderr.ssPathCtx = NULL;
        !           180: 
        !           181: #if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
        !           182:        if (mode == O_RDONLY) {
        !           183: #else
        !           184:        if (mode == NX_O_RDONLY) {
        !           185: #endif
        !           186:                envSpec.esStdin.ssPath = filePath;
        !           187:                envSpec.esStdout.ssPath = stdout;
        !           188:        } else { /* Write Only */
        !           189:                envSpec.esStdin.ssPath = stdin;
        !           190:                envSpec.esStdout.ssPath = filePath;
        !           191:        }
        !           192: 
        !           193:        envSpec.esStderr.ssPath = stdout;
        !           194: 
        !           195:        nameSpec.ssType = NX_OBJ_FIFO;
        !           196: /*     nameSpec.ssHandle = 0; */       /* 'ssHandle' is not a struct/union/class member */
        !           197:        nameSpec.ssPathCtx = NULL;  /* Not used */
        !           198:        nameSpec.ssPath = argv[0];
        !           199:        err = NXVmSpawn(&nameSpec, &envSpec, 0, &newVM);
        !           200:        if (!err)
        !           201:                /* Get file pointer corresponding to the pipe (file) opened */
        !           202:                stream = fdopen(pipe_handle, type);
        !           203: 
        !           204:        /* Clean-up */
        !           205:        if (env)
        !           206:                NXMemFree (env);
        !           207: 
        !           208:        if (pipe_handle)
        !           209: #if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
        !           210:                close(pipe_handle);
        !           211: #else
        !           212:                NXClose(pipe_handle);
        !           213: #endif
        !           214: 
        !           215:        if (command)
        !           216:                free (command);
        !           217: 
        !           218:        for (i = 0; i < argc; i++) {
        !           219:                if (argv[i])
        !           220:                        free (argv[i]);
        !           221:        }
        !           222: 
        !           223:        return stream;
        !           224: }
        !           225: 
        !           226: TSRM_API int pclose(FILE* stream)
        !           227: {
        !           228:        int err = 0;
        !           229:        NXHandle_t fd = 0;
        !           230: 
        !           231:        /* Get the process associated with this pipe (file) handle and terminate it */
        !           232:        fd = fileno(stream);
        !           233:        NXClose (fd);
        !           234: 
        !           235:        err = fclose(stream);
        !           236: 
        !           237:        return err;
        !           238: }
        !           239: 
        !           240: #endif /* NETWARE */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>