/* Builds an argv array from cmd. Spaces and tabs within double quotes * are not considered delimiters. Double quotes are removed. * * The return value is argc, and the pointer to char ** is set. argc * is non-negative, argv[0], ..., argv[argc - 1] are pointers to * strings, and argv[argc] == NULL. All argv[0], ..., argv[argc - 1] * must be freed by the user, and also the argv pointer itself. * * Example: cmd = abc"/program files/"olle nisse, results in * argv[0] = abc/program files/olle, argv[1] = nisse, argc = 2. * */ int esock_build_argv(char *cmd, char ***argvp) { int argvsize = 10, argc = 0; char *args, *tokp, *argp; char **argv; argv = esock_malloc(argvsize * sizeof(char *)); args = esock_malloc(strlen(cmd) + 1); strcpy(args, cmd); tokp = strtok_quote(args, " \t"); while (tokp != NULL) { if (argc + 1 >= argvsize) { argvsize += 10; argv = esock_realloc(argv, argvsize * sizeof(char *)); } argp = esock_malloc(strlen(tokp) + 1); strcpy(argp, tokp); argv[argc++] = argp; tokp = strtok_quote(NULL, " \t"); } esock_free(args); argv[argc] = NULL; *argvp = argv; return argc; }
void esock_poll_init(EsockPoll *ep) { #ifdef USE_SELECT /* Nothing to do here */ #else ep->allocated = 2; ep->fds = (struct pollfd *) esock_malloc(ep->allocated*sizeof(struct pollfd)); ep->num_fds = 1; ep->fd_to_poll = esock_malloc(ep->num_fds*sizeof(int)); #endif }