- Timestamp:
- Aug 7, 2009, 12:45:24 PM (17 years ago)
- Location:
- branches/eam_branches/20090715
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
Nebulous/nebclient/src/nebclient.c (modified) (55 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/20090715
- Property svn:mergeinfo changed
/trunk (added) merged: 24801-24824,24827-24834,24836-24859,24861-24901,24903-24912,24914-24950,24953-24971,24973-24977,24986-24989,24993-25017
- Property svn:mergeinfo changed
-
branches/eam_branches/20090715/Nebulous/nebclient/src/nebclient.c
r24289 r25022 51 51 static char *nullstrncpy(char *dest, const char *src, size_t n); 52 52 53 53 54 nebServer *nebServerAlloc(const char *endpoint) 54 55 { 55 nebServer *server; 56 57 server = xmalloc(sizeof(nebServer)); 56 nebServer *server = xmalloc(sizeof(nebServer)); 58 57 59 58 if (endpoint) { … … 77 76 } 78 77 78 79 79 void nebServerFree(nebServer *server) 80 80 { … … 92 92 } 93 93 94 94 95 char *nebCreate(nebServer *server, const char *key, const char *volume, char **URI) 95 96 { 97 REQUIRE_SERVER; 98 99 if (!key) { 100 nebSetErr(server, "parameter 'key' may not be NULL"); 101 102 return NULL; 103 } 104 96 105 struct ns1__create_USCOREobjectResponse response; 97 char *filename;98 99 REQUIRE_SERVER;100 101 if (!key) {102 nebSetErr(server, "parameter 'key' may not be NULL");103 104 return NULL;105 }106 107 106 if (soap_call_ns1__create_USCOREobject(server->soap, server->endpoint, NULL, 108 107 (char *)key, (char *)volume, (char **)&response) != SOAP_OK) { … … 117 116 } 118 117 118 char *filename; 119 119 if (!nebParseURI(server, (char *)response.result, &filename)) { 120 120 nebSetErr(server, "can not parse URI"); 121 nebFree(filename); 122 121 123 return NULL; 122 124 } … … 131 133 } 132 134 135 133 136 int nebOpenCreate(nebServer *server, const char *key, const char *volume, char **URI) 134 137 { 135 char *filename;136 int file; 137 138 REQUIRE_SERVER;139 140 if (!key) {141 nebSetErr(server, "parameter 'key' may not be NULL");142 143 return -1;144 }145 146 filename = nebCreate(server, key, volume, URI);147 148 file = open(filename, O_RDWR|O_TRUNC, 0660);138 REQUIRE_SERVER; 139 140 if (!key) { 141 nebSetErr(server, "parameter 'key' may not be NULL"); 142 143 return -1; 144 } 145 146 char *filename = nebCreate(server, key, volume, URI); 147 if (!filename) { 148 return -1; 149 } 150 151 int file = open(filename, O_RDWR|O_TRUNC, 0660); 149 152 if (file == -1) { 150 153 nebSetErr(server, "can not open %s: %s", filename, strerror(errno)); … … 159 162 } 160 163 164 161 165 bool nebReplicate(nebServer *server, const char *key, const char *volume, char **URI) 162 166 { 163 struct ns1__replicate_USCOREobjectResponse response;164 char *filename;165 int sourceFH, destFH;166 167 167 REQUIRE_SERVER; 168 168 … … 177 177 // we don't do this, it's possible that open will find & open the new 178 178 // instance that we're in the process of creating 179 sourceFH = nebOpen(server, (char *)key, NEB_READ);179 int sourceFH = nebOpen(server, (char *)key, NEB_READ); 180 180 if (sourceFH == -1) { 181 181 nebSetErr(server, "can not open key %s", key); 182 nebFree(filename);183 182 184 183 return false; … … 186 185 187 186 // ask the server for a new instance attached to our key 187 struct ns1__replicate_USCOREobjectResponse response; 188 188 if (soap_call_ns1__replicate_USCOREobject(server->soap, server->endpoint, 189 189 NULL, (char *)key, (char *)volume, (char **)&response) != SOAP_OK) { … … 193 193 } 194 194 195 char *filename = NULL; 195 196 if (!nebParseURI(server, (char *)response.result, &filename)) { 196 197 nebSetErr(server, "can not parse URI"); … … 199 200 } 200 201 201 destFH = open(filename, O_RDWR|O_TRUNC, 0660);202 int destFH = open(filename, O_RDWR|O_TRUNC, 0660); 202 203 if (destFH == -1) { 203 204 nebSetErr(server, "can not open %s: %s\n", filename, strerror(errno)); … … 234 235 } 235 236 237 236 238 bool nebCull(nebServer *server, const char *key) 237 239 { 238 nebObjectInstances *locations; 239 240 REQUIRE_SERVER; 241 242 if (!key) { 243 nebSetErr(server, "parameter 'key' may not be NULL"); 244 245 return false; 246 } 247 248 locations = nebFindInstances(server, key, NULL); 240 REQUIRE_SERVER; 241 242 if (!key) { 243 nebSetErr(server, "parameter 'key' may not be NULL"); 244 245 return false; 246 } 247 248 nebObjectInstances *locations = nebFindInstances(server, key, NULL); 249 249 if (!locations || locations->n <= 1) { 250 250 nebSetErr(server, "can not cull - not enough instances"); 251 if (locations) { 252 nebObjectInstancesFree(locations); 253 } 251 254 252 255 return false; … … 264 267 } 265 268 269 266 270 bool nebLock(nebServer *server, const char *key, nebRW flag) 267 271 { 268 time_t endtime; 269 char *type; 270 int response; 271 272 REQUIRE_SERVER; 273 274 if (!key) { 275 nebSetErr(server, "parameter 'key' may not be NULL"); 276 277 return false; 278 } 279 280 type = flag == NEB_READ ? "read" : "write"; 281 282 endtime = time(NULL) + LOCK_TIMEOUT; 272 REQUIRE_SERVER; 273 274 if (!key) { 275 nebSetErr(server, "parameter 'key' may not be NULL"); 276 277 return false; 278 } 279 280 char *type = flag == NEB_READ ? "read" : "write"; 281 282 time_t endtime = time(NULL) + LOCK_TIMEOUT; 283 283 284 284 while (time(NULL) < endtime) { 285 int response; 285 286 if (soap_call_ns1__lock_USCOREobject(server->soap, server->endpoint, 286 287 NULL, (char *)key, type, &response) != SOAP_OK) { … … 302 303 } 303 304 305 304 306 bool nebUnlock(nebServer *server, const char *key, nebRW flag) 305 307 { 306 char *type; 307 int response; 308 309 REQUIRE_SERVER; 310 311 if (!key) { 312 nebSetErr(server, "parameter 'key' may not be NULL"); 313 314 return false; 315 } 316 317 type = flag == NEB_READ ? "read" : "write"; 318 308 REQUIRE_SERVER; 309 310 if (!key) { 311 nebSetErr(server, "parameter 'key' may not be NULL"); 312 313 return false; 314 } 315 316 char *type = flag == NEB_READ ? "read" : "write"; 317 318 int response; 319 319 if (soap_call_ns1__unlock_USCOREobject(server->soap, server->endpoint, 320 320 NULL, (char *)key, type, &response) != SOAP_OK) { … … 466 466 nebObjectInstances *nebFindInstances(nebServer *server, const char *key, const char *volume) 467 467 { 468 REQUIRE_SERVER; 469 470 if (!key) { 471 nebSetErr(server, "parameter 'key' may not be NULL"); 472 473 return NULL; 474 } 475 468 476 struct ns1__find_USCOREinstancesResponse response; 469 int resultElements = 0;470 char **resultArray;471 nebObjectInstances *locations = NULL;472 473 REQUIRE_SERVER;474 475 if (!key) {476 nebSetErr(server, "parameter 'key' may not be NULL");477 478 return NULL;479 }480 481 477 // FIXME is this leaking memory when response goes out of scope? the gsoap 482 478 // manual seems to 'suggest' that this is temporary data that gets cleaed … … 488 484 } 489 485 490 resultElements = response.result->__size; 491 486 int resultElements = response.result->__size; 487 488 nebObjectInstances *locations = NULL; 492 489 if (resultElements) { 493 490 locations = xmalloc(sizeof(nebObjectInstances)); 494 491 locations->n = resultElements; 495 492 496 resultArray= response.result->__ptr;493 char **resultArray = response.result->__ptr; 497 494 498 495 locations->URI = xmalloc(sizeof(char*) * resultElements); … … 508 505 } 509 506 507 510 508 void nebObjectInstancesFree(nebObjectInstances *locations) 511 509 { … … 521 519 } 522 520 521 523 522 char *nebFind(nebServer *server, const char *key) 524 523 { 525 nebObjectInstances *locations;526 char *filename;527 528 524 REQUIRE_SERVER; 529 525 … … 534 530 } 535 531 536 locations = nebFindInstances(server, key, NULL);532 nebObjectInstances *locations = nebFindInstances(server, key, NULL); 537 533 if (!locations) { 538 534 if (!strstr(nebErr(server), "no instances on storage volume")) { … … 548 544 } 549 545 546 char *filename; 550 547 if (!nebParseURI(server, locations->URI[0], &filename)) { 551 548 nebSetErr(server, "can not parse URI"); … … 560 557 } 561 558 559 562 560 int nebOpen(nebServer *server, const char *key, nebRW flag) 563 561 { 564 nebObjectInstances *locations; 565 char *filename; 566 int fh; 567 568 REQUIRE_SERVER; 569 570 if (!key) { 571 nebSetErr(server, "parameter 'key' may not be NULL"); 572 573 return -1; 574 } 575 576 locations = nebFindInstances(server, key, NULL); 562 REQUIRE_SERVER; 563 564 if (!key) { 565 nebSetErr(server, "parameter 'key' may not be NULL"); 566 567 return -1; 568 } 569 570 nebObjectInstances *locations = nebFindInstances(server, key, NULL); 577 571 if (!locations) { 578 572 nebSetErr(server, "no instances found"); … … 581 575 } 582 576 577 char *filename; 583 578 if (!nebParseURI(server, locations->URI[0], &filename)) { 584 579 nebSetErr(server, "can not parse URI"); … … 588 583 } 589 584 585 int fh = 0; 590 586 if (flag == NEB_WRITE) { 591 587 if (locations->n > 1) { … … 613 609 } 614 610 611 615 612 bool nebDelete(nebServer *server, const char *key) 616 613 { 617 nebObjectInstances *locations; 618 619 REQUIRE_SERVER; 620 621 if (!key) { 622 nebSetErr(server, "parameter 'key' may not be NULL"); 623 624 return false; 625 } 626 627 locations = nebFindInstances(server, key, "any"); 614 REQUIRE_SERVER; 615 616 if (!key) { 617 nebSetErr(server, "parameter 'key' may not be NULL"); 618 619 return false; 620 } 621 622 nebObjectInstances *locations = nebFindInstances(server, key, "any"); 628 623 if (!locations) { 629 624 nebSetErr(server, "no instances found"); … … 646 641 } 647 642 643 648 644 bool nebCopy(nebServer *server, const char *key, const char *newKey) 649 645 { 650 int sourceFH;651 int destFH;652 653 646 REQUIRE_SERVER; 654 647 … … 665 658 } 666 659 667 sourceFH = nebOpen(server, (char *)key, NEB_READ);660 int sourceFH = nebOpen(server, (char *)key, NEB_READ); 668 661 if (sourceFH < 0) { 669 662 // propigate nebOpen() error … … 672 665 } 673 666 674 destFH = nebOpenCreate(server, newKey, NULL, NULL);667 int destFH = nebOpenCreate(server, newKey, NULL, NULL); 675 668 if (destFH < 0) { 676 669 // propigate nebCreate() error … … 696 689 } 697 690 691 698 692 bool nebMove(nebServer *server, const char *key, const char *newKey) 699 693 { … … 723 717 } 724 718 719 725 720 bool nebSwap(nebServer *server, const char *key1, const char *key2) 726 721 { 727 struct ns1__create_USCOREobjectResponse response;728 729 722 REQUIRE_SERVER; 730 723 … … 741 734 } 742 735 736 struct ns1__create_USCOREobjectResponse response; 743 737 if (soap_call_ns1__swap_USCOREobjects(server->soap, server->endpoint, 744 738 NULL, (char *)key1, (char *)key2, (char **)&response) != SOAP_OK) { … … 749 743 } 750 744 745 751 746 bool nebDeleteInstance(nebServer *server, const char *key, const char *URI) 752 747 { 753 int response;754 char *filename;755 bool status;756 757 748 REQUIRE_SERVER; 758 749 … … 763 754 } 764 755 756 char *filename; 765 757 if (!nebParseURI(server, URI, &filename)) { 766 758 nebSetErr(server, "can not parse URI"); … … 769 761 } 770 762 763 int response; 771 764 if (soap_call_ns1__delete_USCOREinstance(server->soap, server->endpoint, 772 765 NULL, (char *)key, (char *)URI, &response) != SOAP_OK) { … … 776 769 } 777 770 771 bool status; 778 772 if (response > 0) { 779 773 status = nebNukeFile(server, filename); … … 787 781 } 788 782 783 789 784 nebObjectStat *nebStat(nebServer *server, const char *key) 790 785 { 791 struct ns1__stat_USCOREobjectResponse response;792 nebObjectStat *stat;793 int resultElements = 0;794 char **resultArray = NULL;795 796 786 REQUIRE_SERVER; 797 787 … … 802 792 } 803 793 804 stat = xmalloc(sizeof(nebObjectStat));794 nebObjectStat *stat = xmalloc(sizeof(nebObjectStat)); 805 795 806 796 // FIXME is this leaking memory when response goes out of scope? the gsoap 807 797 // manual seems to 'suggest' that this is temporary data that gets cleaed 808 798 // up on the next soap function call 799 struct ns1__stat_USCOREobjectResponse response; 809 800 if (soap_call_ns1__stat_USCOREobject(server->soap, server->endpoint, 810 801 NULL, (char *)key, &response) != SOAP_OK) { … … 813 804 } 814 805 815 resultElements = response.result->__size;816 resultArray = response.result->__ptr;817 818 if (resultElements != 7) {806 int resultElements = response.result->__size; 807 char **resultArray = response.result->__ptr; 808 809 if (resultElements != 8) { 819 810 nebSetErr(server, "server didn't return the proper number of stat elements"); 820 811 return NULL; 821 812 } 822 813 823 nullstrncpy(stat->so_id, resultArray[0], 256);824 nullstrncpy(stat->ext_id, resultArray[1], 256);825 nullstrncpy(stat->read_lock, resultArray[2], 256);814 stat->so_id = atol(resultArray[0]); 815 stat->ext_id = atol(resultArray[1]); 816 stat->read_lock = atoi(resultArray[2]); 826 817 nullstrncpy(stat->write_lock, resultArray[3], 256); 827 818 nullstrncpy(stat->epoch, resultArray[4], 256); 828 819 nullstrncpy(stat->mtime, resultArray[5], 256); 829 stat->instances = atoi(resultArray[6]); 820 stat->available = atoi(resultArray[6]); 821 stat->instances = atoi(resultArray[7]); 830 822 831 823 return stat; … … 833 825 834 826 827 void nebObjectStatFree(nebObjectStat *stat) 828 { 829 if (!stat) { 830 return; 831 } 832 833 nebFree(stat); 834 } 835 836 835 837 int nebChmod(nebServer *server, const char *key, mode_t mode) 836 838 { 837 int response;838 839 839 REQUIRE_SERVER; 840 840 … … 848 848 // manual seems to 'suggest' that this is temporary data that gets cleaed 849 849 // up on the next soap function call 850 int response; 850 851 if (soap_call_ns1__chmod_USCOREobject(server->soap, server->endpoint, 851 852 NULL, (char *)key, mode, &response) != SOAP_OK) { … … 858 859 859 860 861 int nebPrune(nebServer *server, const char *key) 862 { 863 REQUIRE_SERVER; 864 865 if (!key) { 866 nebSetErr(server, "parameter 'key' may not be NULL"); 867 868 return -1; 869 } 870 871 // FIXME is this leaking memory when response goes out of scope? the gsoap 872 // manual seems to 'suggest' that this is temporary data that gets cleaed 873 // up on the next soap function call 874 int response; 875 if (soap_call_ns1__prune_USCOREobject(server->soap, server->endpoint, 876 NULL, (char *)key, &response) != SOAP_OK) { 877 nebSetServerErr(server); 878 return -1; 879 } 880 881 return response; 882 } 883 884 885 int nebThereCanBeOnlyOne(nebServer *server, const char *key, const char *volume) 886 { 887 REQUIRE_SERVER; 888 889 if (!key) { 890 nebSetErr(server, "parameter 'key' may not be NULL"); 891 892 return -1; 893 } 894 895 // first - strip off any inaccesible instances 896 if (nebPrune(server, key) < 0 ) { 897 // use the prune() method to also determine if $key is valid 898 return -1; 899 } 900 901 // check to see if there is an instance on $vol_name that should be the 902 // sole survivor 903 nebObjectInstances *locations = NULL; 904 if (volume) { 905 locations = nebFindInstances(server, key, NULL); 906 } 907 908 long removed = 0; 909 if (locations && locations->n) { 910 nebObjectInstances *instances = nebFindInstances(server, key, NULL); 911 for (long i = 0; i < instances->n; i++) { 912 if (strcmp(locations->URI[0], instances->URI[i]) == 0) { 913 continue; 914 } 915 if (!nebDeleteInstance(server, key, instances->URI[i])) { 916 nebObjectInstancesFree(instances); 917 nebObjectInstancesFree(locations); 918 return -1; 919 } 920 removed++; 921 } 922 nebObjectInstancesFree(instances); 923 nebObjectInstancesFree(locations); 924 } else { 925 nebObjectInstancesFree(locations); 926 // nuke whatever 927 nebObjectStat *stat = nebStat(server, key); 928 if (!stat) { 929 return -1; 930 } 931 932 int available = stat->available; 933 nebObjectStatFree(stat); 934 935 // start at one so cull() is called one less time then the # of 936 // instances 937 for (long i = 1; i < available; i++) { 938 if (!nebCull(server, key)) { 939 return -1; 940 } 941 removed++; 942 } 943 } 944 945 return removed; 946 } 947 948 860 949 char *nebErr(nebServer *server) 861 950 { … … 863 952 } 864 953 954 865 955 void nebFree(void *ptr) { 956 if (!ptr) { return; } 866 957 xfree(ptr); 867 958 } … … 870 961 static void p_nebSetErr(const char * filename, unsigned long lineno, const char *function, nebServer *server, const char *format, ...) 871 962 { 872 va_list args; 873 size_t err_size; 874 char err_location[ERRBUF_SIZE]; 875 size_t err_location_size; 876 877 err_location_size = snprintf(err_location, ERRBUF_SIZE, "%s:%lu %s() - ", 963 char err_location[ERRBUF_SIZE]; 964 size_t err_location_size = snprintf(err_location, ERRBUF_SIZE, "%s:%lu %s() - ", 878 965 filename, lineno, function); 879 966 … … 888 975 889 976 while (1) { 977 va_list args; 890 978 va_start(args, format); 891 979 // append error string after error location info 892 err_size = vsnprintf(980 size_t err_size = vsnprintf( 893 981 server->err_buf + err_location_size, 894 982 server->err_buf_size - err_location_size, … … 914 1002 } 915 1003 1004 916 1005 static void nebSetServerErr(nebServer *server) 917 1006 { 918 const char **code; 919 const char **string; 920 921 REQUIRE_SERVER; 922 923 code = soap_faultcode(server->soap); 924 string = soap_faultstring(server->soap); 1007 REQUIRE_SERVER; 1008 1009 const char **code = soap_faultcode(server->soap); 1010 const char **string = soap_faultstring(server->soap); 925 1011 926 1012 nebSetErr(server, "%s - %s", *code, *string); 927 1013 } 1014 928 1015 929 1016 #if NEBCOPYFILE 930 1017 static off_t nebCopyFile(nebServer *server, const char *source, const char *dest) 931 1018 { 932 int sourceFH; 933 int destFH; 934 off_t bytesCopied; 935 936 REQUIRE_SERVER; 937 938 sourceFH = open(source, O_RDONLY); 1019 REQUIRE_SERVER; 1020 1021 int sourceFH = open(source, O_RDONLY); 939 1022 if (sourceFH == -1) { 940 1023 nebSetErr(server, "can not open %s: %s", source, strerror(errno)); … … 943 1026 } 944 1027 945 destFH = open(dest, O_WRONLY|O_CREAT|O_CREAT, 0600);1028 int destFH = open(dest, O_WRONLY|O_CREAT|O_CREAT, 0600); 946 1029 if (destFH == -1) { 947 1030 nebSetErr(server, "can not open %s: %s", dest, strerror(errno)); … … 950 1033 } 951 1034 952 bytesCopied = nebCopyFilehandle(server, sourceFH, destFH);1035 off_t bytesCopied = nebCopyFilehandle(server, sourceFH, destFH); 953 1036 if (bytesCopied < 0) { 954 1037 return -1; … … 971 1054 #endif 972 1055 1056 973 1057 static off_t nebCopyFilehandle(nebServer *server, int sourceFH, int destFH) 974 1058 { 975 off_t bytesTotal; 976 off_t bytesRemaining; 977 off_t writeSize; 978 char writeBuf[64 * 1024]; 1059 REQUIRE_SERVER; 1060 979 1061 struct stat sourceStat; 980 981 REQUIRE_SERVER;982 983 1062 if(fstat(sourceFH, &sourceStat)) { 984 1063 nebSetErr(server, "can not stat filehandles: %s", strerror(errno)); … … 988 1067 989 1068 // the size of the file to copied 990 bytesTotal = sourceStat.st_size;1069 off_t bytesTotal = sourceStat.st_size; 991 1070 992 1071 /* … … 996 1075 */ 997 1076 998 bytesRemaining = bytesTotal;1077 off_t bytesRemaining = bytesTotal; 999 1078 1000 1079 while (bytesRemaining) { 1080 off_t writeSize; 1081 char writeBuf[64 * 1024]; 1001 1082 if (bytesRemaining <= sizeof(writeBuf)) { 1002 1083 writeSize = bytesRemaining; … … 1023 1104 } 1024 1105 1106 1025 1107 static size_t nebParseURI(nebServer *server, const char *URI, char **filename) 1026 1108 { 1027 regex_t myregex;1028 regmatch_t mymatch[2];1029 char errbuf[ERRBUF_SIZE];1030 char *pattern = "^file://(.*)$";1031 int status;1032 size_t matchStart, matchEnd;1033 size_t matchLength;1034 size_t filename_size;1035 1036 1109 REQUIRE_SERVER; 1037 1110 … … 1048 1121 } 1049 1122 1050 status = regcomp(&myregex, pattern, REG_EXTENDED); 1123 regex_t myregex; 1124 regmatch_t mymatch[2]; 1125 char *pattern = "^file://(.*)$"; 1126 char errbuf[ERRBUF_SIZE]; 1127 1128 int status = regcomp(&myregex, pattern, REG_EXTENDED); 1051 1129 if (status != 0) { 1052 1130 regerror(status, &myregex, errbuf, ERRBUF_SIZE); … … 1066 1144 regfree(&myregex); 1067 1145 1068 matchStart = (size_t)mymatch[1].rm_so;1069 matchEnd = (size_t)mymatch[1].rm_eo;1070 matchLength = matchEnd - matchStart;1146 size_t matchStart = (size_t)mymatch[1].rm_so; 1147 size_t matchEnd = (size_t)mymatch[1].rm_eo; 1148 size_t matchLength = matchEnd - matchStart; 1071 1149 1072 1150 if (matchStart == -1) { … … 1074 1152 } 1075 1153 1076 filename_size = matchLength + 1;1154 size_t filename_size = matchLength + 1; 1077 1155 *filename = xmalloc(filename_size); 1078 1156 … … 1081 1159 return strlen(*filename); 1082 1160 } 1161 1083 1162 1084 1163 static bool nebNukeFile(nebServer *server, const char *filename) … … 1100 1179 return true; 1101 1180 } 1181 1102 1182 1103 1183 static char *nullstrncpy(char *dest, const char *src, size_t n) { … … 1107 1187 } 1108 1188 1189 if (!dest) { 1190 dest = xmalloc(n + 1); 1191 } 1192 1109 1193 return strncpy(dest, src, n); 1110 1194 }
Note:
See TracChangeset
for help on using the changeset viewer.
