Index: head/contrib/lib9p/transport/socket.c =================================================================== --- head/contrib/lib9p/transport/socket.c (revision 366411) +++ head/contrib/lib9p/transport/socket.c (revision 366412) @@ -1,363 +1,363 @@ /* * Copyright 2016 Jakub Klama * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted providing that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ #include #include #include #include #include #include #include #ifdef __APPLE__ # include "../apple_endian.h" #else # include #endif #include #include #include #include #include "../lib9p.h" #include "../lib9p_impl.h" #include "../log.h" #include "socket.h" struct l9p_socket_softc { struct l9p_connection *ls_conn; struct sockaddr ls_sockaddr; socklen_t ls_socklen; pthread_t ls_thread; int ls_fd; }; static int l9p_socket_readmsg(struct l9p_socket_softc *, void **, size_t *); static int l9p_socket_get_response_buffer(struct l9p_request *, struct iovec *, size_t *, void *); static int l9p_socket_send_response(struct l9p_request *, const struct iovec *, const size_t, const size_t, void *); static void l9p_socket_drop_response(struct l9p_request *, const struct iovec *, size_t, void *); static void *l9p_socket_thread(void *); static ssize_t xread(int, void *, size_t); static ssize_t xwrite(int, void *, size_t); int l9p_start_server(struct l9p_server *server, const char *host, const char *port) { struct addrinfo *res, *res0, hints; struct kevent kev[2]; struct kevent event[2]; int err, kq, i, val, evs, nsockets = 0; int sockets[2]; memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; err = getaddrinfo(host, port, &hints, &res0); if (err) return (-1); for (res = res0; res; res = res->ai_next) { int s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); val = 1; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); if (s < 0) continue; if (bind(s, res->ai_addr, res->ai_addrlen) < 0) { close(s); continue; } sockets[nsockets] = s; EV_SET(&kev[nsockets++], s, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0); listen(s, 10); } if (nsockets < 1) { L9P_LOG(L9P_ERROR, "bind(): %s", strerror(errno)); return(-1); } kq = kqueue(); if (kevent(kq, kev, nsockets, NULL, 0, NULL) < 0) { L9P_LOG(L9P_ERROR, "kevent(): %s", strerror(errno)); return (-1); } for (;;) { evs = kevent(kq, NULL, 0, event, nsockets, NULL); if (evs < 0) { if (errno == EINTR) continue; L9P_LOG(L9P_ERROR, "kevent(): %s", strerror(errno)); return (-1); } for (i = 0; i < evs; i++) { struct sockaddr client_addr; socklen_t client_addr_len = sizeof(client_addr); int news = accept((int)event[i].ident, &client_addr, &client_addr_len); if (news < 0) { L9P_LOG(L9P_WARNING, "accept(): %s", strerror(errno)); continue; } l9p_socket_accept(server, news, &client_addr, client_addr_len); } } } void l9p_socket_accept(struct l9p_server *server, int conn_fd, struct sockaddr *client_addr, socklen_t client_addr_len) { struct l9p_socket_softc *sc; struct l9p_connection *conn; char host[NI_MAXHOST + 1]; char serv[NI_MAXSERV + 1]; int err; err = getnameinfo(client_addr, client_addr_len, host, NI_MAXHOST, serv, NI_MAXSERV, NI_NUMERICHOST | NI_NUMERICSERV); if (err != 0) { L9P_LOG(L9P_WARNING, "cannot look up client name: %s", gai_strerror(err)); } else { L9P_LOG(L9P_INFO, "new connection from %s:%s", host, serv); } if (l9p_connection_init(server, &conn) != 0) { L9P_LOG(L9P_ERROR, "cannot create new connection"); return; } sc = l9p_calloc(1, sizeof(*sc)); sc->ls_conn = conn; sc->ls_fd = conn_fd; /* * Fill in transport handler functions and aux argument. */ conn->lc_lt.lt_aux = sc; conn->lc_lt.lt_get_response_buffer = l9p_socket_get_response_buffer; conn->lc_lt.lt_send_response = l9p_socket_send_response; conn->lc_lt.lt_drop_response = l9p_socket_drop_response; err = pthread_create(&sc->ls_thread, NULL, l9p_socket_thread, sc); if (err) { L9P_LOG(L9P_ERROR, "pthread_create (for connection from %s:%s): error %s", host, serv, strerror(err)); l9p_connection_close(sc->ls_conn); free(sc); } } static void * l9p_socket_thread(void *arg) { struct l9p_socket_softc *sc = (struct l9p_socket_softc *)arg; struct iovec iov; void *buf; size_t length; for (;;) { if (l9p_socket_readmsg(sc, &buf, &length) != 0) break; iov.iov_base = buf; iov.iov_len = length; l9p_connection_recv(sc->ls_conn, &iov, 1, NULL); free(buf); } L9P_LOG(L9P_INFO, "connection closed"); l9p_connection_close(sc->ls_conn); free(sc); return (NULL); } static int l9p_socket_readmsg(struct l9p_socket_softc *sc, void **buf, size_t *size) { uint32_t msize; size_t toread; ssize_t ret; void *buffer; int fd = sc->ls_fd; assert(fd > 0); buffer = l9p_malloc(sizeof(uint32_t)); ret = xread(fd, buffer, sizeof(uint32_t)); if (ret < 0) { L9P_LOG(L9P_ERROR, "read(): %s", strerror(errno)); return (-1); } if (ret != sizeof(uint32_t)) { if (ret == 0) L9P_LOG(L9P_DEBUG, "%p: EOF", (void *)sc->ls_conn); else L9P_LOG(L9P_ERROR, "short read: %zd bytes of %zd expected", ret, sizeof(uint32_t)); return (-1); } msize = le32toh(*(uint32_t *)buffer); toread = msize - sizeof(uint32_t); buffer = l9p_realloc(buffer, msize); ret = xread(fd, (char *)buffer + sizeof(uint32_t), toread); if (ret < 0) { L9P_LOG(L9P_ERROR, "read(): %s", strerror(errno)); return (-1); } if (ret != (ssize_t)toread) { L9P_LOG(L9P_ERROR, "short read: %zd bytes of %zd expected", ret, toread); return (-1); } *size = msize; *buf = buffer; L9P_LOG(L9P_INFO, "%p: read complete message, buf=%p size=%d", (void *)sc->ls_conn, buffer, msize); return (0); } static int l9p_socket_get_response_buffer(struct l9p_request *req, struct iovec *iov, size_t *niovp, void *arg __unused) { size_t size = req->lr_conn->lc_msize; void *buf; buf = l9p_malloc(size); iov[0].iov_base = buf; iov[0].iov_len = size; *niovp = 1; return (0); } static int l9p_socket_send_response(struct l9p_request *req __unused, const struct iovec *iov, const size_t niov __unused, const size_t iolen, void *arg) { struct l9p_socket_softc *sc = (struct l9p_socket_softc *)arg; assert(sc->ls_fd >= 0); L9P_LOG(L9P_DEBUG, "%p: sending reply, buf=%p, size=%d", arg, iov[0].iov_base, iolen); if (xwrite(sc->ls_fd, iov[0].iov_base, iolen) != (int)iolen) { L9P_LOG(L9P_ERROR, "short write: %s", strerror(errno)); return (-1); } free(iov[0].iov_base); return (0); } static void l9p_socket_drop_response(struct l9p_request *req __unused, - const struct iovec *iov, size_t niov __unused, void *arg) + const struct iovec *iov, size_t niov __unused, void *arg __unused) { L9P_LOG(L9P_DEBUG, "%p: drop buf=%p", arg, iov[0].iov_base); free(iov[0].iov_base); } static ssize_t xread(int fd, void *buf, size_t count) { size_t done = 0; ssize_t ret; while (done < count) { ret = read(fd, (char *)buf + done, count - done); if (ret < 0) { if (errno == EINTR) continue; return (-1); } if (ret == 0) return ((ssize_t)done); done += (size_t)ret; } return ((ssize_t)done); } static ssize_t xwrite(int fd, void *buf, size_t count) { size_t done = 0; ssize_t ret; while (done < count) { ret = write(fd, (char *)buf + done, count - done); if (ret < 0) { if (errno == EINTR) continue; return (-1); } if (ret == 0) return ((ssize_t)done); done += (size_t)ret; } return ((ssize_t)done); } Index: head/contrib/lib9p =================================================================== --- head/contrib/lib9p (revision 366411) +++ head/contrib/lib9p (revision 366412) Property changes on: head/contrib/lib9p ___________________________________________________________________ Added: svn:mergeinfo ## -0,0 +0,58 ## Merged /projects/mpsutil/contrib/lib9p:r286179-290100 Merged /projects/contrib-netbsd-update-12/contrib/lib9p:r303899-303984 Merged /projects/netbsd-tests-upstream-01-2017/contrib/lib9p:r312125-313435 Merged /projects/bsd_rdma_4_9/contrib/lib9p:r319973-326168 Merged /vendor/lib9p/dist:r361051-366410 Merged /projects/clang-sparc64/contrib/lib9p:r262258-262612 Merged /projects/openssl111/contrib/lib9p:r339079 Merged /projects/bectl/contrib/lib9p:r336666-337662 Merged /projects/release-pkg/contrib/lib9p:r274131-298104 Merged /user/ngie/release-pkg-fix-tests/contrib/lib9p:r298865-299093 Merged /projects/collation/contrib/lib9p:r286424-290491 Merged /projects/release-arm64/contrib/lib9p:r281786,281788,281792 Merged /vendor/device-tree/dist/contrib/lib9p:r303380 Merged /projects/release-git/contrib/lib9p:r363184-364890 Merged /projects/elftoolchain/contrib/lib9p:r260687-261245 Merged /projects/clang500-import/contrib/lib9p:r316992-321352 Merged /projects/clang400-import/contrib/lib9p:r311132-314524 Merged /projects/clang600-import/contrib/lib9p:r326936-327339,327341-327933 Merged /projects/clang700-import/contrib/lib9p:r336870-341824 Merged /projects/clang800-import/contrib/lib9p:r343202-344778 Merged /projects/clang900-import/contrib/lib9p:r351317-353352 Merged /projects/elftoolchain-update-r3130/contrib/lib9p:r276164,276167,276170-276172 Merged /projects/ipfw/contrib/lib9p:r267383-272837 Merged /user/ngie/more-tests2/contrib/lib9p:r288935-289179,289223-289224,289226-289227,289230,289236,289325,289437,289440,289478,289484-289486,290904,290921 Merged /projects/bsnmp-improved-ipv6-support/contrib/lib9p:r301868 Merged /projects/netbsd-tests-update-12/contrib/lib9p:r303985-305318 Merged /projects/clang360-import/contrib/lib9p:r277327-280030 Merged /projects/vnet/contrib/lib9p:r295220 Merged /projects/clang1000-import/contrib/lib9p:r356848-358850 Merged /projects/pms/contrib/lib9p:r285199-285661 Merged /projects/clang380-import/contrib/lib9p:r292913-296412 Merged /projects/clang1100-import/contrib/lib9p:r363583-364279 Merged /projects/zfsd/head/contrib/lib9p:r266519,269993 Merged /projects/fuse2/contrib/lib9p:r344558-350621,350944,350955 Merged /projects/random_number_generator/contrib/lib9p:r254613-256243 Merged /projects/release-embedded/contrib/lib9p:r262314,262504,262510-262511,262580,262660,262662,262700,262713,262774,262786-262788,262790-262792,262798,262802,262808 Merged /projects/largeSMP/contrib/lib9p:r221273-222812,222815-223757 Merged /user/ngie/bsnmp_cleanup/contrib/lib9p:r295193 Merged /projects/head_mfi/contrib/lib9p:r233621 Merged /user/delphij/zfs-arc-rebase/contrib/lib9p:r281754 Merged /user/ngie/bug203673/contrib/lib9p:r289470-289489 Merged /projects/import-googletest-1.8.1/contrib/lib9p:r344081-345031,345036,345038,345042,345045,345047 Merged /projects/cxl_iscsi/contrib/lib9p:r291227-291228,292618 Merged /projects/lldb-r201577/contrib/lib9p:r262185-262527 Merged /user/ngie/more-tests/contrib/lib9p:r281427-281428,281430,281432,281450,281460,281464-281465,281485,281489-281491,281515,281519,281589,281593-281597,281619,284388,288316,288321-288327,288422,288476,288478-288481,288483,288578,288650-288651,288655-288656,288659-288661,288663,288673-288676,288680,288828,288930-288932 Merged /projects/pf/head/contrib/lib9p:r263908 Merged /projects/clang-trunk/contrib/lib9p:r283596-287505 Merged /projects/release-arm-redux/contrib/lib9p:r278203,278595-278597,278610,280643-280650,280652,280655,282539-282546,282548,282553-282557,282564,282566,282570,282573,282587-282593,282596-282607,282615-282616,282624-282629,282631,282633,282635-282640,282642,282647-282648,282653-282654,282656-282657,282659,282662-282667,282682,282691 Merged /projects/building-blocks/contrib/lib9p:r275142-275143,275198,275297,275306-275307,275309,275311,275556,275558,275600,277445,277670,277673 Merged /projects/multi-fibv6/head/contrib/lib9p:r230929-231848 Merged /projects/clang350-import/contrib/lib9p:r274961-275126,275128-275133,275135-276476 Merged /user/ngie/socket-tests/contrib/lib9p:r293882-293885,294103,294117,294119-294120,294245-294247,294488,294555,294643-294644 Merged /vendor/resolver/dist/contrib/lib9p:r1540-186085 Merged /projects/clang370-import/contrib/lib9p:r287506-288928 Merged /projects/quota64/contrib/lib9p:r184125-207707 Merged /projects/clang390-import/contrib/lib9p:r303250-308866,308868-309123 Merged /projects/clang391-import/contrib/lib9p:r309166-310192 Merged /user/ngie/make_check/contrib/lib9p:r291879-295379