X-Git-Url: http://git.alex.org.uk 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