// main client handler procedure, runs in its own thread void * thread_proc(void * param) { CLIENT_INFO client_info; memset(&client_info, 0, sizeof(client_info)); client_info.fd = (int)param; strcpy(client_info.dir, "/"); send_code(client_info.fd, 220); while (1) { int result = client_read(client_info.fd, client_info.buf, &client_info.buffer_pos); if (result == -1) break; while (client_info.buffer_pos >= 4) { char line[BUFFER_SIZE] = { 0 }; if (compare_command(client_info.buf, "USER")) command_user(&client_info); else if (compare_command(client_info.buf, "PASS")) command_pass(&client_info); else if (compare_command(client_info.buf, "PWD")) command_pwd(&client_info); else if (compare_command(client_info.buf, "PORT")) command_port(&client_info); else if (compare_command(client_info.buf, "PASV")) command_pasv(&client_info); else if (compare_command(client_info.buf, "LIST")) command_list(&client_info); else if (compare_command(client_info.buf, "CWD")) command_cwd(&client_info); else if (compare_command(client_info.buf, "RETR")) command_retr(&client_info); else if (compare_command(client_info.buf, "NOOP")) command_noop(&client_info); else if (compare_command(client_info.buf, "SYST")) command_syst(&client_info); else if (compare_command(client_info.buf, "TYPE")) command_type(&client_info); else if (compare_command(client_info.buf, "QUIT")) { get_line(client_info.fd, line, client_info.buf, &client_info.buffer_pos); send_code(client_info.fd, 221); close(client_info.fd); client_info.fd = 0; return NULL; } else { get_line(client_info.fd, line, client_info.buf, &client_info.buffer_pos); send_code(client_info.fd, 500); } } } if (client_info.fd != 0) { close(client_info.fd); client_info.fd = 0; } return NULL; }
void command_allo(char *foo) { command_noop(foo); }