5 * $Id: lecs.c,v 1.1.1.1 2005/04/29 01:44:51 echo Exp $
16 #include <netinet/in.h>
18 #include <sys/types.h>
25 #include "lecs_load.h"
32 static void sig_reset(int foobar);
33 static void sig_kill(int foobar);
34 static void usage(const char *progname);
35 int send_response(int fd, unsigned char *buffer, int len);
38 #define COMP_NAME "MAIN"
41 static int stay_alive = 1;
44 #define DUMP_PACKETS 0
47 usage(const char *progname)
49 printf("Usage: %s [-f configuration_file][-l listen_address][-d]\n",
66 send_response(int fd, unsigned char *buffer, int len)
70 unsigned short response;
75 if (len < sizeof(LaneControl_t))
78 dp = (LaneControl_t *)buffer;
80 if (dp->marker != htons(LE_MARKER) ||
81 dp->protocol != LE_PROTOCOL ||
82 dp->version != LE_VERSION ||
83 dp->opcode != htons(LE_CONFIGURE_REQUEST)) {
86 dp->opcode = htons(LE_CONFIGURE_RESPONSE);
87 elan = find_elan(dp->source_atm, dp->lan_type, dp->max_frame,
88 (char*)dp->elan_name, dp->elan_name_size, &response);
90 dp->status = htons(response);
92 dp->status = htons(LE_STATUS_SUCCESS);
93 dp->lan_type = elan->type;
94 dp->max_frame = elan->max_frame;
95 memcpy(dp->elan_name, elan->elan_name, elan->elan_name_size);
96 dp->elan_name_size = elan->elan_name_size;
97 memcpy(dp->target_atm, elan->les_addr, ATM_ESA_LEN);
101 printf("%2.2x ",0xff&buffer[i]);
105 return write(fd, buffer, len);
108 int main(int argc, char **argv)
111 char *config_file =NULL;
112 char *listen_addr = NULL;
117 struct sockaddr_atmsvc client;
119 unsigned char buffer[P_SIZE];
122 i = getopt(argc, argv, "f:l:d");
125 printf("Dumping databasefile\n");
133 config_file = (char*)mem_alloc(COMP_NAME, strlen(optarg)+1);
137 memcpy(config_file, optarg, strlen(optarg)+1);
144 listen_addr = (char*)mem_alloc(COMP_NAME, strlen(optarg)+1);
147 memcpy(listen_addr, optarg, strlen(optarg)+1);
156 if (argc != optind) {
160 /* Following gets run in the beginning or when lecs is restarted */
163 /* Read configuration file */
165 if (load_db(config_file)<0)
168 if (load_db(DEFAULT_CONFIG)<0)
176 /* Reserve signals */
177 signal(SIGHUP, sig_reset);
178 signal(SIGINT, sig_kill);
179 signal(SIGQUIT, sig_kill);
180 signal(SIGABRT, sig_kill);
181 signal(SIGTERM, sig_kill);
182 signal(SIGSEGV, sig_kill);
184 /* CHANGE: First parameter, then configuration file! */
185 fd_arr[0] = atm_create_socket(CONFIGURATION_DIRECT,
189 stay_alive=0; /* No need to go on */
191 while(!reset && stay_alive) {
193 for(i=0;i<no_fds;i++) {
194 FD_SET(fd_arr[i],&fds);
197 if (select(MAX_FD, &fds, NULL, NULL, NULL)<0) {
198 perror("select(MAX_FD,...)");
201 if (FD_ISSET(fd_arr[0],&fds)) { /* Incoming call */
202 if (no_fds == MAX_FD) {
203 close(fd_arr[1]); /* Oldest */
204 memmove(&fd_arr[1], &fd_arr[2], sizeof(int)*(MAX_FD-2));
207 len = sizeof(client);
208 fd_arr[no_fds] = accept(fd_arr[0], (struct sockaddr*)&client,
210 if (fd_arr[no_fds]<0) {
211 if (errno==ENETRESET)
219 for(i=1;i<no_fds;i++) {
220 if (FD_ISSET(fd_arr[i],&fds)) {
221 len = read(fd_arr[i], buffer, P_SIZE);
222 if (len <0 && (errno == ENETRESET || errno == EUNATCH)) {
227 memmove(&fd_arr[i], &fd_arr[i+1], sizeof(int)*(--no_fds -i));
230 if(send_response(fd_arr[i], buffer, len)<0) {
232 memmove(&fd_arr[i], &fd_arr[i+1], sizeof(int)*(--no_fds -i));
239 /* This gets done if a signal has been caught, or if
240 network resets/becomes unavailable */
242 for(i=0;i<no_fds;i++)