int prPipeClose(struct VMGlobals *g, int numArgsPushed)
{
	PyrSlot *a;
	PyrSlot *b;
	PyrFile *pfile;
	FILE *file;
	pid_t pid;

	a = g->sp - 1;
	b = g->sp;
	pfile = (PyrFile*)slotRawObject(a);
	file = (FILE*)slotRawPtr(&pfile->fileptr);
	if (file == NULL) return errNone;
	pid = (pid_t) slotRawInt(b);

	SetPtr(&pfile->fileptr, NULL);
	int perr = sc_pclose(file, pid);
	SetInt(a, perr);
	if (perr == -1)
		return errFailed;
	return errNone;
}
Example #2
0
void* string_popen_thread_func(void *data)
{
	struct sc_process *process = (struct sc_process *)data;
	FILE *stream = process->stream;
	pid_t pid = process->pid;
	char buf[1024];

	while (process->postOutput) {
		char *string = fgets(buf, 1024, stream);
		if (!string) break;
		postText(string, strlen(string));
	}

	int res;
	res = sc_pclose(stream, pid);
	res = WEXITSTATUS(res);

	if(process->postOutput)
		post("RESULT = %d\n", res);

	free(process);

    pthread_mutex_lock (&gLangMutex);
    if(compiledOK) {
		VMGlobals *g = gMainVMGlobals;
		g->canCallOS = true;
		++g->sp;  SetObject(g->sp, class_string);
		++g->sp; SetInt(g->sp, res);
		++g->sp; SetInt(g->sp, pid);
		runInterpreter(g, s_unixCmdAction, 3);
		g->canCallOS = false;
	}
    pthread_mutex_unlock (&gLangMutex);

	return 0;
}