/* Accept a new command connection */ static void http_accept(IOCHAN i, int event) { struct sockaddr_in addr; int fd = iochan_getfd(i); socklen_t len; int s; IOCHAN c; struct http_channel *ch; struct conf_server *server = iochan_getdata(i); len = sizeof addr; if ((s = accept(fd, (struct sockaddr *) &addr, &len)) < 0) { yaz_log(YLOG_WARN|YLOG_ERRNO, "accept"); return; } enable_nonblock(s); yaz_log(YLOG_DEBUG, "New command connection"); c = iochan_create(s, http_io, EVENT_INPUT | EVENT_EXCEPT, "http_session_socket"); ch = http_channel_create(server->http_server, inet_ntoa(addr.sin_addr), server); ch->iochan = c; iochan_setdata(c, ch); iochan_add(server->iochan_man, c); }
static enum NTDB_ERROR ntdb_chainlock_nonblock(struct ntdb_context *ntdb, NTDB_DATA key) { union ntdb_attribute orig; enum NTDB_ERROR ecode; ecode = enable_nonblock(ntdb, &orig); if (!ecode) { ecode = ntdb_chainlock(ntdb, key); disable_nonblock(ntdb); } return ecode; }
static NTSTATUS db_ntdb_transaction_start_nonblock(struct db_context *db) { union ntdb_attribute orig; enum NTDB_ERROR ecode; struct db_ntdb_ctx *db_ctx = talloc_get_type_abort(db->private_data, struct db_ntdb_ctx); ecode = enable_nonblock(db_ctx->ntdb, &orig); if (!ecode) { ecode = ntdb_transaction_start(db_ctx->ntdb); disable_nonblock(db_ctx->ntdb); } return map_nt_error_from_ntdb(ecode); }
static int http_proxy(struct http_request *rq) { struct http_channel *c = rq->channel; struct http_proxy *p = c->proxy; struct http_header *hp; struct http_buf *requestbuf; char server_port[16] = ""; struct conf_server *ser = c->server; if (!p) // This is a new connection. Create a proxy channel { int sock; struct protoent *pe; int one = 1; if (!(pe = getprotobyname("tcp"))) { abort(); } if ((sock = socket(PF_INET, SOCK_STREAM, pe->p_proto)) < 0) { yaz_log(YLOG_WARN|YLOG_ERRNO, "socket"); return -1; } if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &one, sizeof(one)) < 0) abort(); enable_nonblock(sock); if (connect(sock, (struct sockaddr *) c->server->http_server->proxy_addr, sizeof(*c->server->http_server->proxy_addr)) < 0) { if (!is_inprogress()) { yaz_log(YLOG_WARN|YLOG_ERRNO, "Proxy connect"); return -1; } } p = xmalloc(sizeof(struct http_proxy)); p->oqueue = 0; p->channel = c; p->first_response = 1; c->proxy = p; // We will add EVENT_OUTPUT below p->iochan = iochan_create(sock, proxy_io, EVENT_INPUT, "http_proxy"); iochan_setdata(p->iochan, p); iochan_add(ser->iochan_man, p->iochan); } // Do _not_ modify Host: header, just checking it's existence if (!http_lookup_header(rq->headers, "Host")) { yaz_log(YLOG_WARN, "Failed to find Host header in proxy"); return -1; } // Add new header about paraz2 version, host, remote client address, etc. { char server_via[128]; hp = rq->headers; hp = http_header_append(c, hp, "X-Pazpar2-Version", PACKAGE_VERSION); hp = http_header_append(c, hp, "X-Pazpar2-Server-Host", ser->host); sprintf(server_port, "%d", ser->port); hp = http_header_append(c, hp, "X-Pazpar2-Server-Port", server_port); yaz_snprintf(server_via, sizeof(server_via), "1.1 %s:%s (%s/%s)", ser->host ? ser->host : "@", server_port, PACKAGE_NAME, PACKAGE_VERSION); hp = http_header_append(c, hp, "Via" , server_via); hp = http_header_append(c, hp, "X-Forwarded-For", c->addr); } requestbuf = http_serialize_request(rq); http_buf_enqueue(&p->oqueue, requestbuf); iochan_setflag(p->iochan, EVENT_OUTPUT); return 0; }