Why could the printf statements on lines 4 and 9 causing a segmentation fault?
while (i) {
    fd_set select_fds = all_fds;
    printf("waiting...\n");
    if (select(max_fd + 1, &select_fds, NULL, NULL, NULL) == -1) {
        perror("server: select");
        exit(1);
    }
    printf("done waiting\n");
    if (FD_ISSET(client_fd, &select_fds)) {
        if (readn(client_fd, buffer, BUFSIZE - 1) == 0) {
            printf("client disconnected\n");
            break;
        }
        char *cmd_argv[INPUT_ARG_MAX_NUM];
        int cmd_argc = tokenize(buffer, cmd_argv);
        printf("cmd_argc: %d, cmd_argv[0]: %s | cmd_argv[1]: %s\n", cmd_argc, cmd_argv[0], cmd_argv[1]);
        fflush(stdout);
        printf("user: %s\n", user_list->name);
        fflush(stdout);

        if (cmd_argc > 0 && process_args(cmd_argc, cmd_argv, &user_list, user_name) == -1) {
            break;
        }

        printf("> ");
    }

    i = 0;
}
return 0;
}