static void poll_fd_set(EsockPoll *ep, FD fd, short events) { int i, j; int prev_num_fds = ep->num_fds; if (ep->num_fds <= fd) { ep->num_fds = fd + 64; ep->fd_to_poll = (int *) esock_realloc(ep->fd_to_poll, ep->num_fds*sizeof(int)); for (j = prev_num_fds; j < ep->num_fds; j++) ep->fd_to_poll[j] = -1; } i = ep->fd_to_poll[fd]; if (i > 0 && i < ep->active && ep->fds[i].fd == fd) { /* Already present in poll array */ ep->fds[i].events |= events; } else { /* Append to poll array */ if (ep->active >= ep->allocated) { ep->allocated *= 2; ep->fds = (struct pollfd *) esock_realloc(ep->fds, ep->allocated*sizeof(struct pollfd)); } ep->fd_to_poll[fd] = ep->active; ep->fds[ep->active].fd = fd; ep->fds[ep->active].events = events; ep->fds[ep->active].revents = 0; ep->active++; } }
/* 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; }