void test_idle_system_should_go_dormant(void) { const int children = 16; for (int i = 0; i < children; i++) { pid_t pid = fork(); if (pid == 0) { child_task(); } else if (pid == -1) { err(1, "fork"); } else { /* nop */ } } sleep(IDLE_SECONDS); for (int i = 0; i < children; i++) { int stat_loc = 0; wait(&stat_loc); } }
static void update_task(void *param) { conn_t *conn = (conn_t *) FROM_VOID_PARAM(param); bool force_check = (conn && conn->update_check == FORCE_CHECK); bool force_build = (conn && conn->update_check == FORCE_BUILD); bool ver_changed, update_install; lprintf("UPDATE: checking for updates\n"); // Run curl in a Linux child process otherwise this thread will block and cause trouble // if the check is invoked from the admin page while there are active user connections. int status = child_task("kiwi.upd", POLL_MSEC(1000), curl_makefile_ctask, NULL); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { lprintf("UPDATE: curl Makefile error, no Internet access? status=0x%08x WIFEXITED=%d WEXITSTATUS=%d\n", status, WIFEXITED(status), WEXITSTATUS(status)); if (force_check) report_result(conn); goto common_return; } FILE *fp; scallz("fopen Makefile.1", (fp = fopen("/root/" REPO_NAME "/Makefile.1", "r"))); int n1, n2; n1 = fscanf(fp, "VERSION_MAJ = %d\n", &pending_maj); n2 = fscanf(fp, "VERSION_MIN = %d\n", &pending_min); fclose(fp); ver_changed = (n1 == 1 && n2 == 1 && (pending_maj > version_maj || (pending_maj == version_maj && pending_min > version_min))); update_install = (admcfg_bool("update_install", NULL, CFG_REQUIRED) == true); if (force_check) { if (ver_changed) lprintf("UPDATE: version changed (current %d.%d, new %d.%d), but check only\n", version_maj, version_min, pending_maj, pending_min); else lprintf("UPDATE: running most current version\n"); report_result(conn); goto common_return; } else if (ver_changed && !update_install && !force_build) { lprintf("UPDATE: version changed (current %d.%d, new %d.%d), but update install not enabled\n", version_maj, version_min, pending_maj, pending_min); } else if (ver_changed || force_build) { lprintf("UPDATE: version changed%s, current %d.%d, new %d.%d\n", force_build? " (forced)":"", version_maj, version_min, pending_maj, pending_min); lprintf("UPDATE: building new version..\n"); update_in_progress = true; rx_server_user_kick(-1); // kick everyone off to speed up build sleep(5); // Run build in a Linux child process so the server can continue to respond to connection requests // and display a "software update in progress" message. // This is because the calls to system() in update_build_ctask() block for the duration of the build. u4_t build_time = timer_sec(); status = child_task("kiwi.bld", POLL_MSEC(1000), update_build_ctask, TO_VOID_PARAM(force_build)); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { lprintf("UPDATE: build error, no Internet access? status=0x%08x WIFEXITED=%d WEXITSTATUS=%d\n", status, WIFEXITED(status), WEXITSTATUS(status)); goto common_return; } lprintf("UPDATE: build took %d secs\n", timer_sec() - build_time); lprintf("UPDATE: switching to new version %d.%d\n", pending_maj, pending_min); if (admcfg_int("update_restart", NULL, CFG_REQUIRED) == 0) { xit(0); } else { lprintf("UPDATE: rebooting Beagle..\n"); system("sleep 3; reboot"); } } else { lprintf("UPDATE: version %d.%d is current\n", version_maj, version_min); } if (daily_restart) { lprintf("UPDATE: daily restart..\n"); xit(0); } common_return: if (conn) conn->update_check = WAIT_UNTIL_NO_USERS; // restore default update_pending = update_task_running = update_in_progress = false; }