int prPipeOpen(struct VMGlobals *g, int numArgsPushed) { PyrSlot *a, *b, *c; char mode[12]; PyrFile *pfile; FILE *file; a = g->sp - 2; b = g->sp - 1; c = g->sp; if (NotObj(c) || !isKindOf(slotRawObject(c), class_string) || NotObj(b) || !isKindOf(slotRawObject(b), class_string)) return errWrongType; if (slotRawObject(c)->size > 11) return errFailed; pfile = (PyrFile*)slotRawObject(a); char *commandLine = (char*)malloc(slotRawObject(b)->size + 1); memcpy(commandLine, slotRawString(b)->s, slotRawObject(b)->size); commandLine[slotRawString(b)->size] = 0; memcpy(mode, slotRawString(c)->s, slotRawObject(c)->size); mode[slotRawString(c)->size] = 0; pid_t pid; file = sc_popen(commandLine, &pid, mode); free(commandLine); if (file) { SetPtr(&pfile->fileptr, file); SetInt(a, pid); } else { SetNil(a); } return errNone; }
int prString_POpen(struct VMGlobals *g, int numArgsPushed) { struct sc_process *process; PyrSlot *a = g->sp - 1; PyrSlot *b = g->sp; int err; if (!isKindOfSlot(a, class_string)) return errWrongType; char *cmdline = (char*)malloc(a->uo->size + 1); err = slotStrVal(a, cmdline, a->uo->size + 1); if(err) { free(cmdline); return errFailed; } #ifdef SC_IPHONE SetInt(a, 0); return errNone; #endif process = (struct sc_process *)malloc(sizeof(struct sc_process)); process->stream = sc_popen(cmdline, &process->pid, "r"); setvbuf(process->stream, 0, _IONBF, 0); process->postOutput = IsTrue(b); free(cmdline); if(process->stream == NULL) { free(process); return errFailed; } pthread_t thread; pthread_create(&thread, NULL, string_popen_thread_func, (void*)process); pthread_detach(thread); SetInt(a, process->pid); return errNone; }