From aacf5f5938f8c4147fee3bf29f46892556c13a09 Mon Sep 17 00:00:00 2001 From: yoe Date: Mon, 25 Aug 2003 11:18:30 +0000 Subject: [PATCH] r34: Fixed one minor bug --- cliserv.h | 7 +++ config.h.in | 73 ++++++++++++++++++++++----- configure.in | 4 +- nbd-server.c | 159 ++++++++++++++++++++++++++++++++++------------------------ 4 files changed, 163 insertions(+), 80 deletions(-) diff --git a/cliserv.h b/cliserv.h index 9743523..431358c 100644 --- a/cliserv.h +++ b/cliserv.h @@ -34,7 +34,14 @@ typedef unsigned long long u64; #error I need at least some 64-bit type #endif +#ifdef HAVE_LINUX_NBD_H #include +#else +/* get it from a kernel source somewhere, and dump it in this directory. + * Required for people trying to compile nbd-server on a non-linux + * system. */ +#include "nbd.h" +#endif u64 cliserv_magic = 0x00420281861253LL; #define INIT_PASSWD "NBDMAGIC" diff --git a/config.h.in b/config.h.in index e53ca6b..4921fef 100644 --- a/config.h.in +++ b/config.h.in @@ -1,23 +1,72 @@ -/* config.h.in. Generated automatically from configure.in by autoheader. */ +/* config.h.in. Generated from configure.in by autoheader. */ -/* Define as __inline if that's what the C compiler calls it. */ -#undef inline +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H -/* Define if your processor stores words with the most significant - byte first (like Motorola and SPARC, unlike Intel and VAX). */ -#undef WORDS_BIGENDIAN +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_NBD_H + +/* Define to 1 if you have the `llseek' function. */ +#undef HAVE_LLSEEK + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* 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 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 header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H -/* The number of bytes in a unsigned int. */ +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of a `unsigned int', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_INT -/* The number of bytes in a unsigned long int. */ +/* The size of a `unsigned long int', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_LONG_INT -/* The number of bytes in a unsigned long long int. */ +/* The size of a `unsigned long long int', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_LONG_LONG_INT -/* The number of bytes in a unsigned short int. */ +/* The size of a `unsigned short int', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_SHORT_INT -/* Define if you have the llseek function. */ -#undef HAVE_LLSEEK +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN + +/* Define as `__inline' if that's what the C compiler calls it, or to nothing + if it is not supported. */ +#undef inline diff --git a/configure.in b/configure.in index 7911379..5e4fc24 100644 --- a/configure.in +++ b/configure.in @@ -1,7 +1,6 @@ dnl Configure script for NBD system dnl (c) 1998 Martin Mares , (c) 2000 Pavel Machek -AC_INIT(nbd-server.c) - +AC_INIT(nbd, 2.4, wouter@debian.org) AC_PROG_CC AC_MSG_CHECKING(whether warnings should be enabled) @@ -26,6 +25,7 @@ case "`uname`" in ;; *) AC_MSG_RESULT(no) ;; esac +AC_CHECK_HEADERS([linux/nbd.h]) AC_SUBST(BUILD_CLIENT) AC_CONFIG_HEADER(config.h) AC_OUTPUT(Makefile) diff --git a/nbd-server.c b/nbd-server.c index e19a381..bd46507 100644 --- a/nbd-server.c +++ b/nbd-server.c @@ -59,7 +59,11 @@ /* Authorization file should contain lines with IP addresses of clients authorized to use the server. If it does not exist, - access is permitted. */ + access is permitted. + + You may want to set this to an absolute path if you're not using + -DNODAEMON, since if you don't, nbd-server will look for this file + in the root-directory ("/"). */ #define AUTH_FILE "nbd_server.allow" /* how much space for child PIDs we have by default. Dynamically allocated, and will be realloc()ed if out of space, so this should @@ -109,21 +113,25 @@ int authorized_client(char *name) /* 0 - authorization refused, 1 - OK authorization file contains one line per machine, no wildcards */ -{ FILE *f ; +{ + FILE *f ; - char line[LINELEN] ; + char line[LINELEN] ; - if ((f=fopen(AUTH_FILE,"r"))==NULL) - { msg4(LOG_INFO,"Can't open authorization file %s (%s).", - AUTH_FILE,strerror(errno)) ; - return 1 ; - } + if ((f=fopen(AUTH_FILE,"r"))==NULL) { + msg4(LOG_INFO,"Can't open authorization file %s (%s).", + AUTH_FILE,strerror(errno)) ; + return 1 ; + } - while (fgets(line,LINELEN,f)!=NULL) { - if (strncmp(line,name,strlen(name))==0) { fclose(f) ; return 1 ; } - } - fclose(f) ; - return 0 ; + while (fgets(line,LINELEN,f)!=NULL) { + if (strncmp(line,name,strlen(name))==0) { + fclose(f); + return 1; + } + } + fclose(f) ; + return 0 ; } inline void readit(int f, void *buf, int len) @@ -167,6 +175,7 @@ u32 *difmap=NULL ; char clientname[256] ; int child_arraysize=DEFAULT_CHILD_ARRAY; pid_t *children; +char pidfname[256]; #define DIFFPAGESIZE 4096 /* diff file uses those chunks */ @@ -257,13 +266,19 @@ void sigchld_handler(int s) /* If we are terminated, make sure our children are, too. */ void sigterm_handler(int s) { int i; + int parent=0; for(i=0;i ((off_t)0)) { @@ -590,7 +617,7 @@ off_t size_autodetect(int export) } else { DEBUG2("lseek failed: %d", errno==EBADF?1:(errno==ESPIPE?2:(errno==EINVAL?3:4))); } - + DEBUG("looking for export size with fstat\n"); stat_buf.st_size = 0; error = fstat(export, &stat_buf); @@ -599,7 +626,7 @@ off_t size_autodetect(int export) } else { err("fstat failed: %m"); } - + #ifdef BLKGETSIZE DEBUG("looking for export size with ioctl BLKGETSIZE\n"); if (!ioctl(export, BLKGETSIZE, &es32) && es32) { @@ -608,7 +635,7 @@ off_t size_autodetect(int export) } #endif err("Could not find size of exported block device: %m"); - return (off_t)-1; + return OFFT_MAX; } int main(int argc, char *argv[]) @@ -631,44 +658,44 @@ int main(int argc, char *argv[]) void serveconnection(int net) { - off_t i ; - - for (i=0; i (off_t)OFFT_MAX) { - err("Size of exported file is too big\n"); - } - else - msg3(LOG_INFO, "size of exported file/device is %Lu", - (unsigned long long)exportsize); - - if (flags & F_COPYONWRITE) { - sprintf(difffilename,"%s-%s-%d.diff",exportname2,clientname, - (int)getpid()) ; - msg3(LOG_INFO,"About to create map and diff file %s",difffilename) ; - difffile=open(difffilename,O_RDWR | O_CREAT | O_TRUNC,0600) ; - if (difffile<0) err("Could not create diff file (%m)") ; - if ((difmap=calloc(exportsize/DIFFPAGESIZE,sizeof(u32)))==NULL) - err("Could not allocate memory") ; - for (i=0;i (off_t)OFFT_MAX) { + err("Size of exported file is too big\n"); + } + else + msg3(LOG_INFO, "size of exported file/device is %Lu", + (unsigned long long)exportsize); + + if (flags & F_COPYONWRITE) { + sprintf(difffilename,"%s-%s-%d.diff",exportname2,clientname, + (int)getpid()) ; + msg3(LOG_INFO,"About to create map and diff file %s",difffilename) ; + difffile=open(difffilename,O_RDWR | O_CREAT | O_TRUNC,0600) ; + if (difffile<0) err("Could not create diff file (%m)") ; + if ((difmap=calloc(exportsize/DIFFPAGESIZE,sizeof(u32)))==NULL) + err("Could not allocate memory") ; + for (i=0;i