int nidOSHandleReconnect(char *tport) { char *proto, *host, *port; int fd; if (!(proto = strtok(tport,DELIM))) return -1; if ((strcmp(proto,"tcp") != 0) && (strcmp(proto,"udp") != 0)) return -1; if (!(host = strtok(NULL,DELIM)) || !(port = strtok(NULL,DELIM))) return -1; if ((fd = open_ip(proto,host,port)) >= 0) { NidHandshake h; h.protocol_major = NID_PROTO_MAJOR; h.protocol_minor = NID_PROTO_MINOR; if (write(fd,&h,sizeof(h)) != sizeof(h)) { close(fd); return -1; } } return fd; }
int main(int argc, char **argv) { GOptionContext *context; GError *err = NULL; sigset_t mask; int signal_fd; GIOChannel *signal_io; int signal_source; context = g_option_context_new(NULL); g_option_context_add_main_entries(context, options, NULL); if (g_option_context_parse(context, &argc, &argv, &err) == FALSE) { if (err != NULL) { g_printerr("%s\n", err->message); g_error_free(err); return 1; } g_printerr("An unknown error occurred\n"); return 1; } g_option_context_free(context); if (option_control) { int ret; g_print("Control: %s\n", option_control); if (option_modem) g_print("Modem: %s\n", option_modem); ret = open_serial(); g_free(option_control); g_free(option_modem); if (ret < 0) goto out; } else { int ret; g_print("IP: %s\n", option_ip); g_print("Port: %d\n", option_port); ret = open_ip(); g_free(option_ip); if (ret < 0) goto out; } g_print("APN: %s\n", option_apn); g_print("CID: %d\n", option_cid); sigemptyset(&mask); sigaddset(&mask, SIGTERM); sigaddset(&mask, SIGINT); sigaddset(&mask, SIGUSR1); sigaddset(&mask, SIGUSR2); sigaddset(&mask, SIGPIPE); if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) { perror("Can't set signal mask"); return 1; } signal_fd = signalfd(-1, &mask, 0); if (signal_fd < 0) { perror("Can't create signal filedescriptor"); return 1; } signal_io = g_io_channel_unix_new(signal_fd); g_io_channel_set_close_on_unref(signal_io, TRUE); signal_source = g_io_add_watch(signal_io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, signal_cb, GINT_TO_POINTER(signal_fd)); g_io_channel_unref(signal_io); event_loop = g_main_loop_new(NULL, FALSE); if (option_bluetooth) { g_at_chat_send(control, "ATD*99#", none_prefix, connect_cb, NULL, NULL); } else { g_at_chat_send(control, "ATE0Q0V1", NULL, NULL, NULL, NULL); g_at_chat_send(control, "AT+CFUN?", cfun_prefix, check_mode, NULL, NULL); } g_main_loop_run(event_loop); g_source_remove(signal_source); g_main_loop_unref(event_loop); out: if (ppp == NULL) { g_at_chat_unref(control); g_at_chat_unref(modem); } else g_at_ppp_unref(ppp); g_free(option_apn); return 0; }