-/* 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 <inttypes.h> 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 <linux/nbd.h> 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 <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
-/* The number of bytes in a unsigned int. */
+/* Define to 1 if you have the <unistd.h> 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
/* 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
/* 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)
char clientname[256] ;
int child_arraysize=DEFAULT_CHILD_ARRAY;
pid_t *children;
+char pidfname[256];
#define DIFFPAGESIZE 4096 /* diff file uses those chunks */
/* If we are terminated, make sure our children are, too. */
void sigterm_handler(int s) {
int i;
+ int parent=0;
for(i=0;i<child_arraysize;i++) {
if(children[i]) {
kill(children[i], s);
+ parent=1;
}
}
+ if(parent) {
+ unlink(pidfname);
+ }
+
exit(0);
}
int yes=1;
#else
char yes='1';
-#endif
+#endif /* sun */
+#ifndef NODAEMON
+#ifndef NOFORK
+ FILE*pidf;
+
+ if(port) {
+ if(daemon(0,0)<0) {
+ err("daemon");
+ }
+ snprintf(pidfname, sizeof(char)*255, "/var/run/nbd-server.%d.pid", port);
+ pidf=fopen(pidfname, "w");
+ if(pidf) {
+ fprintf(pidf,"%d", (int)getpid());
+ } else {
+ perror("fopen");
+ fprintf(stderr, "Not fatal; continuing");
+ }
+ }
+#endif /* NOFORK */
+#endif /* NODAEMON */
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
err("socket: %m");
err("sigaction: %m");
children=malloc(sizeof(pid_t)*child_arraysize);
memset(children, 0, sizeof(pid_t)*DEFAULT_CHILD_ARRAY);
-#ifndef NODAEMON
-#ifndef NOFORK
- if(daemon(1,0)<0) {
- err("daemon");
- }
-#endif /* NOFORK */
-#endif /* NODAEMON */
for(;;) { /* infinite loop */
if ((net = accept(sock, (struct sockaddr *) &addrin, &addrinlen)) < 0)
err("accept: %m");
int rawexpread(off_t a, char *buf, int len)
{
- maybeseek(export[a/hunksize], a%hunksize);
- return (read(export[a/hunksize], buf, len) != len);
+ maybeseek(export[a/hunksize], a%hunksize);
+ return (read(export[a/hunksize], buf, len) != len);
}
int expread(off_t a, char *buf, int len)
u32 es32;
struct stat stat_buf;
int error;
-
+
DEBUG("looking for export size with lseek SEEK_END\n");
es = lseek(export, (off_t)0, SEEK_END);
if (es > ((off_t)0)) {
} 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);
} else {
err("fstat failed: %m");
}
-
+
#ifdef BLKGETSIZE
DEBUG("looking for export size with ioctl BLKGETSIZE\n");
if (!ioctl(export, BLKGETSIZE, &es32) && es32) {
}
#endif
err("Could not find size of exported block device: %m");
- return (off_t)-1;
+ return OFFT_MAX;
}
int main(int argc, char *argv[])
void serveconnection(int net)
{
- off_t i ;
-
- for (i=0; i<exportsize; i+=hunksize) {
- char exportname3[1024];
-
- sprintf(exportname3, exportname2, i/hunksize);
- printf( "Opening %s\n", exportname3 );
- if ((export[i/hunksize] = open(exportname3, (flags & F_READONLY) ? O_RDONLY : O_RDWR)) == -1) {
- /* Read WRITE ACCESS was requested by media is only read only */
- autoreadonly = 1;
- flags |= F_READONLY;
- if ((export[i/hunksize] = open(exportname3, O_RDONLY)) == -1)
- err("Could not open exported file: %m");
+ off_t i ;
+
+ for (i=0; i<exportsize; i+=hunksize) {
+ char exportname3[1024];
+
+ sprintf(exportname3, exportname2, i/hunksize);
+ printf( "Opening %s\n", exportname3 );
+ if ((export[i/hunksize] = open(exportname3, (flags & F_READONLY) ? O_RDONLY : O_RDWR)) == -1) {
+ /* Read WRITE ACCESS was requested by media is only read only */
+ autoreadonly = 1;
+ flags |= F_READONLY;
+ if ((export[i/hunksize] = open(exportname3, O_RDONLY)) == -1)
+ err("Could not open exported file: %m");
+ }
+ }
+
+ if (exportsize == (off_t)OFFT_MAX) {
+ exportsize = size_autodetect(export[0]);
}
- }
-
- if (exportsize == (off_t)OFFT_MAX) {
- exportsize = size_autodetect(export[0]);
- }
- if (exportsize > (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<exportsize/DIFFPAGESIZE;i++) difmap[i]=(u32)-1 ;
- }
-
- setmysockopt(net);
-
- mainloop(net);
+ if (exportsize > (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<exportsize/DIFFPAGESIZE;i++) difmap[i]=(u32)-1 ;
+ }
+
+ setmysockopt(net);
+
+ mainloop(net);
}