int main (int argc, char *argv[]) { (void)argc; (void)argv; int ret; int dbg = TRUE; struct lapb_callbacks lapb_callbacks; int res; char buffer[2048]; _uchar lapb_equipment_type = LAPB_DCE; _uchar lapb_modulo = LAPB_STANDARD; pthread_t server_thread; struct tcp_server_struct * server_thread_struct = NULL; pthread_t timer_thread; struct timer_thread_struct * timer_thread_struct = NULL; pthread_t logger_thread; printf("*******************************************\n"); printf("****** ******\n"); printf("****** X25 EMULATOR (server side) ******\n"); printf("****** ******\n"); printf("*******************************************\n"); /* Initialize syslog */ setlogmask (LOG_UPTO (LOG_DEBUG)); openlog ("server_app", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); ret = pthread_create(&logger_thread, NULL, logger_function, NULL); if (ret) { perror("Error - pthread_create()"); closelog(); exit(EXIT_FAILURE); }; printf("Logger thread created(code %d)\n", ret); while (!is_logger_started()) sleep_ms(200); printf("Logger started\n\n"); lapb_debug(0, "Program started by User %d", getuid ()); /* Setup signal handler */ setup_signals_handler(); if (dbg) goto label_1; /* Select program mode */ printf("\nSelect program mode:\n1. Automatic\n2. Manual\n"); write(0, ">", 1); while (read(0, buffer, sizeof(buffer)) <= 1) write(0, ">", 1); if (atoi(buffer) == 2) AutomaticMode = FALSE; else { /* Set up equipment mode: DTE or DCE */ printf("\nSelect equipment type:\n1. DTE\n2. DCE\n"); write(0, ">", 1); while (read(0, buffer, sizeof(buffer)) <= 1) write(0, ">", 1); if (atoi(buffer) == 1) lapb_equipment_type = LAPB_DTE; /* Set up lapb modulo: STANDARD or EXTENDED */ printf("\nSelect modulo value:\n1. STANDARD(8)\n2. EXTENDED(128)\n"); write(0, ">", 1); while (read(0, buffer, sizeof(buffer)) <= 1) write(0, ">", 1); if (atoi(buffer) == 2) lapb_modulo = LAPB_EXTENDED; }; label_1: /* Create TCP server */ server_thread_struct = malloc(sizeof(struct tcp_server_struct)); if (dbg) { server_thread_struct->port = 1234; goto label_2; }; printf("\nEnter server port[1234]: "); fgets(buffer, sizeof(buffer) - 1, stdin); int tmp_len = strlen(buffer); if (tmp_len == 1) server_thread_struct->port = 1234; else { buffer[strlen(buffer) - 1] = 0; server_thread_struct->port = atoi(buffer); }; label_2: /* TCP server callbacks */ server_thread_struct->new_data_received = new_data_received; server_thread_struct->no_active_connection = no_active_connection; ret = pthread_create(&server_thread, NULL, server_function, (void*)server_thread_struct); if (ret) { fprintf(stderr, "Error - pthread_create() return code: %d\n", ret); exit(EXIT_FAILURE); }; printf("TCP server thread created(code %d)\n", ret); while (!is_server_started()) sleep_ms(200); printf("TCP server started\n\n"); // if (!AutomaticMode) // return manual_process(); /* Create timer */ timer_thread_struct = malloc(sizeof(struct timer_thread_struct)); timer_thread_struct->interval = 10; /* milliseconds */ timer_thread_struct->main_lock = main_lock; timer_thread_struct->main_unlock = main_unlock; ret = pthread_create(&timer_thread, NULL, timer_thread_function, (void*)timer_thread_struct); if (ret) { lapb_debug(0, "Error - pthread_create() return code: %d\n", ret); closelog(); exit(EXIT_FAILURE); }; printf("Timer thread created(code %d)\n", ret); while (!is_timer_thread_started()) sleep_ms(200); printf("Timer started\n\n"); /* LAPB init */ bzero(&lapb_callbacks, sizeof(struct lapb_callbacks)); lapb_callbacks.connect_confirmation = lapb_connect_confirmation_cb; lapb_callbacks.connect_indication = lapb_connect_indication_cb; lapb_callbacks.disconnect_confirmation = lapb_disconnect_confirmation_cb; lapb_callbacks.disconnect_indication = lapb_disconnect_indication_cb; lapb_callbacks.data_indication = lapb_data_indication_cb; lapb_callbacks.transmit_data = lapb_transmit_data; lapb_callbacks.add_timer = timer_add; lapb_callbacks.del_timer = timer_del; lapb_callbacks.start_timer = timer_start; lapb_callbacks.stop_timer = timer_stop; lapb_callbacks.debug = lapb_debug; /* Define LAPB values */ struct lapb_params lapb_params; lapb_params.mode = lapb_modulo | LAPB_SLP | lapb_equipment_type; lapb_params.window = LAPB_DEFAULT_SWINDOW; lapb_params.N1 = LAPB_DEFAULT_N1; /* I frame size is 135 bytes */ lapb_params.T201_interval = 1000; /* 1s */ lapb_params.T202_interval = 100; /* 0.1s */ lapb_params.N201 = 10; /* T201 timer will repeat for 10 times */ lapb_params.low_order_bits = FALSE; lapb_params.auto_connecting = TRUE; res = lapb_register(&lapb_callbacks, &lapb_params, &lapb_server); if (res != LAPB_OK) { printf("lapb_register return %d\n", res); exit(EXIT_FAILURE); }; /* X25 init */ struct x25_callbacks x25_callbacks; bzero(&x25_callbacks, sizeof(struct x25_callbacks)); x25_callbacks.link_connect_request = lapb_connect_request; x25_callbacks.link_disconnect_request = lapb_disconnect_request; x25_callbacks.link_send_frame = lapb_data_request; x25_callbacks.call_indication = x25_call_indication_cb; x25_callbacks.call_accepted = x25_call_accepted_cb; x25_callbacks.data_indication = x25_data_indication_cb; x25_callbacks.add_timer = timer_add; x25_callbacks.del_timer = timer_del; x25_callbacks.start_timer = timer_start; x25_callbacks.stop_timer = timer_stop; x25_callbacks.debug = x25_debug; /* Define X25 values */ //struct x25_params x25_params; //res = x25_register(&x25_callbacks, &x25_params, &x25_server); res = x25_register(&x25_callbacks, NULL, &x25_server); if (res != X25_OK) { printf("x25_register return %d\n", res); goto exit; }; x25_server->mode = (lapb_equipment_type & LAPB_DCE ? X25_DCE : X25_DTE) | (lapb_modulo & LAPB_EXTENDED ? X25_EXTENDED : X25_STANDARD); x25_add_link(x25_server, lapb_server); lapb_server->L3_ptr = x25_server; printf("Enter local X25 address[7654321]: "); fgets(x25_server->source_addr.x25_addr, 16, stdin); tmp_len = strlen(x25_server->source_addr.x25_addr); if (tmp_len == 1) sprintf(x25_server->source_addr.x25_addr, "7654321"); else x25_server->source_addr.x25_addr[tmp_len - 1] = 0; struct x25_address dest_addr; sprintf(dest_addr.x25_addr, "1234567"); x25_server->lci = 128; x25_debug(0, "[X25]"); x25_debug(0, "[X25]"); x25_debug(0, "[X25]"); /* Start endless loop */ printf("Run Main loop\n\n"); main_loop(x25_server, &dest_addr); printf("Main loop ended\n"); exit: terminate_tcp_server(); while (is_server_started()) sleep_ms(200); printf("TCP server stopped\n"); int * thread_result; pthread_join(server_thread, (void **)&thread_result); printf("TCP server thread exit(code %d)\n", *thread_result); free(thread_result); if (server_thread_struct != NULL) free(server_thread_struct); terminate_timer_thread(); while (is_timer_thread_started()) sleep_ms(200); printf("Timer stopped\n"); pthread_join(timer_thread, (void **)&thread_result); printf("Timer thread exit(code %d)\n", *thread_result); free(thread_result); if (timer_thread_struct != NULL) free(timer_thread_struct); lapb_unregister(lapb_server); terminate_logger(); while (is_logger_started()) sleep_ms(200); printf("Logger stopped\n"); pthread_join(logger_thread, (void **)&thread_result); printf("Logger thread exit(code %d)\n", *thread_result); free(thread_result); /* Close syslog */ closelog(); printf("Exit application\n\n"); return EXIT_SUCCESS; }
int main (int argc, char *argv[]) { (void)argc; (void)argv; int ret; int dbg = TRUE; struct lapb_callbacks callbacks; int lapb_res; char buffer[2048]; unsigned char lapb_equipment_type = LAPB_DCE; unsigned char lapb_modulo = LAPB_STANDARD; pthread_t server_thread; struct tcp_server_struct * server_struct = NULL; pthread_t timer_thread; struct timer_thread_struct * timer_struct = NULL; pthread_t logger_thread; printf("*******************************************\n"); printf("****** ******\n"); printf("****** LAPB EMULATOR (server side) ******\n"); printf("****** ******\n"); printf("*******************************************\n"); /* Initialize syslog */ setlogmask (LOG_UPTO (LOG_DEBUG)); openlog ("server_app", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); ret = pthread_create(&logger_thread, NULL, logger_function, NULL); if (ret) { perror("Error - pthread_create()"); closelog(); exit(EXIT_FAILURE); }; printf("Logger thread created(code %d)\n", ret); while (!is_logger_started()) sleep_ms(200); printf("Logger started\n\n"); lapb_debug(0, "Program started by User %d", getuid ()); /* Setup signal handler */ setup_signals_handler(); if (dbg) goto label_1; /* Select program mode */ printf("\nSelect program mode:\n1. Automatic\n2. Manual\n"); write(0, ">", 1); while (read(0, buffer, sizeof(buffer)) <= 1) write(0, ">", 1); if (atoi(buffer) == 2) AutomaticMode = FALSE; else { /* Set up equipment mode: DTE or DCE */ printf("\nSelect equipment type:\n1. DTE\n2. DCE\n"); write(0, ">", 1); while (read(0, buffer, sizeof(buffer)) <= 1) write(0, ">", 1); if (atoi(buffer) == 1) lapb_equipment_type = LAPB_DTE; /* Set up lapb modulo: STANDARD or EXTENDED */ printf("\nSelect modulo value:\n1. STANDARD(8)\n2. EXTENDED(128)\n"); write(0, ">", 1); while (read(0, buffer, sizeof(buffer)) <= 1) write(0, ">", 1); if (atoi(buffer) == 2) lapb_modulo = LAPB_EXTENDED; }; label_1: /* Create TCP server */ server_struct = malloc(sizeof(struct tcp_server_struct)); if (dbg) { server_struct->port = 1234; goto label_2; }; printf("\nEnter server port[1234]: "); fgets(buffer, sizeof(buffer) - 1, stdin); int tmp_len = strlen(buffer); if (tmp_len == 1) server_struct->port = 1234; else { buffer[strlen(buffer) - 1] = 0; server_struct->port = atoi(buffer); }; label_2: /* TCP server callbacks */ server_struct->new_data_received = new_data_received; server_struct->no_active_connection = no_active_connection; ret = pthread_create(&server_thread, NULL, server_function, (void*)server_struct); if (ret) { fprintf(stderr, "Error - pthread_create() return code: %d\n", ret); exit(EXIT_FAILURE); }; printf("TCP server thread created(code %d)\n", ret); while (!is_server_started()) sleep_ms(200); printf("TCP server started\n\n"); if (!AutomaticMode) return manual_process(); /* Create timer */ timer_struct = malloc(sizeof(struct timer_thread_struct)); timer_struct->interval = 10; /* milliseconds */ //bzero(timer_struct->timers_list, sizeof(timer_struct->timers_list)); ret = pthread_create(&timer_thread, NULL, timer_thread_function, (void*)timer_struct); if (ret) { lapb_debug(0, "Error - pthread_create() return code: %d\n", ret); closelog(); exit(EXIT_FAILURE); }; printf("Timer thread created(code %d)\n", ret); while (!is_timer_thread_started()) sleep_ms(200); printf("Timer started\n\n"); /* LAPB init */ bzero(&callbacks, sizeof(struct lapb_callbacks)); callbacks.connect_confirmation = connect_confirmation; callbacks.connect_indication = connect_indication; callbacks.disconnect_confirmation = disconnect_confirmation; callbacks.disconnect_indication = disconnect_indication; callbacks.data_indication = data_indication; callbacks.transmit_data = transmit_data; callbacks.add_timer = timer_add; callbacks.del_timer = timer_del; callbacks.start_timer = timer_start; callbacks.stop_timer = timer_stop; callbacks.debug = lapb_debug; /* Define LAPB values */ struct lapb_params params; params.mode = lapb_modulo | LAPB_SLP | lapb_equipment_type; params.window = LAPB_DEFAULT_SWINDOW; params.N1 = LAPB_DEFAULT_N1; /* I frame size is 135 bytes */ params.T201_interval = 1000; /* 1s */ params.T202_interval = 100; /* 0.1s */ params.N201 = 10; /* T201 timer will repeat for 10 times */ params.low_order_bits = FALSE; params.auto_connecting = TRUE; lapb_res = lapb_register(&callbacks, ¶ms, &lapb_server); if (lapb_res != LAPB_OK) { printf("lapb_register return %d\n", lapb_res); exit(EXIT_FAILURE); }; //lapb_server->mode = lapb_modulo | LAPB_SLP | lapb_equipment_type; /* Redefine some default values */ lapb_server->T201_interval = 1000; /* 1s */ lapb_server->T202_interval = 100; /* 0.5s */ lapb_server->N201 = 10; /* Try 10 times */ //lapb_server->low_order_bits = TRUE; /* Start endless loop */ printf("Run Main loop\n\n"); main_loop(lapb_server); printf("Main loop ended\n"); terminate_tcp_server(); while (is_server_started()) sleep_ms(200); printf("TCP server stopped\n"); int * thread_result; pthread_join(server_thread, (void **)&thread_result); printf("TCP server thread exit(code %d)\n", *thread_result); free(thread_result); if (server_struct != NULL) free(server_struct); terminate_timer_thread(); while (is_timer_thread_started()) sleep_ms(200); printf("Timer stopped\n"); pthread_join(timer_thread, (void **)&thread_result); printf("Timer thread exit(code %d)\n", *thread_result); free(thread_result); if (timer_struct != NULL) free(timer_struct); lapb_unregister(lapb_server); terminate_logger(); while (is_logger_started()) sleep_ms(200); printf("Logger stopped\n"); pthread_join(logger_thread, (void **)&thread_result); printf("Logger thread exit(code %d)\n", *thread_result); free(thread_result); /* Close syslog */ closelog(); printf("Exit application\n\n"); return EXIT_SUCCESS; }
// Handle SIGINT (Ctrl+C) and exit server properly static void sigint_handler() { printf("\b\b"), server_stop(), stats_print(), terminate_logger(); exit(EXIT_SUCCESS); }