From dd0de5beb2e585ea11e49e0014ae2bf95f8118bb Mon Sep 17 00:00:00 2001 From: yoe Date: Fri, 10 Oct 2003 12:45:21 +0000 Subject: [PATCH] r38: configure.in: * Added extra checks as suggested by autoscan * Added --enable-lfs option, to avoid having to play with CFLAGS config.h.in: * Updated nbd-server.c: * Rectify type of mainloop::size_host, closing sf.net bugs # 814435 and 817385 * Added socket option SO_KEEPALIVE, so that keepalive packages are being sent after "a while" (still two hours with the Linux kernel's default settings, but oh well). Closes sf.net bug # 819235. * fclose() the PID file after writing to it, so that other processes can actually read our PID from that file. Makes it a bit useful, too. cliserv.h: * Support for --enable-lfs option. --- cliserv.h | 7 ++++ config.h.in | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 22 +++++++++++-- nbd-server.c | 19 +++++++++-- 4 files changed, 145 insertions(+), 6 deletions(-) diff --git a/cliserv.h b/cliserv.h index 431358c..3ca02e7 100644 --- a/cliserv.h +++ b/cliserv.h @@ -13,6 +13,8 @@ #include #include #include +#include +#include #if SIZEOF_UNSIGNED_SHORT_INT==4 typedef unsigned short u32; @@ -43,6 +45,11 @@ typedef unsigned long long u64; #include "nbd.h" #endif +#if NBD_LFS==1 +#define _LARGEFILE_SOURCE +#define _FILE_OFFSET_BITS=64 +#endif + u64 cliserv_magic = 0x00420281861253LL; #define INIT_PASSWD "NBDMAGIC" diff --git a/config.h.in b/config.h.in index 4921fef..de268b4 100644 --- a/config.h.in +++ b/config.h.in @@ -1,5 +1,23 @@ /* config.h.in. Generated from configure.in by autoheader. */ +/* Define to 1 if you have the `alarm' function. */ +#undef HAVE_ALARM + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARPA_INET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define to 1 if you have the `gethostbyname' function. */ +#undef HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the `inet_ntoa' function. */ +#undef HAVE_INET_NTOA + /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H @@ -9,30 +27,86 @@ /* Define to 1 if you have the `llseek' function. */ #undef HAVE_LLSEEK +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#undef HAVE_REALLOC + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H +/* Define to 1 if you have the `strstr' function. */ +#undef HAVE_STRSTR + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSLOG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MOUNT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H +/* Define to 1 if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H +/* Define to 1 if you have the `vfork' function. */ +#undef HAVE_VFORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_VFORK_H + +/* Define to 1 if `fork' works. */ +#undef HAVE_WORKING_FORK + +/* Define to 1 if `vfork' works. */ +#undef HAVE_WORKING_VFORK + +/* Define to 1 if Large File Support should be enabled */ +#undef NBD_LFS + /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT @@ -48,6 +122,14 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION +/* Define to 1 if the C compiler supports function prototypes. */ +#undef PROTOTYPES + +/* Define to 1 if the `setvbuf' function takes the buffering type as its + second argument and the buffer pointer as the third, as on System V before + release 3. */ +#undef SETVBUF_REVERSED + /* The size of a `unsigned int', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_INT @@ -67,6 +149,27 @@ first (like Motorola and SPARC, unlike Intel and VAX). */ #undef WORDS_BIGENDIAN +/* Define like PROTOTYPES; this can be used by system headers. */ +#undef __PROTOTYPES + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + /* Define as `__inline' if that's what the C compiler calls it, or to nothing if it is not supported. */ #undef inline + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to `long' if does not define. */ +#undef off_t + +/* Define to `int' if does not define. */ +#undef pid_t + +/* Define to rpl_realloc if the replacement function should be used. */ +#undef realloc + +/* Define as `fork' if `vfork' does not work. */ +#undef vfork diff --git a/configure.in b/configure.in index 86d7ac9..0b6919d 100644 --- a/configure.in +++ b/configure.in @@ -1,7 +1,15 @@ dnl Configure script for NBD system dnl (c) 1998 Martin Mares , (c) 2000 Pavel Machek AC_INIT(nbd, 2.5, wouter@debian.org) - +AC_ARG_ENABLE(lfs, AC_HELP_STRING([--enable-lfs],[Enable Large File Support (default is no)]), [NBD_LFS=1], [NBD_LFS=0]) +AC_MSG_CHECKING([whether Large File Support should be enabled]) +if test $NBD_LFS -eq 1; then + AC_DEFINE(NBD_LFS,1, [Define to 1 if Large File Support should be enabled]) + AC_MSG_RESULT([yes]) +else + AC_DEFINE(NBD_LFS,0) + AC_MSG_RESULT([no]) +fi AC_PROG_CC AC_MSG_CHECKING(whether warnings should be enabled) if test -n "$GCC" ; then @@ -13,11 +21,16 @@ fi #AC_PROG_INSTALL AC_C_BIGENDIAN AC_C_INLINE +AC_C_CONST AC_CHECK_SIZEOF(unsigned short int) AC_CHECK_SIZEOF(unsigned int) AC_CHECK_SIZEOF(unsigned long int) AC_CHECK_SIZEOF(unsigned long long int) -AC_CHECK_FUNCS(llseek) +AC_CHECK_FUNCS([llseek alarm gethostbyname inet_ntoa memset socket strerror strstr]) +AC_FUNC_FORK +AC_FUNC_MALLOC +AC_FUNC_REALLOC +AC_FUNC_SETVBUF_REVERSED AC_MSG_CHECKING(whether client should be built) case "`uname`" in *Linux*) BUILD_CLIENT=nbd-client @@ -25,7 +38,10 @@ case "`uname`" in ;; *) AC_MSG_RESULT(no) ;; esac -AC_CHECK_HEADERS([linux/nbd.h]) +AC_CHECK_HEADERS([linux/nbd.h arpa/inet.h fcntl.h netdb.h netinet/in.h sys/ioctl.h sys/mount.h sys/socket.h syslog.h]) +AC_HEADER_SYS_WAIT +AC_TYPE_OFF_T +AC_TYPE_PID_T AC_SUBST(BUILD_CLIENT) AC_CONFIG_HEADER(config.h) AC_OUTPUT(Makefile) diff --git a/nbd-server.c b/nbd-server.c index f373d0e..5163fb3 100644 --- a/nbd-server.c +++ b/nbd-server.c @@ -31,6 +31,15 @@ * so that processes don't think they have to wait for us, which is * interesting for initscripts as well. Wouter Verhelst * + * Version 2.5 - Bugfix release: forgot to reset child_arraysize to + * zero after fork()ing, resulting in nbd-server going berserk + * when it receives a signal with at least one child open. Wouter + * Verhelst + * 10/10/2003 - Added socket option SO_KEEPALIVE (sf.net bug 819235); + * rectified type of mainloop::size_host (sf.net bugs 814435 and + * 817385); close the PID file after writing to it, so that the + * daemon can actually be found. Wouter Verhelst + * */ #define VERSION PACKAGE_VERSION @@ -305,6 +314,7 @@ void connectme(int port) pidf=fopen(pidfname, "w"); if(pidf) { fprintf(pidf,"%d", (int)getpid()); + fclose(pidf); } else { perror("fopen"); fprintf(stderr, "Not fatal; continuing"); @@ -318,7 +328,10 @@ void connectme(int port) /* lose the pesky "Address already in use" error message */ if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) { - err("setsockopt"); + err("setsockopt SO_REUSEADDR"); + } + if (setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,&yes,sizeof(int)) == -1) { + err("setsockopt SO_KEEPALIVE"); } DEBUG("Waiting for connections... bind, "); @@ -493,7 +506,7 @@ int mainloop(int net) struct nbd_reply reply; char zeros[300]; int i = 0; - off_t size_host; + u64 size_host; memset(zeros, 0, 290); if (write(net, INIT_PASSWD, 8) < 0) @@ -501,7 +514,7 @@ int mainloop(int net) cliserv_magic = htonll(cliserv_magic); if (write(net, &cliserv_magic, sizeof(cliserv_magic)) < 0) err("Negotiation failed: %m"); - size_host = htonll(exportsize); + size_host = htonll((u64)exportsize); if (write(net, &size_host, 8) < 0) err("Negotiation failed: %m"); if (write(net, zeros, 128) < 0) -- 1.7.10.4