projects
/
nbd.git
/ blobdiff
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of git://nbd.git.sourceforge.net/gitroot/nbd/nbd
[nbd.git]
/
nbd-client.c
diff --git
a/nbd-client.c
b/nbd-client.c
index
8fc39d5
..
78e62f9
100644
(file)
--- a/
nbd-client.c
+++ b/
nbd-client.c
@@
-41,6
+41,10
@@
#define MY_NAME "nbd_client"
#include "cliserv.h"
#define MY_NAME "nbd_client"
#include "cliserv.h"
+#ifdef WITH_SDP
+#include <sdp_inet.h>
+#endif
+
int check_conn(char* devname, int do_print) {
char buf[256];
char* p;
int check_conn(char* devname, int do_print) {
char buf[256];
char* p;
@@
-146,20
+150,25
@@
void negotiate(int sock, u64 *rsize64, u32 *flags, char* name) {
if(read(sock, &tmp, sizeof(uint16_t)) < 0) {
err("Failed reading flags: %m");
}
if(read(sock, &tmp, sizeof(uint16_t)) < 0) {
err("Failed reading flags: %m");
}
- *flags = ((u32)ntohs(tmp)) << 16;
+ *flags = ((u32)ntohs(tmp));
/* reserved for future use*/
/* reserved for future use*/
- write(sock, &reserved, sizeof(reserved));
+ if (write(sock, &reserved, sizeof(reserved)) < 0)
+ err("Failed/2.1: %m");
/* Write the export name that we're after */
magic = ntohll(opts_magic);
/* Write the export name that we're after */
magic = ntohll(opts_magic);
- write(sock, &magic, sizeof(magic));
+ if (write(sock, &magic, sizeof(magic)) < 0)
+ err("Failed/2.2: %m");
opt = ntohl(NBD_OPT_EXPORT_NAME);
opt = ntohl(NBD_OPT_EXPORT_NAME);
- write(sock, &opt, sizeof(opt));
+ if (write(sock, &opt, sizeof(opt)) < 0)
+ err("Failed/2.3: %m");
namesize = (u32)strlen(name);
namesize = ntohl(namesize);
namesize = (u32)strlen(name);
namesize = ntohl(namesize);
- write(sock, &namesize, sizeof(namesize));
- write(sock, name, strlen(name));
+ if (write(sock, &namesize, sizeof(namesize)) < 0)
+ err("Failed/2.4: %m");
+ if (write(sock, name, strlen(name)) < 0)
+ err("Failed/2.4: %m");
} else {
if (magic != cliserv_magic)
err("Not enough cliserv_magic");
} else {
if (magic != cliserv_magic)
err("Not enough cliserv_magic");
@@
-171,11
+180,11
@@
void negotiate(int sock, u64 *rsize64, u32 *flags, char* name) {
size64 = ntohll(size64);
#ifdef NBD_SET_SIZE_BLOCKS
size64 = ntohll(size64);
#ifdef NBD_SET_SIZE_BLOCKS
- if ((size64>>10) > (~0UL >> 1)) {
+ if ((size64>>12) > (uint64_t)~0UL) {
printf("size = %luMB", (unsigned long)(size64>>20));
err("Exported device is too big for me. Get 64-bit machine :-(\n");
} else
printf("size = %luMB", (unsigned long)(size64>>20));
err("Exported device is too big for me. Get 64-bit machine :-(\n");
} else
- printf("size = %luKB", (unsigned long)(size64>>10));
+ printf("size = %luMB", (unsigned long)(size64>>20));
#else
if (size64 > (~0UL >> 1)) {
printf("size = %luKB", (unsigned long)(size64>>10));
#else
if (size64 > (~0UL >> 1)) {
printf("size = %luKB", (unsigned long)(size64>>10));
@@
-206,16
+215,18
@@
void setsizes(int nbd, u64 size64, int blocksize, u32 flags) {
int read_only = (flags & NBD_FLAG_READ_ONLY) ? 1 : 0;
#ifdef NBD_SET_SIZE_BLOCKS
int read_only = (flags & NBD_FLAG_READ_ONLY) ? 1 : 0;
#ifdef NBD_SET_SIZE_BLOCKS
- if (size64/blocksize > (~0UL >> 1))
+ if (size64>>12 > (uint64_t)~0UL)
err("Device too large.\n");
else {
int er;
err("Device too large.\n");
else {
int er;
- if (ioctl(nbd, NBD_SET_BLKSIZE, (unsigned long)blocksize) < 0)
+ if (ioctl(nbd, NBD_SET_BLKSIZE, 4096UL) < 0)
err("Ioctl/1.1a failed: %m\n");
err("Ioctl/1.1a failed: %m\n");
- size = (unsigned long)(size64/blocksize);
+ size = (unsigned long)(size64>>12);
if ((er = ioctl(nbd, NBD_SET_SIZE_BLOCKS, size)) < 0)
err("Ioctl/1.1b failed: %m\n");
if ((er = ioctl(nbd, NBD_SET_SIZE_BLOCKS, size)) < 0)
err("Ioctl/1.1b failed: %m\n");
- fprintf(stderr, "bs=%d, sz=%lu\n", blocksize, size);
+ if (ioctl(nbd, NBD_SET_BLKSIZE, (unsigned long)blocksize) < 0)
+ err("Ioctl/1.1c failed: %m\n");
+ fprintf(stderr, "bs=%d, sz=%llu bytes\n", blocksize, 4096ULL*size);
}
#else
if (size64 > (~0UL >> 1)) {
}
#else
if (size64 > (~0UL >> 1)) {
@@
-229,6
+240,9
@@
void setsizes(int nbd, u64 size64, int blocksize, u32 flags) {
ioctl(nbd, NBD_CLEAR_SOCK);
ioctl(nbd, NBD_CLEAR_SOCK);
+ /* ignore error as kernel may not support */
+ ioctl(nbd, NBD_SET_FLAGS, (unsigned long) flags);
+
if (ioctl(nbd, BLKROSET, (unsigned long) &read_only) < 0)
err("Unable to set read-only attribute for device");
}
if (ioctl(nbd, BLKROSET, (unsigned long) &read_only) < 0)
err("Unable to set read-only attribute for device");
}
@@
-437,7
+451,10
@@
int main(int argc, char *argv[]) {
/* Go daemon */
#ifndef NOFORK
/* Go daemon */
#ifndef NOFORK
- if(!nofork) daemon(0,0);
+ if(!nofork) {
+ if (daemon(0,0) < 0)
+ err("Cannot detach from terminal");
+ }
#endif
do {
#ifndef NOFORK
#endif
do {
#ifndef NOFORK