- Timestamp:
- Aug 11, 2009, 3:54:00 PM (17 years ago)
- Location:
- branches/czw_branch/cleanup
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
Nebulous/nebclient/src/nebclient.c (modified) (58 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/czw_branch/cleanup
- Property svn:mergeinfo changed
/trunk merged: 24940-24950,24953-24971,24973-24977,24986-24989,24993-25017,25019,25021,25023-25024,25026,25029-25031,25036-25049
- Property svn:mergeinfo changed
-
branches/czw_branch/cleanup/Nebulous/nebclient/src/nebclient.c
r24951 r25051 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;806 int resultElements = response.result->__size; 807 char **resultArray = response.result->__ptr; 817 808 818 809 if (resultElements != 8) { … … 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); … … 833 824 } 834 825 826 835 827 void nebObjectStatFree(nebObjectStat *stat) 836 828 { … … 839 831 } 840 832 841 xfree(stat->so_id); 842 xfree(stat->ext_id); 843 xfree(stat->read_lock); 844 xfree(stat->write_lock); 845 xfree(stat->epoch); 846 xfree(stat->mtime); 847 xfree(stat); 833 nebFree(stat); 848 834 } 849 835 … … 895 881 return response; 896 882 } 883 897 884 898 885 int nebThereCanBeOnlyOne(nebServer *server, const char *key, const char *volume) … … 936 923 nebObjectInstancesFree(locations); 937 924 } else { 925 nebObjectInstancesFree(locations); 938 926 // nuke whatever 939 927 nebObjectStat *stat = nebStat(server, key); … … 941 929 return -1; 942 930 } 931 932 int available = stat->available; 933 nebObjectStatFree(stat); 934 943 935 // start at one so cull() is called one less time then the # of 944 936 // instances 945 for (long i = 1; i < stat->available; i++) {937 for (long i = 1; i < available; i++) { 946 938 if (!nebCull(server, key)) { 947 nebObjectStatFree(stat);948 939 return -1; 949 940 } 950 941 removed++; 951 942 } 952 nebObjectStatFree(stat);953 943 } 954 944 … … 962 952 } 963 953 954 964 955 void nebFree(void *ptr) { 956 if (!ptr) { return; } 965 957 xfree(ptr); 966 958 } … … 969 961 static void p_nebSetErr(const char * filename, unsigned long lineno, const char *function, nebServer *server, const char *format, ...) 970 962 { 971 va_list args; 972 size_t err_size; 973 char err_location[ERRBUF_SIZE]; 974 size_t err_location_size; 975 976 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() - ", 977 965 filename, lineno, function); 978 966 … … 987 975 988 976 while (1) { 977 va_list args; 989 978 va_start(args, format); 990 979 // append error string after error location info 991 err_size = vsnprintf(980 size_t err_size = vsnprintf( 992 981 server->err_buf + err_location_size, 993 982 server->err_buf_size - err_location_size, … … 1013 1002 } 1014 1003 1004 1015 1005 static void nebSetServerErr(nebServer *server) 1016 1006 { 1017 const char **code; 1018 const char **string; 1019 1020 REQUIRE_SERVER; 1021 1022 code = soap_faultcode(server->soap); 1023 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); 1024 1011 1025 1012 nebSetErr(server, "%s - %s", *code, *string); 1026 1013 } 1014 1027 1015 1028 1016 #if NEBCOPYFILE 1029 1017 static off_t nebCopyFile(nebServer *server, const char *source, const char *dest) 1030 1018 { 1031 int sourceFH; 1032 int destFH; 1033 off_t bytesCopied; 1034 1035 REQUIRE_SERVER; 1036 1037 sourceFH = open(source, O_RDONLY); 1019 REQUIRE_SERVER; 1020 1021 int sourceFH = open(source, O_RDONLY); 1038 1022 if (sourceFH == -1) { 1039 1023 nebSetErr(server, "can not open %s: %s", source, strerror(errno)); … … 1042 1026 } 1043 1027 1044 destFH = open(dest, O_WRONLY|O_CREAT|O_CREAT, 0600);1028 int destFH = open(dest, O_WRONLY|O_CREAT|O_CREAT, 0600); 1045 1029 if (destFH == -1) { 1046 1030 nebSetErr(server, "can not open %s: %s", dest, strerror(errno)); … … 1049 1033 } 1050 1034 1051 bytesCopied = nebCopyFilehandle(server, sourceFH, destFH);1035 off_t bytesCopied = nebCopyFilehandle(server, sourceFH, destFH); 1052 1036 if (bytesCopied < 0) { 1053 1037 return -1; … … 1070 1054 #endif 1071 1055 1056 1072 1057 static off_t nebCopyFilehandle(nebServer *server, int sourceFH, int destFH) 1073 1058 { 1074 off_t bytesTotal; 1075 off_t bytesRemaining; 1076 off_t writeSize; 1077 char writeBuf[64 * 1024]; 1059 REQUIRE_SERVER; 1060 1078 1061 struct stat sourceStat; 1079 1080 REQUIRE_SERVER;1081 1082 1062 if(fstat(sourceFH, &sourceStat)) { 1083 1063 nebSetErr(server, "can not stat filehandles: %s", strerror(errno)); … … 1087 1067 1088 1068 // the size of the file to copied 1089 bytesTotal = sourceStat.st_size;1069 off_t bytesTotal = sourceStat.st_size; 1090 1070 1091 1071 /* … … 1095 1075 */ 1096 1076 1097 bytesRemaining = bytesTotal;1077 off_t bytesRemaining = bytesTotal; 1098 1078 1099 1079 while (bytesRemaining) { 1080 off_t writeSize; 1081 char writeBuf[64 * 1024]; 1100 1082 if (bytesRemaining <= sizeof(writeBuf)) { 1101 1083 writeSize = bytesRemaining; … … 1122 1104 } 1123 1105 1106 1124 1107 static size_t nebParseURI(nebServer *server, const char *URI, char **filename) 1125 1108 { 1126 regex_t myregex;1127 regmatch_t mymatch[2];1128 char errbuf[ERRBUF_SIZE];1129 char *pattern = "^file://(.*)$";1130 int status;1131 size_t matchStart, matchEnd;1132 size_t matchLength;1133 size_t filename_size;1134 1135 1109 REQUIRE_SERVER; 1136 1110 … … 1147 1121 } 1148 1122 1149 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); 1150 1129 if (status != 0) { 1151 1130 regerror(status, &myregex, errbuf, ERRBUF_SIZE); … … 1165 1144 regfree(&myregex); 1166 1145 1167 matchStart = (size_t)mymatch[1].rm_so;1168 matchEnd = (size_t)mymatch[1].rm_eo;1169 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; 1170 1149 1171 1150 if (matchStart == -1) { … … 1173 1152 } 1174 1153 1175 filename_size = matchLength + 1;1154 size_t filename_size = matchLength + 1; 1176 1155 *filename = xmalloc(filename_size); 1177 1156 … … 1180 1159 return strlen(*filename); 1181 1160 } 1161 1182 1162 1183 1163 static bool nebNukeFile(nebServer *server, const char *filename) … … 1199 1179 return true; 1200 1180 } 1181 1201 1182 1202 1183 static char *nullstrncpy(char *dest, const char *src, size_t n) { … … 1206 1187 } 1207 1188 1189 if (!dest) { 1190 dest = xmalloc(n + 1); 1191 } 1192 1208 1193 return strncpy(dest, src, n); 1209 1194 }
Note:
See TracChangeset
for help on using the changeset viewer.
