// // Called by the obex-layer when some event occurs. // void obex_event(obex_t *handle, obex_object_t *object, int mode, int event, int obex_cmd, int obex_rsp) { switch (event) { case OBEX_EV_PROGRESS: printf("Made some progress...\n"); break; case OBEX_EV_ABORT: printf("Request aborted!\n"); break; case OBEX_EV_REQDONE: if(mode == OBEX_MODE_CLIENT) { client_done(handle, object, obex_cmd, obex_rsp); } else { server_done(handle, object, obex_cmd, obex_rsp); } break; case OBEX_EV_REQHINT: /* Accept any command. Not rellay good, but this is a test-program :) */ OBEX_ObjectSetRsp(object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); break; case OBEX_EV_REQ: server_request(handle, object, event, obex_cmd); break; case OBEX_EV_LINKERR: OBEX_TransportDisconnect(handle); printf("Link broken!\n"); break; case OBEX_EV_STREAMEMPTY: fillstream(handle, object); break; default: printf("Unknown event %02x!\n", event); break; } }
static void * server_main(void *arg) { struct sockaddr_storage caddr; unsigned int len; int maxfd; int i; int ready; fd_set master; fd_set rs; char *client_addr; /* * Server is running */ server_running = 1; /* * Use SIGUSR2 to get out of select */ if (util_signal(SIGUSR2, server_usr2)) { log_die(EX_SOFTWARE, "server_main: util_signal failed"); } /* * Initialize client sockets */ for (i = 0; i < MAX_CLIENTS; server_clients[i++] = -1); server_clients[MAX_CLIENTS] = 0; /* * Prepare master set and max fd */ FD_ZERO(&master); FD_SET(server_socket, &master); maxfd = server_socket; /* * Main programm loop */ while(server_running) { rs = master; /* Structure assignment */ if((ready = select(maxfd + 1, &rs, NULL, NULL, NULL)) == -1) { if(errno == EINTR) { continue; } log_sys_error("server_main: select"); } /* * New client connection */ if(FD_ISSET(server_socket, &rs)) { /* * Get a free client slot */ for(i = 0; server_clients[i] > 0; ++i); if(server_clients[i] == 0) { log_error("server_main: client slots depleted"); /* * Disable server_socket in master set and queue new connections */ FD_CLR(server_socket, &master); goto server_slots_depleted; } len = sizeof caddr; server_clients[i] = accept(server_socket, (struct sockaddr*) &caddr, &len); if(server_clients[i] == -1) { log_sys_error("server_main: accept"); } else { /* * Add client to the master set */ FD_SET(server_clients[i], &master); if(server_clients[i] > maxfd) { maxfd = server_clients[i]; } } client_addr = util_addrtostr(&caddr); if (client_addr) { log_error("server: new client connection from %s", client_addr); free(client_addr); } else { log_error("server_main: util_addrtostr failed"); } server_slots_depleted: if(--ready == 0) { continue; } } for(i = 0; server_clients[i] && ready; ++i) { if(server_clients[i] == -1) { continue; } if(!FD_ISSET(server_clients[i], &rs)) { continue; } --ready; /* * Handle request */ switch(server_request(server_clients[i])) { case -1: log_error("server_main: server_request failed"); case 0: break; default: continue; } /* * Close client socket */ FD_CLR(server_clients[i], &master); close(server_clients[i]); server_clients[i] = -1; if(server_clients[i] == maxfd) { maxfd = 0; /* new max fd calculated below */ } /* * Slot available. Accept new connections if disabled */ if(!FD_ISSET(server_socket, &master)) { FD_SET(server_socket, &master); } } if(maxfd) { continue; } /* * Calculate new max fd */ for(i = 0; server_clients[i]; ++i) { if(server_clients[i] > maxfd) { maxfd = server_clients[i]; } } } log_debug("server_main: shutdown"); /* * Close all sockets */ close(server_socket); if (!strncmp(cf_control_socket, "unix", 4)) { sock_unix_unlink(cf_control_socket); } for(i = 0; server_clients[i] > 0; ++i) { if (server_clients[i] > 0) { close(server_clients[i]); } } pthread_exit(NULL); return NULL; }