static void connection_handler(IOCHAN iochan, int event) { struct connection *co = iochan_getdata(iochan); struct client *cl; struct host *host = co->host; yaz_mutex_enter(host->mutex); cl = co->client; if (!cl) { /* no client associated with it.. We are probably getting a closed connection from the target.. Or, perhaps, an unexpected package.. We will just close the connection */ yaz_log(YLOG_LOG, "timeout connection %p event=%d", co, event); remove_connection_from_host(co); yaz_mutex_leave(host->mutex); connection_destroy(co); } else if (event & EVENT_TIMEOUT) { ZOOM_connection_fire_event_timeout(co->link); client_lock(cl); non_block_events(co); client_unlock(cl); remove_connection_from_host(co); yaz_mutex_leave(host->mutex); connection_destroy(co); } else { yaz_mutex_leave(host->mutex); client_lock(cl); non_block_events(co); ZOOM_connection_fire_event_socket(co->link, event); non_block_events(co); client_unlock(cl); if (co->link) { iochan_setflags(iochan, ZOOM_connection_get_mask(co->link)); iochan_setfd(iochan, ZOOM_connection_get_socket(co->link)); } } }
CurOp* CurOp::getOp(const BSONObj& criteria) { Matcher matcher(criteria); Client& me = cc(); scoped_lock client_lock(Client::clientsMutex); for (std::set<Client*>::iterator it = Client::clients.begin(); it != Client::clients.end(); it++) { Client *client = *it; verify(client); CurOp* curop = client->curop(); if (client == &me || curop == NULL) { continue; } BSONObj info = curop->info(); if (matcher.matches(info)) { return curop; } } return NULL; }
static int client_connect(ipclite_client *clt, int fd, const char *path, int flags) { int ret = IPCLITE_ERR_OK, fd_flags; fd_flags = fcntl(fd, F_GETFL, NULL); if(fcntl(fd, F_SETFL, fd_flags | O_NONBLOCK) < 0) return IPCLITE_ERR_GEN; client_lock(clt); if(clt->base.master != -1) { client_unlock(clt); return IPCLITE_ERR_INV; } clt->base.path[0] = '\0'; if(path && *path) { if(flags & IPCLITE_F_ABSTRACT) strncpy(clt->base.path + 1, path, sizeof(clt->base.path) - 1); else strncpy(clt->base.path, path, sizeof(clt->base.path)); } clt->base.master = fd; clt->port.fd = fd; clt->port.state = PORT_OPENED; clt->port_state = PORT_OPENED; FD_SET(fd, &clt->rd); clt->max_fd = MAX(fd, clt->notify[0]) + 1; client_unlock(clt); repoll(clt); return ret; }
CurOp* CurOp::getOp(const BSONObj& criteria) { // Regarding Matcher: This is not quite the right hammer to use here. // Future: use an actual property of CurOp to flag index builds // and use that to filter. // This will probably need refactoring once we change index builds // to be a real command instead of an insert into system.indexes Matcher matcher(criteria); Client& me = cc(); scoped_lock client_lock(Client::clientsMutex); for (std::set<Client*>::iterator it = Client::clients.begin(); it != Client::clients.end(); it++) { Client *client = *it; verify(client); CurOp* curop = client->curop(); if (client == &me || curop == NULL) { continue; } if ( !curop->active() ) continue; if ( curop->killPendingStrict() ) continue; BSONObj info = curop->description(); if (matcher.matches(info)) { return curop; } } return NULL; }
/* Receive a command from the client and execute it. */ static void handle_command (const int client_id) { int cmd; int err = 0; struct client *cli = &clients[client_id]; if (!get_int(cli->socket, &cmd)) { logit ("Failed to get command from the client"); close (cli->socket); del_client (cli); return; } switch (cmd) { case CMD_QUIT: logit ("Exit request from the client"); close (cli->socket); del_client (cli); server_quit = 1; break; case CMD_LIST_CLEAR: logit ("Clearing the list"); audio_plist_clear (); break; case CMD_LIST_ADD: if (!req_list_add(cli)) err = 1; break; case CMD_PLAY: if (!req_play(cli)) err = 1; break; case CMD_DISCONNECT: logit ("Client disconnected"); close (cli->socket); del_client (cli); break; case CMD_PAUSE: audio_pause (); break; case CMD_UNPAUSE: audio_unpause (); break; case CMD_STOP: audio_stop (); break; case CMD_GET_CTIME: if (!send_data_int(cli, MAX(0, audio_get_time()))) err = 1; break; case CMD_SEEK: if (!req_seek(cli)) err = 1; break; case CMD_JUMP_TO: if (!req_jump_to(cli)) err = 1; break; case CMD_GET_SNAME: if (!send_sname(cli)) err = 1; break; case CMD_GET_STATE: if (!send_data_int(cli, audio_get_state())) err = 1; break; case CMD_GET_BITRATE: if (!send_data_int(cli, sound_info.bitrate)) err = 1; break; case CMD_GET_AVG_BITRATE: if (!send_data_int(cli, sound_info.avg_bitrate)) err = 1; break; case CMD_GET_RATE: if (!send_data_int(cli, sound_info.rate)) err = 1; break; case CMD_GET_CHANNELS: if (!send_data_int(cli, sound_info.channels)) err = 1; break; case CMD_NEXT: audio_next (); break; case CMD_PREV: audio_prev (); break; case CMD_PING: if (!send_int(cli->socket, EV_PONG)) err = 1; break; case CMD_GET_OPTION: if (!send_option(cli)) err = 1; break; case CMD_SET_OPTION: if (!get_set_option(cli)) err = 1; break; case CMD_GET_MIXER: if (!send_data_int(cli, audio_get_mixer())) err = 1; break; case CMD_SET_MIXER: if (!set_mixer(cli)) err = 1; break; case CMD_DELETE: if (!delete_item(cli)) err = 1; break; case CMD_SEND_PLIST_EVENTS: cli->wants_plist_events = 1; logit ("Request for events"); break; case CMD_GET_PLIST: if (!get_client_plist(cli)) err = 1; break; case CMD_SEND_PLIST: if (!req_send_plist(cli)) err = 1; break; case CMD_CAN_SEND_PLIST: cli->can_send_plist = 1; break; case CMD_CLI_PLIST_ADD: case CMD_CLI_PLIST_DEL: case CMD_CLI_PLIST_CLEAR: case CMD_CLI_PLIST_MOVE: if (!plist_sync_cmd(cli, cmd)) err = 1; break; case CMD_LOCK: if (!client_lock(cli)) err = 1; break; case CMD_UNLOCK: if (!client_unlock(cli)) err = 1; break; case CMD_GET_SERIAL: if (!send_serial(cli)) err = 1; break; case CMD_PLIST_GET_SERIAL: if (!req_plist_get_serial(cli)) err = 1; break; case CMD_PLIST_SET_SERIAL: if (!req_plist_set_serial(cli)) err = 1; break; case CMD_GET_TAGS: if (!req_get_tags(cli)) err = 1; break; case CMD_TOGGLE_MIXER_CHANNEL: req_toggle_mixer_channel (); break; case CMD_TOGGLE_SOFTMIXER: req_toggle_softmixer (); break; case CMD_GET_MIXER_CHANNEL_NAME: if (!req_get_mixer_channel_name(cli)) err = 1; break; case CMD_GET_FILE_TAGS: if (!get_file_tags(client_id)) err = 1; break; case CMD_ABORT_TAGS_REQUESTS: if (!abort_tags_requests(client_id)) err = 1; break; case CMD_LIST_MOVE: if (!req_list_move(cli)) err = 1; break; case CMD_TOGGLE_EQUALIZER: req_toggle_equalizer(); break; case CMD_EQUALIZER_REFRESH: req_equalizer_refresh(); break; case CMD_EQUALIZER_PREV: req_equalizer_prev(); break; case CMD_EQUALIZER_NEXT: req_equalizer_next(); break; case CMD_TOGGLE_MAKE_MONO: req_toggle_make_mono(); break; case CMD_QUEUE_ADD: if (!req_queue_add(cli)) err = 1; break; case CMD_QUEUE_DEL: if (!req_queue_del(cli)) err = 1; break; case CMD_QUEUE_CLEAR: logit ("Clearing the queue"); audio_queue_clear (); add_event_all (EV_QUEUE_CLEAR, NULL); break; case CMD_QUEUE_MOVE: if (!req_queue_move(cli)) err = 1; break; case CMD_GET_QUEUE: if (!req_send_queue(cli)) err = 1; break; default: logit ("Bad command (0x%x) from the client", cmd); err = 1; } if (err) { logit ("Closing client connection due to error"); close (cli->socket); del_client (cli); } }