X-Git-Url: http://git.alex.org.uk diff --git a/nbd-client.c b/nbd-client.c index 51927b1..4156915 100644 --- a/nbd-client.c +++ b/nbd-client.c @@ -28,6 +28,8 @@ #include #include #include +#include +#include #ifndef __GNUC__ #error I need GCC to work @@ -37,6 +39,27 @@ #define MY_NAME "nbd_client" #include "cliserv.h" +int check_conn(char* devname, int do_print) { + char buf[256]; + int fd; + int len; + if(!strncmp(devname, "/dev/", 5)) { + devname+=5; + } + snprintf(buf, 256, "/sys/block/%s/pid", devname); + if((fd=open(buf, O_RDONLY))<0) { + if(errno==ENOENT) { + return 1; + } else { + return 2; + } + } + len=read(fd, buf, 256); + buf[len-1]='\0'; + if(do_print) printf("%s\n", buf); + return 0; +} + int opennet(char *name, int port, int sdp) { int sock; struct sockaddr_in xaddrin; @@ -163,6 +186,9 @@ void finish_sock(int sock, int nbd, int swap) { if (ioctl(nbd, NBD_SET_SOCK, sock) < 0) err("Ioctl NBD_SET_SOCK failed: %m\n"); +/* + * If anyone ever forward-patches this patch, I'll happily re-enable + * this code. Until then... #ifndef SO_SWAPPING if (swap) err("You have to compile me on machine with swapping patch enabled in order to use it later."); @@ -171,6 +197,8 @@ void finish_sock(int sock, int nbd, int swap) { if (setsockopt(sock, SOL_SOCKET, SO_SWAPPING, &one, sizeof(int)) < 0) err("Could not enable swapping: %m"); #endif +*/ + mlockall(MCL_CURRENT | MCL_FUTURE); } int main(int argc, char *argv[]) { @@ -191,6 +219,7 @@ int main(int argc, char *argv[]) { fprintf(stderr, "nbd-client version %s\n", PACKAGE_VERSION); fprintf(stderr, "Usage: nbd-client [bs=blocksize] [timeout=sec] host port nbd_device [-swap] [-persist]\n"); fprintf(stderr, "Or : nbd-client -d nbd_device\n"); + fprintf(stderr, "Or : nbd-client -c nbd_device\n"); fprintf(stderr, "Default value for blocksize is 1024 (recommended for ethernet)\n"); fprintf(stderr, "Allowed values for blocksize are 512,1024,2048,4096\n"); /* will be checked in kernel :) */ fprintf(stderr, "Note, that kernel 2.4.2 and older ones do not work correctly with\n"); @@ -199,7 +228,7 @@ int main(int argc, char *argv[]) { } ++argv; --argc; /* skip programname */ - + if (strcmp(argv[0], "-d")==0) { nbd = open(argv[1], O_RDWR); if (nbd < 0) @@ -221,6 +250,9 @@ int main(int argc, char *argv[]) { printf("done\n"); return 0; } + if(strcmp(argv[0], "-c")==0) { + return check_conn(argv[1], 1); + } if (strncmp(argv[0], "bs=", 3)==0) { blocksize=atoi(argv[0]+3); @@ -278,12 +310,17 @@ int main(int argc, char *argv[]) { /* Go daemon */ chdir("/"); + do { #ifndef NOFORK - if (fork()) - exit(0); + if (fork()) { + while(check_conn(nbddev, 0)) { + sleep(1); + } + open(nbddev, O_RDONLY); + exit(0); + } #endif - do { if (ioctl(nbd, NBD_DO_IT) < 0) { fprintf(stderr, "Kernel call returned: %m"); if(errno==EBADR) {