예제 #1
0
//
// 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;
    }
}
예제 #2
0
파일: server.c 프로젝트: badzong/mopher
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;
}