int initialize_main(int * argc, char *** argv, char * delim) { char stringToParse [ MAX_LENGTH ]; if (fgets(stringToParse, sizeof(stringToParse), stdin) == NULL) { printf("initialize_main : There is no string to parse !"); return 0; } if (stringToParse==NULL) { printf("initialize_main : There is no string to parse !"); return 0; } removeEndCharacters(stringToParse); // Replace '\r' and '\n' by '\0'. Only the first line of the file will be parsed. char * string = strdup(stringToParse); int nbrArguments = countArguments (&string, delim) + 1 ; // Later : *argc = nbrArguments; if (nbrArguments<=1) { printf("initialize_main : There is no arguments ! "); return 0; } char ** tab = malloc(nbrArguments*sizeof(char*)); // Later : *argv = tab; int i = 0; *(tab + i) = "padding***CommandWichLaunchedThisExecutable***"; i = i+1; // i==1 char * stringTemp = strsep(&string, delim); while (stringTemp!=NULL) { if (*stringTemp != '\0') { *(tab + i) = strdup(stringTemp); i=i+1; } stringTemp = strsep(&string, delim); } if(i==1) { printf("initialize_main : There is no arguments ! "); return 0; } *argc = nbrArguments; *argv = tab; free(string); return 0; }
/* * Iterate through the passed name=value pairs * and construct extArg structs for each of them. * * Add them to the array of extArg structs inside * the req struct */ int parseArguments(struct extRequest *req) { char **array, **arrayStep; if (cgiFormEntries(&array) != cgiFormSuccess) { return 0; } int num_args = countArguments(); int arg_num = 0; req->numargs = num_args; /* make req->args big enough to hold all the extArg structs */ req->args = (struct extArg **)malloc(sizeof(struct extArg)*num_args); arrayStep = array; int val_size = 0; char *val; while (*arrayStep) { /* If the name is not a URL, method, or callback, we need to add it */ if(strcmp(*arrayStep, URL_PARAM_NAME) != 0 && strcmp(*arrayStep, CALLBACK_PARAM_NAME) != 0) { /* Get the length of the passed string so our buffer is big enough. */ cgiFormStringSpaceNeeded(*arrayStep, &val_size); val = (char*)malloc(sizeof(char)*val_size); cgiFormString(*arrayStep, val, val_size); req->args[arg_num++] = makeArg(*arrayStep, val); /* The val has been passed to makeArg, so free it */ free(val); } arrayStep++; } cgiStringArrayFree(array); return 1; }
void initJobInfoFromString( JobInfo* jobinfo, const char* commandline ) /* purpose: initialize the data structure with default * paramtr: jobinfo (OUT): initialized memory block * commandline (IN): commandline concatenated string to separate */ { size_t i; char* t; #ifdef USE_PARSE int state = 0; Node* head = parseCommandLine( commandline, &state ); #else char* s; #endif /* reset everything */ memset( jobinfo, 0, sizeof(JobInfo) ); #ifdef USE_PARSE /* only continue in ok state AND if there is anything to do */ if ( state == 32 && head ) { size_t size, argc = size = 0; Node* temp = head; while ( temp ) { size += (strlen(temp->data) + 1); argc++; temp = temp->next; } /* prepare copy area */ jobinfo->copy = (char*) malloc( size+argc ); /* prepare argument vector */ jobinfo->argc = argc; jobinfo->argv = (char* const*) calloc( argc+1, sizeof(char*) ); /* copy list while updating argument vector and freeing lose arguments */ t = jobinfo->copy; for ( i=0; i < argc && (temp=head); ++i ) { /* append string to copy area */ size_t len = strlen(temp->data)+1; memcpy( t, temp->data, len ); /* I hate nagging compilers which think they know better */ memcpy( (void*) &jobinfo->argv[i], &t, sizeof(char*) ); t += len; /* clear parse list while we are at it */ head = temp->next; free((void*) temp->data ); free((void*) temp ); } } /* free list of (partial) argv */ if ( head ) deleteNodes(head); #else /* activate copy area */ jobinfo->copy = strdup( commandline ? commandline : "" ); /* prepare argv buffer for arguments */ jobinfo->argc = countArguments(commandline); jobinfo->argv = (char* const*) calloc( 1+jobinfo->argc, sizeof(char*) ); /* copy argument positions into pointer vector */ for ( i=0, s=jobinfo->copy; *s && i < jobinfo->argc; i++ ) { while ( *s && isspace(*s) ) *s++ = '\0'; t = s; while ( *s && ! isspace(*s) ) ++s; jobinfo->argv[i] = t; } /* remove possible trailing whitespaces */ while ( *s && isspace(*s) ) *s++ = '\0'; /* finalize vector */ jobinfo->argv[i] = NULL; #endif /* this is a valid (and initialized) entry */ if ( jobinfo->argc > 0 ) { /* check out path to job */ char* realpath = findApp( jobinfo->argv[0] ); if ( realpath ) { /* I hate nagging compilers which think they know better */ memcpy( (void*) &jobinfo->argv[0], &realpath, sizeof(char*) ); jobinfo->isValid = 1; } else { jobinfo->status = -127; jobinfo->saverr = errno; jobinfo->isValid = 2; } /* initialize some data for myself */ initStatInfoFromName( &jobinfo->executable, jobinfo->argv[0], O_RDONLY, 0 ); } }