static void stdin_read_callback_all (int arg, short what, struct event *self) { if (!readline_disabled) { if (((long)arg) & 1) { rl_callback_read_char (); } else { char *line = 0; size_t len = 0; assert (getline (&line, &len, stdin) >= 0); got_it (line, strlen (line)); } } else { while (1) { if (line_buffer_pos == line_buffer_size) { line_buffer = realloc (line_buffer, line_buffer_size * 2 + 100); assert (line_buffer); line_buffer_size = line_buffer_size * 2 + 100; assert (line_buffer); } int r = read (0, line_buffer + line_buffer_pos, line_buffer_size - line_buffer_pos); //logprintf ("r = %d, size = %d, pos = %d, what = 0x%x, fd = %d\n", r, line_buffer_size, line_buffer_pos, (int)what, fd); if (r < 0) { perror ("read"); delete_stdin_event = 1; break; } if (r == 0) { //struct event *ev = event_base_get_running_event (TLS->ev_base); //event_del (ev); //event_del (self); delete_stdin_event = 1; break; } line_buffer_pos += r; while (1) { int p = 0; while (p < line_buffer_pos && line_buffer[p] != '\n') { p ++; } if (p < line_buffer_pos) { if (((long)arg) & 1) { line_buffer[p] = 0; interpreter (line_buffer); } else { got_it (line_buffer, p + 1); } memmove (line_buffer, line_buffer + p + 1, line_buffer_pos - p - 1); line_buffer_pos -= (p + 1); } else { break; } } break; } } }
void net_loop (int flags, int (*is_end)(void)) { while (!is_end ()) { uSleep(10000); struct pollfd fds[101]; int cc = 0; if (flags & 3) { fds[0].fd = 0; fds[0].events = POLLIN; cc ++; } write_state_file (); int x = connections_make_poll_array (fds + cc, 101 - cc) + cc; double timer = next_timer_in (); if (timer > 1000) { timer = 1000; } if (poll (fds, x, timer) < 0) { work_timers (); continue; } work_timers (); if ((flags & 3) && (fds[0].revents & POLLIN)) { unread_messages = 0; if (flags & 1) { // rl_callback_read_char (); qthreadExec(); } else { char *line = 0; size_t len = 0; assert (getline (&line, &len, stdin) >= 0); got_it (line, strlen (line)); } } connections_poll_result (fds + cc, x - cc); #ifdef USE_LUA lua_do_all (); #endif if (safe_quit && !queries_num) { printf ("All done. Exit\n"); qthreadExitRequest (0); } if (unknown_user_list_pos) { do_get_user_list_info_silent (unknown_user_list_pos, unknown_user_list); unknown_user_list_pos = 0; } } }
void net_loop (int flags, int (*is_end)(void)) { while (!is_end ()) { struct pollfd fds[101]; int cc = 0; if (flags & 3) { fds[0].fd = 0; fds[0].events = POLLIN; cc ++; } write_state_file (); int x = connections_make_poll_array (fds + cc, 101 - cc) + cc; double timer = next_timer_in (); if (timer > 1000) { timer = 1000; } if (poll (fds, x, timer) < 0) { work_timers (); continue; } work_timers (); if ((flags & 3) && (fds[0].revents & POLLIN)) { unread_messages = 0; if (flags & 1) { rl_callback_read_char (); } else { char *line = 0; size_t len = 0; assert (getline (&line, &len, stdin) >= 0); got_it (line, strlen (line)); } } connections_poll_result (fds + cc, x - cc); if (unknown_user_list_pos) { do_get_user_list_info_silent (unknown_user_list_pos, unknown_user_list); unknown_user_list_pos = 0; } } }