예제 #1
0
파일: esock_poll.c 프로젝트: AlainODea/otp
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++;
    }
}
예제 #2
0
/* 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;
}