static void uv__chld(uv_signal_t* handle, int signum) { uv_process_t* process; uv_loop_t* loop; int exit_status; int term_signal; unsigned int i; int status; pid_t pid; QUEUE pending; QUEUE* h; QUEUE* q; assert(signum == SIGCHLD); QUEUE_INIT(&pending); loop = handle->loop; for (i = 0; i < ARRAY_SIZE(loop->process_handles); i++) { h = loop->process_handles + i; q = QUEUE_HEAD(h); while (q != h) { process = QUEUE_DATA(q, uv_process_t, queue); q = QUEUE_NEXT(q); do pid = waitpid(process->pid, &status, WNOHANG); while (pid == -1 && errno == EINTR); if (pid == 0) continue; if (pid == -1) { if (errno != ECHILD) abort(); continue; } process->status = status; QUEUE_REMOVE(&process->queue); QUEUE_INSERT_TAIL(&pending, &process->queue); } while (!QUEUE_EMPTY(&pending)) { q = QUEUE_HEAD(&pending); QUEUE_REMOVE(q); QUEUE_INIT(q); process = QUEUE_DATA(q, uv_process_t, queue); uv__handle_stop(process); if (process->exit_cb == NULL) continue; exit_status = 0; if (WIFEXITED(process->status)) exit_status = WEXITSTATUS(process->status); term_signal = 0; if (WIFSIGNALED(process->status)) term_signal = WTERMSIG(process->status); process->exit_cb(process, exit_status, term_signal); } } }
static void gtm_read(void) { route_head *first_trk_head = NULL; route_head *trk_head = NULL; route_head *rte_head = NULL; waypoint *wpt; int real_tr_count = 0; char *route_name; unsigned int icon; int i; /* Image information */ for (i = 0; i != im_count; i++) { fread_string_discard(file_in); fread_string_discard(file_in); fread_discard(file_in, 30); } /* Waypoints */ for (i = 0; i != wp_count; i++) { wpt = waypt_new(); wpt->latitude = fread_double(file_in); wpt->longitude = fread_double(file_in); convert_datum(&wpt->latitude, &wpt->longitude); wpt->shortname = fread_fixedstring(file_in, 10); wpt->description = fread_string(file_in); icon = fread_integer(file_in); if (icon < sizeof(icon_descr)/sizeof(char*)) wpt->icon_descr = icon_descr[icon]; fread_discard(file_in, 1); wpt->creation_time = fread_long(file_in); if (wpt->creation_time) wpt->creation_time += EPOCH89DIFF; fread_discard(file_in, 2); wpt->altitude = fread_single(file_in); if (wpt->altitude == unknown_alt_gtm) wpt->altitude = unknown_alt; fread_discard(file_in, 2); waypt_add(wpt); } /* Waypoint Styles */ if (wp_count) { for (i = 0; i != ws_count; i++) { fread_discard(file_in, 4); fread_string_discard(file_in); fread_discard(file_in, 24); } } /* Tracklogs */ for (i = 0; i != tr_count; i++) { wpt = waypt_new(); wpt->latitude = fread_double(file_in); wpt->longitude = fread_double(file_in); convert_datum(&wpt->latitude, &wpt->longitude); wpt->creation_time = fread_long(file_in); if (wpt->creation_time) wpt->creation_time += EPOCH89DIFF; start_new = fread_byte(file_in); wpt->altitude = fread_single(file_in); if (wpt->altitude == unknown_alt_gtm) wpt->altitude = unknown_alt; if (start_new || !trk_head) { trk_head = route_head_alloc(); track_add_head(trk_head); real_tr_count++; if (!first_trk_head) first_trk_head = trk_head; } track_add_wpt(trk_head, wpt); } /* Tracklog styles */ trk_head = first_trk_head; for (i = 0; i != ts_count && i != real_tr_count; i++) { trk_head->rte_name = fread_string(file_in); fread_discard(file_in, 12); trk_head = (route_head *)QUEUE_NEXT(&trk_head->Q); } /* Routes */ for (i = 0; i != rt_count; i++) { wpt = waypt_new(); wpt->latitude = fread_double(file_in); wpt->longitude = fread_double(file_in); convert_datum(&wpt->latitude, &wpt->longitude); wpt->shortname = fread_fixedstring(file_in, 10); wpt->description = fread_string(file_in); route_name = fread_string(file_in); icon = fread_integer(file_in); if (icon < sizeof(icon_descr)/sizeof(char*)) wpt->icon_descr = icon_descr[icon]; fread_discard(file_in, 1); start_new = fread_byte(file_in); fread_discard(file_in, 6); wpt->altitude = fread_single(file_in); if (wpt->altitude == unknown_alt_gtm) wpt->altitude = unknown_alt; fread_discard(file_in, 2); if (start_new || !rte_head) { rte_head = route_head_alloc(); rte_head->rte_name = route_name; route_add_head(rte_head); } else { xfree(route_name); } route_add_wpt(rte_head, wpt); } }