/* * Get mailbox's status. */ int request_status(const char *server, const char *port, const char *user, const char *mbox, unsigned int *exists, unsigned int *recent, unsigned int *unseen, unsigned int *uidnext) { int t, r; session *s; const char *m; if (!(s = session_find(server, port, user))) return -1; m = apply_namespace(mbox, s->ns.prefix, s->ns.delim); if (s->protocol == PROTOCOL_IMAP4REV1) { t = imap_status(s, m, "MESSAGES RECENT UNSEEN UIDNEXT"); if ((r = response_status(s, t, exists, recent, unseen, uidnext)) == -1) goto fail; } else { t = imap_examine(s, m); if ((r = response_examine(s, t, exists, recent)) == -1) goto fail; } return r; fail: close_connection(s); session_destroy(s); return -1; }
void handle_public_server(const void * req) { TEXT_MESSAGE *tm = (TEXT_MESSAGE*)req; response_status(tm->from_id, SERVER_DESC.server_msgid); local_send_msg(tm); }
bool send_response( icap::Response * response, psocksxx::iosockstream * socket ) throw() { bool r_success = true; icap::ResponseHeader * header; // grab the response header header = response->header(); // response status std::string line = header->protocol(); line.append( " " ); line.append( itoa( header->status() ) ); line.append( " " ); line.append( response_status( header->status() ) ); r_success = send_line( line, socket ); // response headers if ( r_success ) { r_success = send_headers( header, socket ); } // response content (if there are any) if ( r_success ) { // req-hdr if ( response->payload().req_header.size() > 0 ) { send_data( response->payload().req_header, socket ); } // red-body if ( response->payload().req_body.size() > 0 ) { send_chunked( response->payload().req_body, socket ); } // res-hdr if ( response->payload().res_header.size() > 0 ) { send_data( response->payload().res_header, socket ); } // res-body if ( response->payload().res_body.size() > 0 ) { send_chunked( response->payload().res_body, socket ); } } // flush-out socket stream buffer socket->flush(); return r_success; }
void handle_change_room(const void * req) { CHANGE_ROOM_REQUEST* crr = (CHANGE_ROOM_REQUEST*) req; repository_lock(); change_room(crr->client_name, crr->room_name); response_status(crr->client_msgid, 202); repository_unlock(); }
/* * Get mailbox's status. */ int request_status(session *ssn, const char *mbox, unsigned int *exists, unsigned int *recent, unsigned int *unseen, unsigned int *uidnext) { int t, r; const char *m; m = apply_namespace(mbox, ssn->ns.prefix, ssn->ns.delim); if (ssn->protocol == PROTOCOL_IMAP4REV1) { TRY(t = send_request(ssn, "STATUS \"%s\" (MESSAGES RECENT UNSEEN UIDNEXT)", m)); TRY(r = response_status(ssn, t, exists, recent, unseen, uidnext)); } else { TRY(t = send_request(ssn, "EXAMINE \"%s\"", m)); TRY(r = response_examine(ssn, t, exists, recent)); } return r; }
void handle_login(const void * req) { CLIENT_REQUEST * cr = (CLIENT_REQUEST*) req; int i; int ok = 1; repository_lock(); if (strlen(cr->client_name) >= MAX_NAME_SIZE) { response_status(cr->client_msgid, 400); ok = 0; } if (ok) for (i = 0; i < strlen(cr->client_name); i++) { if (!isprint(cr->client_name[i])) { response_status(cr->client_msgid, 400); ok = 0; break; } } if (ok && SERVER_DESC.clients >= SERVER_CAPACITY) { response_status(cr->client_msgid, 503); ok = 0; } if (ok) for (i = 0; i < GLOBAL_REPO->active_clients; i++) { if (strcmp(GLOBAL_REPO->clients[i].name, cr->client_name) == 0) { response_status(cr->client_msgid, 409); ok = 0; break; } } if (ok) { CLIENT desc; strcpy(desc.name, cr->client_name); desc.server_id = SERVER_DESC.server_msgid; repository_client_add(desc); local_client_add(desc, cr->client_msgid); SERVER_DESC.clients++; for (i = 0; i < GLOBAL_REPO->active_servers; i++) { if (GLOBAL_REPO->servers[i].server_msgid == SERVER_DESC.server_msgid) { GLOBAL_REPO->servers[i].clients++; break; } } change_room(desc.name, ""); response_status(cr->client_msgid, 201); } repository_unlock(); if (ok) log_write("LOGGED_IN@%d: %s\n", SERVER_DESC.server_msgid, cr->client_name); }