make mt-sosd support "blocking" locks on peer
[archipelago] / xseg / peers / user / vlmc-tool.c
index d8be727..a9b1d96 100644 (file)
@@ -31,7 +31,7 @@ int validate_alphanumeric(char *s)
 {
        int i;
        int len = safe_strlen(s);
-       if (len < 0){
+       if (len <= 0){
                return 0;
        }
 
@@ -47,7 +47,7 @@ int validate_numeric(char *s)
 {
        int i;
        int len = safe_strlen(s);
-       if (len < 0)
+       if (len <= 0)
                return 0;
 
        for (i = 0; i < len; i++) {
@@ -79,7 +79,7 @@ int wait_reply(struct xseg_request *expected_req)
        struct xseg_request *rec;
        xseg_prepare_wait(xseg, srcport);
        while(1) {
-               rec = xseg_receive(xseg, srcport);
+               rec = xseg_receive(xseg, srcport, 0);
                if (rec) {
                        if (rec != expected_req) {
                                fprintf(stderr, "Unknown received req. Putting req.\n");
@@ -100,6 +100,7 @@ int wait_reply(struct xseg_request *expected_req)
 
 int vlmc_create(char *name, uint64_t size, char *snap)
 {
+       int ret;
        int targetlen = safe_strlen(name);
        int snaplen = safe_strlen(snap);
        if (targetlen <= 0) {
@@ -110,6 +111,8 @@ int vlmc_create(char *name, uint64_t size, char *snap)
                fprintf(stderr, "Size or snap must be provided in create\n");
                return -1;
        }
+       XSEGLOG("Name: %s", name);
+       XSEGLOG("Snap: %s", snap);
 
        struct xseg_request *req = xseg_get_request(xseg, srcport, mportno, X_ALLOC);
        if (!req) {
@@ -122,14 +125,17 @@ int vlmc_create(char *name, uint64_t size, char *snap)
                xseg_put_request(xseg, req, srcport);
                return -1;
        }
+       //FIXME what to do if no snap ? how do i send mapper to create a non copy up volume?
        char *target = xseg_get_target(xseg, req);
        strncpy(target, name, targetlen);
        struct xseg_request_clone *xclone = (struct xseg_request_clone *) xseg_get_data(xseg, req);
-       if (snaplen < 0)
+       if (snaplen <= 0){
                memset(xclone->target, 0, XSEG_MAX_TARGETLEN);
+               xclone->targetlen = 0;
+       }
        else {
                strncpy(xclone->target, snap, snaplen);
-               xclone->target[snaplen] = 0;
+               xclone->targetlen = snaplen;
        }
        xclone->size = size;
        req->offset = 0;
@@ -144,11 +150,11 @@ int vlmc_create(char *name, uint64_t size, char *snap)
        }
        xseg_signal(xseg, p);
 
-       wait_reply(req);
+       ret = wait_reply(req);
        
        xseg_put_request(xseg, req, srcport);
 
-       return 0;
+       return ret;
 }
 
 int vlmc_snapshot(char *name)
@@ -177,7 +183,6 @@ int vlmc_remove(char *name)
        }
        char *target = xseg_get_target(xseg, req);
        strncpy(target, name, targetlen);
-       target[targetlen] = 0;
        req->offset = 0;
        req->size = req->datalen;
        req->op = X_DELETE;
@@ -339,7 +344,7 @@ int main(int argc, char *argv[])
                return -1;
        }
 
-       port = xseg_bind_port(xseg, srcport);
+       port = xseg_bind_port(xseg, srcport, NULL);
        if (!port) {
                fprintf(stderr, "Error binding port %u\n", srcport);
                exit(-1);