FreeCalypso > hg > freecalypso-sw
comparison rvinterf/lowlevel/rvifmain.c @ 177:fef035264dd4
rvinterf: beginning of local socket handling
| author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
|---|---|
| date | Sat, 23 Nov 2013 20:15:02 +0000 |
| parents | 7f727aaf5cd4 |
| children | 7ab6b29e76bb |
comparison
equal
deleted
inserted
replaced
| 176:7f727aaf5cd4 | 177:fef035264dd4 |
|---|---|
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 #include <stdlib.h> | 8 #include <stdlib.h> |
| 9 #include <unistd.h> | 9 #include <unistd.h> |
| 10 #include <time.h> | 10 #include <time.h> |
| 11 #include "../pktmux.h" | 11 #include "../pktmux.h" |
| 12 #include "../localsock.h" | |
| 13 #include "client.h" | |
| 12 | 14 |
| 13 extern int target_fd; | 15 extern int target_fd, listener; |
| 14 extern char *baudrate_name; | 16 extern char *baudrate_name; |
| 15 | 17 |
| 16 extern u_char rxpkt[]; | 18 extern u_char rxpkt[]; |
| 17 extern size_t rxpkt_len; | 19 extern size_t rxpkt_len; |
| 18 | 20 |
| 21 struct client *client_head; | |
| 22 | |
| 19 char *logfname; | 23 char *logfname; |
| 20 FILE *logF; | 24 FILE *logF; |
| 21 time_t logtime; | 25 time_t logtime; |
| 22 int background; | 26 int background; |
| 27 int max_fd; | |
| 23 | 28 |
| 24 main(argc, argv) | 29 main(argc, argv) |
| 25 char **argv; | 30 char **argv; |
| 26 { | 31 { |
| 27 extern char *optarg; | 32 extern char *optarg; |
| 28 extern int optind; | 33 extern int optind; |
| 29 int c; | 34 int c; |
| 30 fd_set fds; | 35 fd_set fds; |
| 36 struct client *cli, **clip; | |
| 31 | 37 |
| 32 while ((c = getopt(argc, argv, "bB:d:l:")) != EOF) | 38 while ((c = getopt(argc, argv, "bB:d:l:")) != EOF) |
| 33 switch (c) { | 39 switch (c) { |
| 34 case 'b': | 40 case 'b': |
| 35 background++; | 41 background++; |
| 52 if (target_fd <= 0) { | 58 if (target_fd <= 0) { |
| 53 if (argc - optind != 1) | 59 if (argc - optind != 1) |
| 54 goto usage; | 60 goto usage; |
| 55 open_target_serial(argv[optind]); | 61 open_target_serial(argv[optind]); |
| 56 } | 62 } |
| 63 max_fd = target_fd; | |
| 57 | 64 |
| 58 set_serial_nonblock(0); | 65 set_serial_nonblock(0); |
| 59 setlinebuf(stdout); | 66 setlinebuf(stdout); |
| 60 if (logfname) { | 67 if (logfname) { |
| 61 logF = fopen(logfname, "w"); | 68 logF = fopen(logfname, "w"); |
| 64 exit(1); | 71 exit(1); |
| 65 } | 72 } |
| 66 fprintf(logF, "*** Log of rvinterf session ***\n"); | 73 fprintf(logF, "*** Log of rvinterf session ***\n"); |
| 67 setlinebuf(logF); | 74 setlinebuf(logF); |
| 68 } | 75 } |
| 76 create_listener_socket(); | |
| 69 if (background) { | 77 if (background) { |
| 70 c = fork(); | 78 c = fork(); |
| 71 if (c < 0) { | 79 if (c < 0) { |
| 72 perror("fork"); | 80 perror("fork"); |
| 73 exit(1); | 81 exit(1); |
| 78 } | 86 } |
| 79 } | 87 } |
| 80 for (;;) { | 88 for (;;) { |
| 81 FD_ZERO(&fds); | 89 FD_ZERO(&fds); |
| 82 FD_SET(target_fd, &fds); | 90 FD_SET(target_fd, &fds); |
| 83 c = select(target_fd+1, &fds, 0, 0, 0); | 91 FD_SET(listener, &fds); |
| 92 for (clip = &client_head; cli = *clip; ) { | |
| 93 if (cli->rx_state == 2) { | |
| 94 close(cli->fd); | |
| 95 *clip = cli->next; | |
| 96 free(cli); | |
| 97 continue; | |
| 98 } | |
| 99 FD_SET(cli->fd, &fds); | |
| 100 clip = &cli->next; | |
| 101 } | |
| 102 c = select(max_fd+1, &fds, 0, 0, 0); | |
| 84 time(&logtime); | 103 time(&logtime); |
| 85 if (c < 0) { | 104 if (c < 0) { |
| 86 if (errno == EINTR) | 105 if (errno == EINTR) |
| 87 continue; | 106 continue; |
| 88 perror("select"); | 107 perror("select"); |
| 89 exit(1); | 108 exit(1); |
| 90 } | 109 } |
| 91 if (FD_ISSET(target_fd, &fds)) | 110 if (FD_ISSET(target_fd, &fds)) |
| 92 process_serial_rx(); | 111 process_serial_rx(); |
| 112 if (FD_ISSET(listener, &fds)) | |
| 113 handle_listener_select(); | |
| 114 for (cli = client_head; cli; cli = cli->next) | |
| 115 if (FD_ISSET(cli->fd, &fds)) | |
| 116 handle_client_select(cli); | |
| 93 } | 117 } |
| 94 } | 118 } |
| 95 | 119 |
| 96 handle_rx_packet() | 120 handle_rx_packet() |
| 97 { | 121 { |
