00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <stdio.h>
00036 #include <stdlib.h>
00037 #include <string.h>
00038 #include "dazukoio.h"
00039 #include "dazukoio_core.h"
00040 #include "dazuko_transport.h"
00041 #include "dazuko_version.h"
00042
00043 #if !defined(NO_COMPAT1)
00044 #include "dazukoio_linux_compat1.h"
00045 #endif
00046
00047
00048 const char *DAZUKO_VERSION_STAMP = "\nDazukoVersion=" DAZUKO_VERSION_MAJOR "." DAZUKO_VERSION_MINOR "." DAZUKO_VERSION_REVISION "." DAZUKO_VERSION_RELEASE "\n";
00049
00050
00051 const char *VERSION_STRING = DAZUKO_VERSION_MAJOR "." DAZUKO_VERSION_MINOR "." DAZUKO_VERSION_REVISION
00052 #ifdef DAZUKO_PRERELEASE
00053 "-pre" DAZUKO_VERSION_RELEASE
00054 #endif
00055 ;
00056
00057
00058
00059 #define DAZUKO_FILENAME_MAX_LENGTH 6144
00060
00061 dazuko_id_t *_GLOBAL_DAZUKO = NULL;
00062
00063 #if !defined(NO_COMPAT1)
00064 static int _GLOBAL_DAZUKO_COMPAT1 = 0;
00065 #endif
00066
00067 static int _GLOBAL_WITH_REQSTREAM = 0;
00068 static int _GLOBAL_WITH_DEVWRITE = 0;
00069
00070 static int _SET_DAZUKO_VERSION = 0;
00071 static struct dazuko_version _DAZUKO_VERSION;
00072
00073
00074 static inline char char_to_hex(char c)
00075 {
00076
00077
00078 switch (c)
00079 {
00080 case '1': return 1;
00081 case '2': return 2;
00082 case '3': return 3;
00083 case '4': return 4;
00084 case '5': return 5;
00085 case '6': return 6;
00086 case '7': return 7;
00087 case '8': return 8;
00088 case '9': return 9;
00089 case 'a': case 'A': return 10;
00090 case 'b': case 'B': return 11;
00091 case 'c': case 'C': return 12;
00092 case 'd': case 'D': return 13;
00093 case 'e': case 'E': return 14;
00094 case 'f': case 'F': return 15;
00095 }
00096
00097 return 0;
00098 }
00099
00100 static void unescape_string(char *string)
00101 {
00102 char *p;
00103
00104 for (p=string ; *p ; p++)
00105 {
00106
00107 if ((*p == '\\') && (*(p+1) == 'x'))
00108 {
00109
00110
00111
00112 if (*(p+2) && *(p+3))
00113 {
00114 *p = char_to_hex(*(p+2));
00115 *p <<= 4;
00116 *p |= char_to_hex(*(p+3));
00117
00118 memmove(p + 1, p + 4, strlen(p+4) + 1);
00119 }
00120 }
00121 }
00122 }
00123
00124 int dazuko_get_value(const char *key, const char *string, char *buffer, size_t buffer_size)
00125 {
00126 const char *p1;
00127 const char *p2;
00128 size_t size;
00129
00130 if (buffer == NULL || buffer_size < 1)
00131 return -1;
00132
00133 buffer[0] = 0;
00134
00135 if (key == NULL || string == NULL)
00136 return -1;
00137
00138 p1 = strstr(string, key);
00139 if (p1 == NULL)
00140 return -1;
00141
00142 p1 += strlen(key);
00143
00144 for (p2=p1 ; *p2 && *p2!='\n' ; p2++)
00145 continue;
00146
00147 size = p2 - p1;
00148 if (size >= buffer_size)
00149 size = buffer_size - 1;
00150
00151 memcpy(buffer, p1, size);
00152
00153 buffer[size] = 0;
00154
00155 return 0;
00156 }
00157
00158 static struct dazuko_request *alloc_request(int type, int request_length, int response_length)
00159 {
00160 struct dazuko_request *request;
00161 char *s;
00162
00163 request = (struct dazuko_request *)malloc(sizeof(struct dazuko_request));
00164 if (request == NULL)
00165 return NULL;
00166
00167 memset(request, 0, sizeof(struct dazuko_request));
00168
00169 request->type[0] = (char)type;
00170
00171 s = (char *)malloc(request_length);
00172 if (s == NULL)
00173 {
00174 free(request);
00175 return NULL;
00176 }
00177
00178 memset(s, 0, request_length);
00179
00180 request->buffer = s;
00181
00182
00183
00184
00185 if (response_length > 0)
00186 {
00187 s = (char *)malloc(response_length);
00188 if (s == NULL)
00189 {
00190 free(request->buffer);
00191 free(request);
00192 return NULL;
00193 }
00194
00195 memset(s, 0, response_length);
00196
00197 request->reply_buffer = s;
00198 request->reply_buffer_size = response_length;
00199 }
00200
00201 return request;
00202 }
00203
00204 static void free_request(struct dazuko_request **request_ref)
00205 {
00206 struct dazuko_request *request;
00207
00208 if (request_ref == NULL)
00209 return;
00210
00211 request = *request_ref;
00212
00213 if (request == NULL)
00214 return;
00215
00216 if (request->buffer != NULL)
00217 free(request->buffer);
00218
00219 if (request->reply_buffer != NULL)
00220 free(request->reply_buffer);
00221
00222 free(request);
00223
00224 *request_ref = NULL;
00225 }
00226
00227 int dazukoVersion(struct dazuko_version *version)
00228 {
00229 if (version == NULL)
00230 return -1;
00231
00232 if (!_SET_DAZUKO_VERSION)
00233 return -1;
00234
00235 memcpy(version, &_DAZUKO_VERSION, sizeof(struct dazuko_version));
00236
00237 return 0;
00238 }
00239
00240 int dazukoIOVersion(struct dazuko_version *version)
00241 {
00242 if (version == NULL)
00243 return -1;
00244
00245 memset(version, 0, sizeof(struct dazuko_version));
00246
00247 version->major = atoi(DAZUKO_VERSION_MAJOR);
00248 version->minor = atoi(DAZUKO_VERSION_MINOR);
00249 version->revision = atoi(DAZUKO_VERSION_REVISION);
00250 version->release = atoi(DAZUKO_VERSION_RELEASE);
00251
00252 snprintf(version->text, sizeof(version->text), "%s", VERSION_STRING);
00253 version->text[sizeof(version->text) - 1] = 0;
00254
00255 return 0;
00256 }
00257
00258 int dazukoRegister(const char *groupName, const char *mode)
00259 {
00260 return dazukoRegister_TS(&_GLOBAL_DAZUKO, groupName, mode);
00261 }
00262
00263 static int process_request(struct dazuko_id *id, char *buffer, size_t buffer_size, struct dazuko_request *request, int reply_required)
00264 {
00265 unsigned char *llreq = NULL;
00266 int error = 0;
00267 size_t size;
00268
00269 if (_GLOBAL_WITH_REQSTREAM)
00270 {
00271
00272 size = dazuko_reqstream_dim_chunk0(sizeof(char), sizeof(int), sizeof(void *)) + 4;
00273
00274 llreq = (unsigned char *)malloc(size);
00275 if (llreq == NULL)
00276 return -1;
00277
00278
00279 memset(llreq, 0, size);
00280
00281 if (dazuko_reqstream_hl2ll(request, llreq) != 0)
00282 {
00283 free(llreq);
00284 return -1;
00285 }
00286 snprintf(buffer, buffer_size, "\nra=%lu", (unsigned long)llreq);
00287 }
00288 else if (_GLOBAL_WITH_DEVWRITE)
00289 {
00290 snprintf(buffer, buffer_size, "\nRA=%lu", (unsigned long)request);
00291 }
00292 else
00293 {
00294
00295
00296 return -1;
00297 }
00298
00299 buffer[buffer_size - 1] = 0;
00300
00301 error = xp_process_request(id, buffer, strlen(buffer) + 1);
00302
00303 if (reply_required && !error && _GLOBAL_WITH_REQSTREAM)
00304 {
00305 if (dazuko_reqstream_ll2hl(llreq, request, 1) != 0)
00306 {
00307
00308 error = -1;
00309 }
00310 }
00311
00312 if (llreq != NULL)
00313 free(llreq);
00314
00315 return error;
00316 }
00317
00318 #define DAZUKO_SET_VERSION(maj, min, rev, rel, txt) \
00319 { \
00320 if (!_SET_DAZUKO_VERSION) \
00321 { \
00322 _DAZUKO_VERSION.major = maj; \
00323 _DAZUKO_VERSION.minor = min; \
00324 _DAZUKO_VERSION.revision = rev; \
00325 _DAZUKO_VERSION.release = rel; \
00326 snprintf(_DAZUKO_VERSION.text, sizeof(_DAZUKO_VERSION.text), txt); \
00327 _DAZUKO_VERSION.text[sizeof(_DAZUKO_VERSION.text) - 1] = 0; \
00328 _SET_DAZUKO_VERSION = 1; \
00329 } \
00330 }
00331
00332 static void dazuko_set_version(const char *reply_buffer)
00333 {
00334 char vn_buffer[ITOA_SIZE + DAZUKO_VERSION_TEXT_SIZE];
00335 char vs_buffer[ITOA_SIZE + DAZUKO_VERSION_TEXT_SIZE];
00336 int maj = 0;
00337 int min = 0;
00338 int rev = 0;
00339 int rel = 0;
00340 char *p1;
00341 char *p2;
00342 int error = 0;
00343
00344 #define DAZUKO_POP_NUMBER(num) \
00345 { \
00346 if (p1 == NULL) \
00347 { \
00348 error = 1; \
00349 } \
00350 else \
00351 { \
00352 p2 = strchr(p1, '.'); \
00353 if (p2 != NULL) \
00354 { \
00355 *p2 = 0; \
00356 p2++; \
00357 } \
00358 num = atoi(p1); \
00359 p1 = p2; \
00360 } \
00361 }
00362
00363 if (dazuko_get_value("\nVN=", reply_buffer, vn_buffer, sizeof(vn_buffer)) != 0)
00364 {
00365 error = 1;
00366 }
00367
00368 if (!error && dazuko_get_value("\nVS=", reply_buffer, vs_buffer, sizeof(vs_buffer)) != 0)
00369 {
00370 error = 1;
00371 }
00372
00373 if (!error)
00374 {
00375 p1 = vn_buffer;
00376 DAZUKO_POP_NUMBER(maj);
00377 DAZUKO_POP_NUMBER(min);
00378 DAZUKO_POP_NUMBER(rev);
00379 DAZUKO_POP_NUMBER(rel);
00380 }
00381
00382 if (error)
00383 {
00384
00385 DAZUKO_SET_VERSION(2, 1, 0, 0, "2.1.0-prex");
00386 }
00387 else
00388 {
00389 DAZUKO_SET_VERSION(maj, min, rev, rel, vs_buffer);
00390 }
00391 }
00392
00393
00394
00395
00396
00397
00398 static int dazukoRegister_TS_inner(dazuko_id_t **dazuko_id, const char *groupName, const char *mode)
00399 {
00400 struct dazuko_request *request;
00401 char buffer[ITOA_SIZE];
00402 char regMode[3];
00403 dazuko_id_t *temp_id;
00404 size_t size;
00405 int write_mode = 0;
00406 #if !defined(NO_COMPAT1)
00407 int compat1_ret;
00408 #endif
00409
00410 if (dazuko_id == NULL)
00411 return -1;
00412
00413
00414 if (groupName == NULL)
00415 groupName = "_GENERIC";
00416
00417
00418 if (mode == NULL)
00419 mode = "r";
00420
00421 if (strcasecmp(mode, "r") == 0)
00422 {
00423 strncpy(regMode, "R", sizeof(regMode));
00424 write_mode = 0;
00425 }
00426 else if (strcasecmp(mode, "r+") == 0 || strcasecmp(mode, "rw") == 0)
00427 {
00428 strncpy(regMode, "RW", sizeof(regMode));
00429 write_mode = 1;
00430 }
00431 else
00432 {
00433 return -1;
00434 }
00435 regMode[sizeof(regMode) - 1] = 0;
00436
00437 #if !defined(NO_COMPAT1)
00438
00439 if (_GLOBAL_DAZUKO_COMPAT1)
00440 {
00441 compat1_ret = dazukoRegister_TS_compat1_wrapper(dazuko_id, groupName);
00442
00443 if (compat1_ret == 0)
00444 {
00445 (*dazuko_id)->write_mode = write_mode;
00446
00447 DAZUKO_SET_VERSION(1, 0, 0, 0, "1.x");
00448 }
00449
00450 return compat1_ret;
00451 }
00452
00453 #endif
00454
00455
00456 temp_id = (dazuko_id_t *)malloc(sizeof(dazuko_id_t));
00457 if (temp_id == NULL)
00458 return -1;
00459
00460 memset(temp_id, 0, sizeof(dazuko_id_t));
00461
00462
00463 if (xp_connection_open(temp_id) != 0)
00464 {
00465 free(temp_id);
00466 return -1;
00467 }
00468
00469
00470 size = 1 + 2 + 1 + strlen(regMode)
00471 + 1 + 2 + 1 + strlen(groupName)
00472 + 1
00473 ;
00474
00475 request = alloc_request(REGISTER, size, 4096);
00476 if (request == NULL)
00477 {
00478 xp_connection_close(temp_id);
00479 free(temp_id);
00480 return -1;
00481 }
00482
00483 snprintf(request->buffer, size, "\nRM=%s\nGN=%s", regMode, groupName);
00484 request->buffer[size - 1] = 0;
00485 request->buffer_size = strlen(request->buffer) + 1;
00486
00487 if (process_request(temp_id, buffer, sizeof(buffer), request, 1) != 0)
00488 {
00489 xp_connection_close(temp_id);
00490 free(temp_id);
00491 free_request(&request);
00492
00493 return -1;
00494 }
00495
00496 if (dazuko_get_value("\nID=", request->reply_buffer, buffer, sizeof(buffer)) != 0)
00497 {
00498 xp_connection_close(temp_id);
00499 free(temp_id);
00500 free_request(&request);
00501
00502 return -1;
00503 }
00504
00505 temp_id->id = atoi(buffer);
00506
00507 if (temp_id->id < 0)
00508 {
00509 xp_connection_close(temp_id);
00510 free(temp_id);
00511 free_request(&request);
00512
00513 return -1;
00514 }
00515
00516 temp_id->write_mode = write_mode;
00517
00518 if (_GLOBAL_WITH_REQSTREAM)
00519 {
00520 dazuko_set_version(request->reply_buffer);
00521 }
00522 else if (_GLOBAL_WITH_DEVWRITE)
00523 {
00524 DAZUKO_SET_VERSION(2, 0, 0, 0, "2.0.x");
00525 }
00526
00527 free_request(&request);
00528
00529 *dazuko_id = temp_id;
00530
00531 return 0;
00532 }
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546 int dazukoRegister_TS(dazuko_id_t **dazuko_id, const char *groupName, const char *mode)
00547 {
00548 int rc;
00549
00550
00551 _GLOBAL_WITH_REQSTREAM = 1;
00552
00553 _GLOBAL_WITH_DEVWRITE = 0;
00554 #if !defined(NO_COMPAT1)
00555 _GLOBAL_DAZUKO_COMPAT1 = 0;
00556 #endif
00557
00558
00559 while (1)
00560 {
00561
00562 rc = dazukoRegister_TS_inner(dazuko_id, groupName, mode);
00563 if (rc == 0)
00564 break;
00565
00566
00567
00568 if (_GLOBAL_WITH_REQSTREAM)
00569 {
00570
00571
00572 _GLOBAL_WITH_REQSTREAM = 0;
00573 _GLOBAL_WITH_DEVWRITE = 1;
00574 continue;
00575 }
00576
00577 #if !defined(NO_COMPAT1)
00578 if (_GLOBAL_WITH_DEVWRITE)
00579 {
00580
00581
00582 _GLOBAL_WITH_DEVWRITE = 0;
00583 _GLOBAL_DAZUKO_COMPAT1 = 1;
00584 continue;
00585 }
00586 #endif
00587
00588
00589 break;
00590 }
00591
00592 return rc;
00593 }
00594
00595 int dazukoSetAccessMask(unsigned long accessMask)
00596 {
00597 return dazukoSetAccessMask_TS(_GLOBAL_DAZUKO, accessMask);
00598 }
00599
00600 int dazukoSetAccessMask_TS(dazuko_id_t *dazuko_id, unsigned long accessMask)
00601 {
00602 struct dazuko_request *request;
00603 size_t size;
00604 char buffer[ITOA_SIZE];
00605
00606 if (dazuko_id == NULL)
00607 return -1;
00608
00609 #if !defined(NO_COMPAT1)
00610 if (_GLOBAL_DAZUKO_COMPAT1)
00611 return dazukoSetAccessMask_TS_compat1(dazuko_id, accessMask);
00612 #endif
00613
00614 if (dazuko_id->id < 0)
00615 return -1;
00616
00617 if (xp_verify_id(dazuko_id) != 0)
00618 return -1;
00619
00620 size = 1 + 2 + 1 + ITOA_SIZE
00621 + 1 + 2 + 1 + ITOA_SIZE
00622 + 1
00623 ;
00624
00625 request = alloc_request(SET_ACCESS_MASK, size, 0);
00626 if (request == NULL)
00627 return -1;
00628
00629 snprintf(request->buffer, size, "\nID=%d\nAM=%lu", dazuko_id->id, accessMask);
00630 request->buffer[size - 1] = 0;
00631 request->buffer_size = strlen(request->buffer) + 1;
00632
00633 if (process_request(dazuko_id, buffer, sizeof(buffer), request, 0) != 0)
00634 {
00635 free_request(&request);
00636 return -1;
00637 }
00638
00639 free_request(&request);
00640
00641 return 0;
00642 }
00643
00644 static int dazuko_set_path(dazuko_id_t *dazuko_id, const char *path, int type)
00645 {
00646 struct dazuko_request *request;
00647 size_t size;
00648 char buffer[ITOA_SIZE];
00649
00650 if (dazuko_id == NULL)
00651 return -1;
00652
00653 if (dazuko_id->id < 0)
00654 return -1;
00655
00656 if (xp_verify_id(dazuko_id) != 0)
00657 return -1;
00658
00659 if (path == NULL)
00660 return -1;
00661
00662 size = 1 + 2 + 1 + ITOA_SIZE
00663 + 1 + 2 + 1 + strlen(path)
00664 + 1
00665 ;
00666
00667 request = alloc_request(type, size, 0);
00668 if (request == NULL)
00669 return -1;
00670
00671 snprintf(request->buffer, size, "\nID=%d\nPT=%s", dazuko_id->id, path);
00672 request->buffer[size - 1] = 0;
00673 request->buffer_size = strlen(request->buffer) + 1;
00674
00675 if (process_request(dazuko_id, buffer, sizeof(buffer), request, 0) != 0)
00676 {
00677 free_request(&request);
00678 return -1;
00679 }
00680
00681 free_request(&request);
00682
00683 return 0;
00684 }
00685
00686 int dazukoAddIncludePath(const char *path)
00687 {
00688 return dazukoAddIncludePath_TS(_GLOBAL_DAZUKO, path);
00689 }
00690
00691 int dazukoAddIncludePath_TS(dazuko_id_t *dazuko_id, const char *path)
00692 {
00693 #if !defined(NO_COMPAT1)
00694 if (_GLOBAL_DAZUKO_COMPAT1)
00695 return dazukoAddIncludePath_TS_compat1(dazuko_id, path);
00696 #endif
00697
00698 return dazuko_set_path(dazuko_id, path, ADD_INCLUDE_PATH);
00699 }
00700
00701 int dazukoAddExcludePath(const char *path)
00702 {
00703 return dazukoAddExcludePath_TS(_GLOBAL_DAZUKO, path);
00704 }
00705
00706 int dazukoAddExcludePath_TS(dazuko_id_t *dazuko_id, const char *path)
00707 {
00708 #if !defined(NO_COMPAT1)
00709 if (_GLOBAL_DAZUKO_COMPAT1)
00710 return dazukoAddExcludePath_TS_compat1(dazuko_id, path);
00711 #endif
00712
00713 return dazuko_set_path(dazuko_id, path, ADD_EXCLUDE_PATH);
00714 }
00715
00716 int dazukoRemoveAllPaths(void)
00717 {
00718 return dazukoRemoveAllPaths_TS(_GLOBAL_DAZUKO);
00719 }
00720
00721 int dazukoRemoveAllPaths_TS(dazuko_id_t *dazuko_id)
00722 {
00723 struct dazuko_request *request;
00724 size_t size;
00725 char buffer[ITOA_SIZE];
00726
00727 if (dazuko_id == NULL)
00728 return -1;
00729
00730 #if !defined(NO_COMPAT1)
00731 if (_GLOBAL_DAZUKO_COMPAT1)
00732 return dazukoRemoveAllPaths_TS_compat1(dazuko_id);
00733 #endif
00734
00735 if (dazuko_id->id < 0)
00736 return -1;
00737
00738 if (xp_verify_id(dazuko_id) != 0)
00739 return -1;
00740
00741 size = 1 + 2 + 1 + ITOA_SIZE
00742 + 1
00743 ;
00744
00745 request = alloc_request(REMOVE_ALL_PATHS, size, 0);
00746 if (request == NULL)
00747 return -1;
00748
00749 snprintf(request->buffer, size, "\nID=%d", dazuko_id->id);
00750 request->buffer[size - 1] = 0;
00751 request->buffer_size = strlen(request->buffer) + 1;
00752
00753 if (process_request(dazuko_id, buffer, sizeof(buffer), request, 0) != 0)
00754 {
00755 free_request(&request);
00756 return -1;
00757 }
00758
00759 free_request(&request);
00760
00761 return 0;
00762 }
00763
00764 int dazukoGetAccess(struct dazuko_access **acc)
00765 {
00766 return dazukoGetAccess_TS(_GLOBAL_DAZUKO, acc);
00767 }
00768
00769 int dazukoGetAccess_TS(dazuko_id_t *dazuko_id, struct dazuko_access **acc)
00770 {
00771 struct dazuko_request *request;
00772 struct dazuko_access *temp_acc;
00773 size_t size;
00774 size_t filename_size;
00775 char buffer[ITOA_SIZE];
00776 #if !defined(NO_COMPAT1)
00777 int compat1_ret;
00778 #endif
00779
00780 if (dazuko_id == NULL)
00781 return -1;
00782
00783 #if !defined(NO_COMPAT1)
00784 if (_GLOBAL_DAZUKO_COMPAT1)
00785 {
00786 compat1_ret = dazukoGetAccess_TS_compat1_wrapper(dazuko_id, acc);
00787
00788 if (compat1_ret == 0 && !(dazuko_id->write_mode))
00789 {
00790
00791
00792 dazukoReturnAccess_TS_compat1_wrapper(dazuko_id, acc, 1, 0);
00793
00794
00795 }
00796
00797 return compat1_ret;
00798 }
00799 #endif
00800
00801 if (dazuko_id->id < 0)
00802 return -1;
00803
00804 if (xp_verify_id(dazuko_id) != 0)
00805 return -1;
00806
00807 if (acc == NULL)
00808 return -1;
00809
00810 size = 1 + 2 + 1 + ITOA_SIZE
00811 + 1
00812 ;
00813
00814 request = alloc_request(GET_AN_ACCESS, size,
00815 1 + 2 + 1 + DAZUKO_FILENAME_MAX_LENGTH
00816 + 1024
00817 + 1
00818 );
00819 if (request == NULL)
00820 return -1;
00821
00822 snprintf(request->buffer, size, "\nID=%d", dazuko_id->id);
00823 request->buffer[size - 1] = 0;
00824 request->buffer_size = strlen(request->buffer) + 1;
00825
00826 temp_acc = (struct dazuko_access *)malloc(sizeof(struct dazuko_access));
00827 if (temp_acc == NULL)
00828 {
00829 free_request(&request);
00830 return -1;
00831 }
00832
00833 memset(temp_acc, 0, sizeof(struct dazuko_access));
00834
00835 filename_size = DAZUKO_FILENAME_MAX_LENGTH + 1;
00836 temp_acc->filename = (char *)malloc(filename_size);
00837 if (temp_acc->filename == NULL)
00838 {
00839 free(temp_acc);
00840 free_request(&request);
00841 return -1;
00842 }
00843
00844 if (process_request(dazuko_id, buffer, sizeof(buffer), request, 1) != 0)
00845 {
00846 free(temp_acc->filename);
00847 free(temp_acc);
00848 free_request(&request);
00849 return -1;
00850 }
00851
00852 if (request->reply_buffer_size_used > 0)
00853 {
00854 if (dazuko_get_value("\nFN=", request->reply_buffer, temp_acc->filename, filename_size) == 0)
00855 {
00856 temp_acc->set_filename = 1;
00857 unescape_string(temp_acc->filename);
00858 }
00859
00860 if (dazuko_get_value("\nEV=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
00861 {
00862 temp_acc->event = atoi(buffer);
00863 temp_acc->set_event = 1;
00864 }
00865
00866 if (dazuko_get_value("\nFL=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
00867 {
00868 temp_acc->flags = atoi(buffer);
00869 temp_acc->set_flags = 1;
00870 }
00871
00872 if (dazuko_get_value("\nMD=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
00873 {
00874 temp_acc->mode = atoi(buffer);
00875 temp_acc->set_mode = 1;
00876 }
00877
00878 if (dazuko_get_value("\nUI=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
00879 {
00880 temp_acc->uid = atoi(buffer);
00881 temp_acc->set_uid = 1;
00882 }
00883
00884 if (dazuko_get_value("\nPI=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
00885 {
00886 temp_acc->pid = atoi(buffer);
00887 temp_acc->set_pid = 1;
00888 }
00889
00890 if (dazuko_get_value("\nFS=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
00891 {
00892 temp_acc->file_size = atol(buffer);
00893 temp_acc->set_file_size = 1;
00894 }
00895
00896 if (dazuko_get_value("\nFU=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
00897 {
00898 temp_acc->file_uid = atoi(buffer);
00899 temp_acc->set_file_uid = 1;
00900 }
00901
00902 if (dazuko_get_value("\nFG=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
00903 {
00904 temp_acc->file_gid = atoi(buffer);
00905 temp_acc->set_file_gid = 1;
00906 }
00907
00908 if (dazuko_get_value("\nDT=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
00909 {
00910 temp_acc->file_device = atoi(buffer);
00911 temp_acc->set_file_device = 1;
00912 }
00913
00914 if (dazuko_get_value("\nFM=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
00915 {
00916 temp_acc->file_mode = atoi(buffer);
00917 temp_acc->set_file_mode = 1;
00918 }
00919 }
00920
00921 free_request(&request);
00922
00923 *acc = temp_acc;
00924
00925 return 0;
00926 }
00927
00928 int dazukoReturnAccess(struct dazuko_access **acc)
00929 {
00930 return dazukoReturnAccess_TS(_GLOBAL_DAZUKO, acc);
00931 }
00932
00933 int dazukoReturnAccess_TS(dazuko_id_t *dazuko_id, struct dazuko_access **acc)
00934 {
00935 struct dazuko_request *request;
00936 size_t size;
00937 char buffer[ITOA_SIZE];
00938
00939 if (dazuko_id == NULL)
00940 return -1;
00941
00942 #if !defined(NO_COMPAT1)
00943 if (_GLOBAL_DAZUKO_COMPAT1)
00944 return dazukoReturnAccess_TS_compat1_wrapper(dazuko_id, acc, dazuko_id->write_mode, 1);
00945 #endif
00946
00947 if (dazuko_id->id < 0)
00948 return -1;
00949
00950 if (xp_verify_id(dazuko_id) != 0)
00951 return -1;
00952
00953 if (acc == NULL)
00954 return -1;
00955
00956 if (*acc == NULL)
00957 return -1;
00958
00959 if (dazuko_id->write_mode)
00960 {
00961 size = 1 + 2 + 1 + ITOA_SIZE
00962 + 1 + 2 + 1 + ITOA_SIZE
00963 + 1
00964 ;
00965
00966 request = alloc_request(RETURN_AN_ACCESS, size, 0);
00967 if (request == NULL)
00968 return -1;
00969
00970 snprintf(request->buffer, size, "\nID=%d\nDN=%d", dazuko_id->id, (*acc)->deny == 0 ? 0 : 1);
00971 request->buffer[size - 1] = 0;
00972 request->buffer_size = strlen(request->buffer) + 1;
00973
00974 if (process_request(dazuko_id, buffer, sizeof(buffer), request, 0) != 0)
00975 {
00976
00977
00978 if ((*acc)->filename != NULL)
00979 free((*acc)->filename);
00980 free(*acc);
00981 *acc = NULL;
00982 free_request(&request);
00983 return -1;
00984 }
00985
00986 free_request(&request);
00987 }
00988
00989 if ((*acc)->filename != NULL)
00990 free((*acc)->filename);
00991 free(*acc);
00992 *acc = NULL;
00993
00994 return 0;
00995 }
00996
00997 int dazukoUnregister(void)
00998 {
00999 return dazukoUnregister_TS(&_GLOBAL_DAZUKO);
01000 }
01001
01002 int dazukoUnregister_TS(dazuko_id_t **dazuko_id)
01003 {
01004 struct dazuko_request *request;
01005 size_t size;
01006 char buffer[ITOA_SIZE];
01007 int error = 0;
01008
01009 if (dazuko_id == NULL)
01010 return -1;
01011
01012 #if !defined(NO_COMPAT1)
01013 if (_GLOBAL_DAZUKO_COMPAT1)
01014 return dazukoUnregister_TS_compat1_wrapper(dazuko_id);
01015 #endif
01016
01017 if (*dazuko_id == NULL)
01018 return -1;
01019
01020 if (xp_verify_id(*dazuko_id) == 0)
01021 {
01022 size = 1 + 2 + 1 + ITOA_SIZE
01023 + 1
01024 ;
01025
01026 request = alloc_request(UNREGISTER, size, 0);
01027 if (request == NULL)
01028 return -1;
01029
01030 snprintf(request->buffer, size, "\nID=%d", (*dazuko_id)->id);
01031 request->buffer[size - 1] = 0;
01032 request->buffer_size = strlen(request->buffer) + 1;
01033
01034 if (process_request(*dazuko_id, buffer, sizeof(buffer), request, 0) != 0)
01035 {
01036
01037
01038 error = -1;
01039 }
01040
01041 free_request(&request);
01042 }
01043
01044 xp_connection_close(*dazuko_id);
01045 free(*dazuko_id);
01046 *dazuko_id = NULL;
01047
01048 return error;
01049 }
01050
01051 int dazukoInitializeCache(struct dazuko_cache_settings *cs)
01052 {
01053 return dazukoInitializeCache_TS(_GLOBAL_DAZUKO, cs);
01054 }
01055
01056 int dazukoInitializeCache_TS(dazuko_id_t *dazuko_id, struct dazuko_cache_settings *cs)
01057 {
01058 struct dazuko_request *request;
01059 size_t size;
01060 char buffer[ITOA_SIZE];
01061 int cache_available = 0;
01062
01063 if (dazuko_id == NULL)
01064 return -1;
01065
01066 #if !defined(NO_COMPAT1)
01067 if (_GLOBAL_DAZUKO_COMPAT1)
01068 return -1;
01069 #endif
01070
01071 if (dazuko_id->id < 0)
01072 return -1;
01073
01074 if (xp_verify_id(dazuko_id) != 0)
01075 return -1;
01076
01077 if (cs == NULL)
01078 return -1;
01079
01080 size = 1 + 2 + 1 + ITOA_SIZE
01081 + 1 + 2 + 1 + ITOA_SIZE
01082 + 1
01083 ;
01084
01085 request = alloc_request(INITIALIZE_CACHE, size,
01086 1 + 2 + 1 + ITOA_SIZE
01087 + 1024
01088 + 1
01089 );
01090 if (request == NULL)
01091 return -1;
01092
01093 snprintf(request->buffer, size, "\nID=%d\nCT=%lu", dazuko_id->id, cs->ttl);
01094 request->buffer[size - 1] = 0;
01095 request->buffer_size = strlen(request->buffer) + 1;
01096
01097 if (process_request(dazuko_id, buffer, sizeof(buffer), request, 1) != 0)
01098 {
01099 free_request(&request);
01100 return -1;
01101 }
01102
01103 if (request->reply_buffer_size_used > 0)
01104 {
01105 if (dazuko_get_value("\nCA=", request->reply_buffer, buffer, sizeof(buffer)) == 0)
01106 {
01107 cache_available = atoi(buffer);
01108 }
01109 }
01110
01111 free_request(&request);
01112
01113 if (cache_available)
01114 return 0;
01115
01116 return -1;
01117 }
01118
01119 int dazukoRemoveAllTrusted(void)
01120 {
01121 return dazukoRemoveAllTrusted_TS(_GLOBAL_DAZUKO);
01122 }
01123
01124 int dazukoRemoveAllTrusted_TS(dazuko_id_t *dazuko_id)
01125 {
01126 struct dazuko_request *request;
01127 size_t size;
01128 char buffer[ITOA_SIZE];
01129
01130 if (dazuko_id == NULL)
01131 return -1;
01132
01133 #if !defined(NO_COMPAT1)
01134 if (_GLOBAL_DAZUKO_COMPAT1)
01135 return -1;
01136 #endif
01137
01138 if (dazuko_id->id < 0)
01139 return -1;
01140
01141 if (xp_verify_id(dazuko_id) != 0)
01142 return -1;
01143
01144 size = 1 + 2 + 1 + ITOA_SIZE
01145 + 1
01146 ;
01147
01148 request = alloc_request(REMOVE_ALL_TRUSTED, size, 0);
01149 if (request == NULL)
01150 return -1;
01151
01152 snprintf(request->buffer, size, "\nID=%d", dazuko_id->id);
01153 request->buffer[size - 1] = 0;
01154 request->buffer_size = strlen(request->buffer) + 1;
01155
01156 if (process_request(dazuko_id, buffer, sizeof(buffer), request, 0) != 0)
01157 {
01158 free_request(&request);
01159 return -1;
01160 }
01161
01162 free_request(&request);
01163
01164 return 0;
01165 }
01166
01167 int dazukoRemoveTrusted(const char *token)
01168 {
01169 return dazukoRemoveTrusted_TS(_GLOBAL_DAZUKO, token);
01170 }
01171
01172 int dazukoRemoveTrusted_TS(dazuko_id_t *dazuko_id, const char *token)
01173 {
01174 struct dazuko_request *request;
01175 size_t size;
01176 char buffer[ITOA_SIZE];
01177
01178 if (dazuko_id == NULL || token == NULL)
01179 return -1;
01180
01181 #if !defined(NO_COMPAT1)
01182 if (_GLOBAL_DAZUKO_COMPAT1)
01183 return -1;
01184 #endif
01185
01186 if (dazuko_id->id < 0)
01187 return -1;
01188
01189 if (xp_verify_id(dazuko_id) != 0)
01190 return -1;
01191
01192 size = 1 + 2 + 1 + ITOA_SIZE
01193 + 1 + 2 + 1 + strlen(token)
01194 + 1
01195 ;
01196
01197 request = alloc_request(REMOVE_TRUSTED, size, 0);
01198 if (request == NULL)
01199 return -1;
01200
01201 snprintf(request->buffer, size, "\nID=%d\nTT=%s", dazuko_id->id, token);
01202 request->buffer[size - 1] = 0;
01203 request->buffer_size = strlen(request->buffer) + 1;
01204
01205 if (process_request(dazuko_id, buffer, sizeof(buffer), request, 0) != 0)
01206 {
01207 free_request(&request);
01208 return -1;
01209 }
01210
01211 free_request(&request);
01212
01213 return 0;
01214 }
01215