GWEN_PROCESS_STATE GWEN_Process_Start(GWEN_PROCESS *pr, const char *prg, const char *args) { pid_t pid; char *argv[32]; int argc; const char *p, *p2; GWEN_BUFFER *wbuf; assert(pr); if (GWEN_Process_Redirect(pr)) { DBG_ERROR(GWEN_LOGDOMAIN, "Could not setup redirections"); pr->state=GWEN_ProcessStateNotStarted; pr->pid=-1; return GWEN_ProcessStateNotStarted; } pid=fork(); if (pid==-1) { /* error in fork */ pr->state=GWEN_ProcessStateNotStarted; pr->pid=-1; /* close all pipes */ if (pr->filesStdin[0]!=-1) { close(pr->filesStdin[0]); close(pr->filesStdin[1]); } if (pr->filesStdout[0]!=-1) { close(pr->filesStdout[0]); close(pr->filesStdout[1]); } if (pr->filesStderr[0]!=-1) { close(pr->filesStderr[0]); close(pr->filesStderr[1]); } return GWEN_ProcessStateNotStarted; } else if (pid!=0) { /* parent */ DBG_INFO(GWEN_LOGDOMAIN, "Process started with id %d", (int)pid); pr->state=GWEN_ProcessStateRunning; pr->pid=pid; /* setup redirections */ if (pr->filesStdin[0]!=-1) { close(pr->filesStdin[1]); pr->stdIn=GWEN_SyncIo_File_fromFd(pr->filesStdin[0]); } if (pr->filesStdout[0]!=-1) { close(pr->filesStdout[1]); pr->stdOut=GWEN_SyncIo_File_fromFd(pr->filesStdout[0]); } if (pr->filesStderr[0]!=-1) { close(pr->filesStderr[1]); pr->stdErr=GWEN_SyncIo_File_fromFd(pr->filesStdout[0]); } return GWEN_ProcessStateRunning; } /* child, build arguments */ argc=0; DBG_DEBUG(GWEN_LOGDOMAIN, "I'm the child process"); /* setup redirections */ if (pr->filesStdin[0]!=-1) { close(pr->filesStdin[0]); close(0); if (dup(pr->filesStdin[1])==-1) { DBG_ERROR(GWEN_LOGDOMAIN, "Could not setup redirection"); } } if (pr->filesStdout[0]!=-1) { close(pr->filesStdout[0]); close(1); if (dup(pr->filesStdout[1])==-1) { DBG_ERROR(GWEN_LOGDOMAIN, "Could not setup redirection"); } } if (pr->filesStderr[0]!=-1) { close(pr->filesStderr[0]); close(2); if (dup(pr->filesStderr[1])==-1) { DBG_ERROR(GWEN_LOGDOMAIN, "Could not setup redirection"); } } argv[0]=strdup(prg); argc++; p=args; wbuf=GWEN_Buffer_new(0, 256, 0, 1); while(argc<32 && *p) { while(*p && isspace((int)*p)) p++; if (!(*p)) break; if (GWEN_Text_GetWordToBuffer(p, " ", wbuf, GWEN_TEXT_FLAGS_NULL_IS_DELIMITER | GWEN_TEXT_FLAGS_DEL_QUOTES | GWEN_TEXT_FLAGS_CHECK_BACKSLASH, &p)) break; p2=GWEN_Buffer_GetStart(wbuf); argv[argc]=strdup(p2); GWEN_Buffer_Reset(wbuf); argc++; } /* while */ GWEN_Buffer_free(wbuf); argv[argc]=0; /* parameters ready, exec */ execvp(prg, argv); /* if we reach this point an error occurred */ DBG_ERROR(GWEN_LOGDOMAIN, "Could not start program \"%s\": %s", prg, strerror(errno)); exit(EXIT_FAILURE); }
static int readTestData(GWEN_DIALOG *dlg) { AB_CSV_EDIT_PROFILE_DIALOG *xdlg; GWEN_SYNCIO *sio; GWEN_SYNCIO *baseIo; GWEN_BUFFER *dbuf; int i; int ignoreLines=0; int rv; const char *delimiter; GWEN_BUFFER *wbuffer; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_CSV_EDIT_PROFILE_DIALOG, dlg); assert(xdlg); GWEN_StringList_Clear(xdlg->columns); /* create file IO */ sio=GWEN_SyncIo_File_new(xdlg->testFileName, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); baseIo=sio; /* create buffered IO on top of file io to allow for reading of lines below */ sio=GWEN_SyncIo_Buffered_new(baseIo); dbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* skip lines */ ignoreLines=GWEN_Dialog_GetIntProperty(dlg, "ignoreLinesSpin", GWEN_DialogProperty_Value, 0, 0); i=GWEN_Dialog_GetIntProperty(dlg, "headerCheck", GWEN_DialogProperty_Value, 0, 0); if (i) ignoreLines++; delimiter=getCharValueFromDoubleStringsCombo(dlg, "delimiterCombo", csv_delimiters); if (!(delimiter && *delimiter)) delimiter="TAB"; if (strcasecmp(delimiter, "TAB")==0) delimiter="\t"; else if (strcasecmp(delimiter, "SPACE")==0) delimiter=" "; /* open file */ rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); GWEN_SyncIo_free(sio); return rv; } for (i=0; i<ignoreLines; i++) { rv=GWEN_SyncIo_Buffered_ReadLineToBuffer(sio, dbuf); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading: %d", rv); GWEN_Buffer_free(dbuf); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } GWEN_Buffer_Reset(dbuf); } /* read single data line */ rv=GWEN_SyncIo_Buffered_ReadLineToBuffer(sio, dbuf); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading: %d", rv); GWEN_Buffer_free(dbuf); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } GWEN_Dialog_SetCharProperty(dlg, "dataEdit", GWEN_DialogProperty_Value, 0, GWEN_Buffer_GetStart(dbuf), 0); /* we don't need the io layer any longer */ GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); wbuffer=GWEN_Buffer_new(0, 256, 0, 1); s=GWEN_Buffer_GetStart(dbuf); while (*s) { rv=GWEN_Text_GetWordToBuffer(s, delimiter, wbuffer, GWEN_TEXT_FLAGS_DEL_LEADING_BLANKS | GWEN_TEXT_FLAGS_DEL_TRAILING_BLANKS | GWEN_TEXT_FLAGS_NULL_IS_DELIMITER | GWEN_TEXT_FLAGS_DEL_QUOTES, &s); if (rv) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(wbuffer); GWEN_Buffer_free(dbuf); return rv; } GWEN_StringList_AppendString(xdlg->columns, GWEN_Buffer_GetStart(wbuffer), 0, 0); GWEN_Buffer_Reset(wbuffer); if (*s) { if (strchr(delimiter, *s)) s++; } } /* while */ GWEN_Buffer_free(wbuffer); for (i=0; i<DIALOG_MAX_COLUMNS; i++) { char editName[32]; snprintf(editName, sizeof(editName)-1, "col%dDataEdit", i+1); s=GWEN_StringList_StringAt(xdlg->columns, i); if (s==NULL) break; GWEN_Dialog_SetCharProperty(dlg, editName, GWEN_DialogProperty_Value, 0, s, 0); } return 0; }