/* note: this function can free the tr_web if its 'closing' flag is set and no tasks remain. callers must not reference their g pointer after calling this function */ static void tr_multi_socket_action( tr_web * g, int fd, int mask ) { int closed = FALSE; CURLMcode rc; dbgmsg( "check_run_count: prev_running %d, still_running %d", g->prev_running, g->still_running ); /* invoke libcurl's processing */ do { rc = curl_multi_socket_action( g->multi, fd, mask, &g->still_running ); dbgmsg( "event_cb(): fd %d, mask %d, still_running is %d", fd, mask, g->still_running ); } while( rc == CURLM_CALL_MULTI_PERFORM ); if( rc != CURLM_OK ) tr_err( "%s", curl_multi_strerror( rc ) ); remove_finished_tasks( g ); add_tasks_from_queue( g ); if( !g->still_running ) { stop_timer( g ); if( g->closing ) { web_close( g ); closed = TRUE; } } if( !closed ) restart_timer( g ); }
static void wo_shutdown(char *url) { parse_asp("shutdown.asp"); web_close(); sleep(1); kill(1, SIGQUIT); }
static void wo_nvcommit(char *url) { parse_asp("saved.asp"); web_close(); nvram_commit(); }
static void wo_tomato(char *url) { char *v; int i; int ajax; int nvset; const char *red; int commit; // _dprintf("tomato.cgi\n"); red = webcgi_safeget("_redirect", ""); if (!*red) send_header(200, NULL, mime_html, 0); commit = atoi(webcgi_safeget("_commit", "1")); ajax = atoi(webcgi_safeget("_ajax", "0")); nvset = atoi(webcgi_safeget("_nvset", "1")); if (nvset) { if (!save_variables(0)) { if (ajax) { web_printf("@msg:%s", resmsg_get()); } else { parse_asp("error.asp"); } return; } commit = save_variables(1) && commit; resmsg_set("設定已儲存."); } rboot = atoi(webcgi_safeget("_reboot", "0")); if (rboot) { parse_asp("reboot.asp"); } else { if (ajax) { web_printf("@msg:%s", resmsg_get()); } else if (atoi(webcgi_safeget("_moveip", "0"))) { parse_asp("saved-moved.asp"); } else if (!*red) { parse_asp("saved.asp"); } } if (commit) { _dprintf("commit from tomato.cgi\n"); if (!nvram_match("debug_nocommit", "1")) { nvram_commit(); } } if ((v = webcgi_get("_service")) != NULL) { if (!*red) { if (ajax) web_printf(" 某些服務已重新啟動..."); web_close(); } sleep(1); if (*v == '*') { kill(1, SIGHUP); } else if (*v != 0) { exec_service(v); } } for (i = atoi(webcgi_safeget("_sleep", "0")); i > 0; --i) sleep(1); if (*red) redirect(red); if (rboot) { web_close(); sleep(1); kill(1, SIGTERM); } }