int main(int argc, char **argv) { int connfd, port; socklen_t clientlen; struct sockaddr_in clientaddr; struct hostent *hp; char haddrp[INET_ADDRSTRLEN]; if (argc != 2) { wp_critical("usage: %s <port>\n", argv[0]); } port = atoi(argv[1]); listenfd = wp_open_listenfd(port); if (listenfd < 0) { wp_critical ("open listenfd error"); } wp_signal (SIGCHLD, sigchld_handler); wp_signal (SIGTERM, sigterm_handler); wp_debug_full (stdout, "My pid is %d", getpid()); while (1) { clientlen = sizeof(clientaddr); errno = 0; connfd = wp_accept(listenfd, (struct sockaddr *)&clientaddr, &clientlen); wp_debug("connfd: %d errno: %d", connfd, errno); if (keep_on_running == false) { break; } if (wp_fork () == 0) { wp_close (listenfd); /* determine the domain name and IP address of the client */ hp = wp_gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), AF_INET); wp_inet_ntop(AF_INET, &clientaddr.sin_addr, haddrp, sizeof (haddrp)); printf("server connected to %s (%s)\n", hp->h_name, haddrp); echo(connfd); wp_close (connfd); exit (0); } wp_close(connfd); } exit(0); }
void echo(int connfd) { ssize_t n; wp_debug ("echo begin %d\n", __LINE__); while (1) { n = wp_read (connfd, buf, sizeof (buf)); if (n == -1) { if (errno == EAGAIN) { wp_debug ("read later"); break; } wp_critical ("read error"); } else if (n == 0) { wp_debug ("nothing to read, close"); wp_close (connfd); break; } wp_debug ("read %d bytes\n", n); wp_write (connfd, buf, n); } wp_debug ("echo end %d\n", __LINE__); }
int main(int argc, char **argv) { int listenfd, connfd, port; socklen_t clientlen; struct sockaddr_in clientaddr; struct hostent *hp; char haddrp[INET_ADDRSTRLEN]; if (argc != 2) { wp_critical("usage: %s <port>\n", argv[0]); } port = atoi(argv[1]); listenfd = wp_open_listenfd(port); if (listenfd < 0) { wp_critical ("open listenfd error"); } while (1) { clientlen = sizeof(clientaddr); connfd = wp_accept(listenfd, (struct sockaddr *)&clientaddr, &clientlen); /* determine the domain name and IP address of the client */ hp = wp_gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), AF_INET); wp_inet_ntop(AF_INET, &clientaddr.sin_addr, haddrp, sizeof (haddrp)); printf("server connected to %s (%s)\n", hp->h_name, haddrp); echo(connfd); wp_close(connfd); } exit(0); }
void *thread (void *vargp) { wp_pthread_detach (pthread_self()); while (1) { int connfd = sbuf_remove (&sbuf); echo_cnt (connfd); wp_close (connfd); } }
void *thread (void *vargp) { int connfd = *(int *)vargp; wp_pthread_detach (pthread_self ()); free (vargp); echo (connfd); wp_close (connfd); return NULL; }
int wp_get(ax25_address *call, wp_t *wp) { wp_pdu pdu; int rc; char *callsign; if (wp_socket == -1) return -1; call_clean(call); memset(&pdu, 0, sizeof(wp_pdu)); pdu.type = wp_type_get; pdu.data.call = *call; rc = wp_send_pdu(wp_socket, &pdu); if (rc < 0) { /* Disconnected */ syslog(LOG_INFO, "wp_get() error disconnected - closing wp socket\n"); wp_close(); return -1; } wp_flush_pdu(); rc = wp_receive_pdu(wp_socket, &pdu); if (rc < 0) { syslog(LOG_INFO, "wp_get() error - wp_receive_pdu() - closing wp socket\n"); wp_close(); return -1; } if (pdu.type == wp_type_get_response) { *wp = pdu.data.wp; wp->address.srose_family = AF_ROSE; return 0; } else { syslog(LOG_INFO, "wp_get() error pdu.type %d - closing wp socket\n", pdu.type); } return -1; }
int wp_nb_records(void) { wp_pdu pdu; int rc; if (wp_socket == -1) return -1; memset(&pdu, 0, sizeof(wp_pdu)); pdu.type = wp_type_info; pdu.data.info.mask = WP_INFO_ALL; rc = wp_send_pdu(wp_socket, &pdu); if (rc < 0) { /* Disconnected */ syslog(LOG_INFO, "wp_nb_records() send wp error - closing wp socket\n"); wp_close(); return -1; } wp_flush_pdu(); rc = wp_receive_pdu(wp_socket, &pdu); if (rc < 0) { /* Disconnected */ syslog(LOG_INFO, "wp_nb_records() receive wp error - closing wp socket\n"); wp_close(); return -1; } if (pdu.type != wp_type_info_response) { syslog(LOG_INFO, "wp_nb_records() wrong wp type info response\n"); return -1; } return pdu.data.info_rsp.nbrec; }
int wp_set(wp_t *wp) { int n; int rc; time_t temps; wp_pdu pdu; if (wp_socket == -1) { syslog(LOG_ERR, "wp_set() no wp socket\n"); return -1; } temps = time(NULL); wp->date = temps; call_clean(&wp->address.srose_call); for (n = 0 ; n < wp->address.srose_ndigis ; n++) call_clean(&wp->address.srose_digis[n]); memset(&pdu, 0, sizeof(wp_pdu)); pdu.type = wp_type_set; pdu.data.wp = *wp; rc = wp_send_pdu(wp_socket, &pdu); if (rc < 0) { /* Disconnected */ syslog(LOG_INFO, "wp_set() wp_send_pdu() error - closing wp socket\n"); wp_close(); return -1; } wp_flush_pdu(); rc = wp_receive_pdu(wp_socket, &pdu); if (rc < 0) { syslog(LOG_INFO, "wp_set() wp_receive_pdu() error\n"); return -1; } if ((pdu.type == wp_type_response) && (pdu.data.status == WP_OK)) { return 0; } syslog(LOG_INFO, "wp_set() error - type %d response %d status %d\n", pdu.type, wp_type_response, pdu.data.status); return -1; }
void serve_static (int fd, char *filename, int filesize) { int srcfd; char *srcp, filetype[MAXLINE], buf[MAXLINE]; get_filetype (filename, filetype); sprintf (buf, "HTTP/1.0 200 OK\r\n"); sprintf (buf, "%sServer: Tiny Web Server\r\n", buf); sprintf (buf, "%sContent-length: %d\r\n", buf, filesize); sprintf (buf, "%sContent-type: %s\r\n\r\n", buf, filetype); wp_writen (fd, buf, strlen (buf)); srcfd = wp_open (filename, O_RDONLY, 0); srcp = wp_mmap (0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0); wp_close (srcfd); wp_writen (fd, srcp, filesize); wp_munmap (srcp, filesize); }
int main (int argc, char *argv[]) { int listenfd, connfd, port; struct sockaddr_in clientaddr; socklen_t clientlen; if (argc != 2) { wp_critical ("usage: %s <port>\n", argv[0]); } port = atoi (argv[1]); listenfd = wp_open_listenfd (port); while (1) { clientlen = sizeof (clientaddr); connfd = wp_accept (listenfd, (struct sockaddr *)&clientaddr, &clientlen); doit (connfd); wp_close (connfd); } }
int main(int ac, char **av) { FILE *fptr; old_wp_t old_wp; wp_t new_wp; wp_header wph; char dnic[5]; char *add, *call; char buf[20]; if (ac < 2) { fprintf(stderr, "format : wpconv database\n"); return 1; } fptr = fopen(av[1], "r"); if (fptr == NULL) { fprintf(stderr, "Cannot open %s\n", av[1]); return 2; } if (fread(&wph, sizeof(wph), 1, fptr) == 0) { fclose(fptr); fprintf(stderr, "database %s is empty\n", av[1]); return 3; } /* Check the first record for compatibility */ if (strcmp(wph.signature,OLD_FILE_SIGNATURE) != 0) { fprintf(stderr, "database %s is not compatible\n", av[1]); fclose(fptr); return 4; } printf("%u callsigns in database\n", wph.nb_record); if (wp_open("WPCNVT")) { perror("Cannot open WP service"); exit(1); } while (fread(&old_wp, sizeof(old_wp_t), 1, fptr)) { if (old_wp.date == 0) continue; add = rose_ntoa(&old_wp.address.srose_addr); call = ax25_ntoa(&old_wp.address.srose_call); if (wp_check_call(call) != 0) continue; strncpy(dnic, add, 4); dnic[4] = '\0'; my_date(buf, old_wp.date), printf("%-9s %s => %s %-7s ", call, buf, dnic, add+4); if (old_wp.address.srose_ndigis) printf("%s ", ax25_ntoa(&old_wp.address.srose_digi)); printf("%s %s\n", old_wp.name, old_wp.city); /* Add to the running database */ memset(&new_wp, 0, sizeof(wp_t)); new_wp.date = old_wp.date; new_wp.address.srose_addr = old_wp.address.srose_addr; new_wp.address.srose_call = old_wp.address.srose_call; new_wp.address.srose_digis[0] = old_wp.address.srose_digi; new_wp.address.srose_ndigis = old_wp.address.srose_ndigis; wp_set(&new_wp); } wp_close(); return(0); }
int wp_get_list(wp_t **wp, int *nb, int flags, char *mask) { wp_pdu pdu; wp_t *wptab = NULL; int rc; int max = *nb; int i = 0;; if (wp_socket == -1) { syslog(LOG_INFO, "wp_get_list() no wp socket\n"); return -1; } *wp = NULL; *nb = 0; memset(&pdu, 0, sizeof(wp_pdu)); pdu.type = wp_type_get_list; pdu.data.list_req.mask[9] = '\0'; pdu.data.list_req.flags = flags; pdu.data.list_req.max = max; memcpy(pdu.data.list_req.mask, mask, 9); rc = wp_send_pdu(wp_socket, &pdu); if (rc < 0) { /* Disconnected */ syslog(LOG_INFO, "wp_get_list() error disconnected - closing wp socket\n"); wp_close(); return -1; } wp_flush_pdu(); for (i = 0 ; i < max ; i++) { rc = wp_receive_pdu(wp_socket, &pdu); if (rc < 0) { syslog(LOG_INFO, "wp_get_list() error - closing wp socket\n"); wp_close(); return -1; } if (pdu.type == wp_type_get_list_response) { if (wptab == NULL) { wptab = calloc(max, sizeof(wp_t)); *wp = wptab; } wptab[i] = pdu.data.list_rsp.wp; wptab[i].address.srose_family = AF_ROSE; } else if ((pdu.type == wp_type_response) && (pdu.data.status == WP_OK)) return 0; else return -1; if (pdu.data.list_rsp.next == 0) { *nb = i+1; return 0; } } /* End of list */ return -1; }
void sigterm_handler (int sig) { keep_on_running = false; wp_close (listenfd); }