dazukoio_core.c

Go to the documentation of this file.
00001 /* Dazuko Interface. Interace with Dazuko for file access control.
00002    Written by John Ogness <jogness@antivir.de>
00003 
00004    Copyright (c) 2002, 2003, 2004, 2005, 2006 H+BEDV Datentechnik GmbH
00005    All rights reserved.
00006 
00007    Redistribution and use in source and binary forms, with or without
00008    modification, are permitted provided that the following conditions
00009    are met:
00010 
00011    1. Redistributions of source code must retain the above copyright notice,
00012    this list of conditions and the following disclaimer.
00013 
00014    2. Redistributions in binary form must reproduce the above copyright notice,
00015    this list of conditions and the following disclaimer in the documentation
00016    and/or other materials provided with the distribution.
00017 
00018    3. Neither the name of Dazuko nor the names of its contributors may be used
00019    to endorse or promote products derived from this software without specific
00020    prior written permission.
00021 
00022    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00023    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00024    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00025    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00026    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00027    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00028    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00029    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00030    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00031    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00032    POSSIBILITY OF SUCH DAMAGE.
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 /* binary version stamp */
00048 const char      *DAZUKO_VERSION_STAMP = "\nDazukoVersion=" DAZUKO_VERSION_MAJOR "." DAZUKO_VERSION_MINOR "." DAZUKO_VERSION_REVISION "." DAZUKO_VERSION_RELEASE "\n";
00049 
00050 /* version string for display */
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 /* this is just a large number to "guarentee"
00058    to contain the full filename */
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         /* ugly, but fast */
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                 /* check if we have \x */
00107                 if ((*p == '\\') && (*(p+1) == 'x'))
00108                 {
00109                         /* this is not cheap, but it should not occur often */
00110 
00111                         /* check if we have two more values following \x */
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         /* Note: buffer and buffer_size should be set after
00183          * calling this function */
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                 /* we add an extra 4 bytes as "size of chunk 1" */
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                 /* this is especially important for the last 4 bytes */
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                 /* why are we here? */
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                         /* this could be dangerous if it happens */
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                 /* this should never occur unless someone used a CVS snapshot */
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  * "inner" part of the REGISTER function: try to register with the kernel while
00395  * using one communication method; the caller might invoke us multiple times
00396  * after adjusting a few compatibility flags
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         /* set default group name if one was not given */
00414         if (groupName == NULL)
00415                 groupName = "_GENERIC";
00416 
00417         /* set default mode if one was not given */
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         /* shortcut for the compat12 layer */
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         /* fallthrough to the device writing path */
00453 #endif
00454 
00455         /* create temporary id */
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         /* open device */
00463         if (xp_connection_open(temp_id) != 0)
00464         {
00465                 free(temp_id);
00466                 return -1;
00467         }
00468 
00469         /* allocate a request, fill in "RM=" and "GN=" */
00470         size = 1 + 2 + 1 + strlen(regMode) /* \nRM=mode */
00471                 + 1 + 2 + 1 + strlen(groupName) /* \nGN=groupName */
00472                 + 1 /* \0 */
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  * "outer" part of the REGISTER function:  try to register, use from the most
00536  * current / most portable communication method down to the oldest
00537  * compatibility mode to talk to the kernel module
00538  *
00539  * we don't care too much about cost -- this happens only once at startup and
00540  * is done in the interest of the best possible compatbility while reaching for
00541  * best service quality (robustness, feature sets, parameters accessible, etc)
00542  *
00543  * we only try to fallback once at the REGISTER stage, every following
00544  * operation is done using the communication method we determine here
00545  */
00546 int dazukoRegister_TS(dazuko_id_t **dazuko_id, const char *groupName, const char *mode)
00547 {
00548         int     rc;
00549 
00550         /* prep: enable highest available mode */
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         /* try to register until success or methods are exhausted */
00559         while (1)
00560         {
00561                 /* stop if we succeeded to register */
00562                 rc = dazukoRegister_TS_inner(dazuko_id, groupName, mode);
00563                 if (rc == 0)
00564                         break;
00565 
00566                 /* try to fallback if possible */
00567 
00568                 if (_GLOBAL_WITH_REQSTREAM)
00569                 {
00570                         /* the "ra=" method failed, fallback to "RA=" */
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                         /* the "RA=" method failed, fallback to compat1 */
00581 
00582                         _GLOBAL_WITH_DEVWRITE = 0;
00583                         _GLOBAL_DAZUKO_COMPAT1 = 1;
00584                         continue;
00585                 }
00586 #endif
00587 
00588                 /* we ran out of alternatives, return with an error */
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 /* \nID=id */
00621                 + 1 + 2 + 1 + ITOA_SIZE /* \nAM=accessMask */
00622                 + 1 /* \0 */
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 /* \nID=id */
00663                 + 1 + 2 + 1 + strlen(path) /* \nPT=path */
00664                 + 1 /* \0 */
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 /* \nID=id */
00742                 + 1 /* \0 */
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                         /* we are in read_only mode so we return the access immediately */
00791 
00792                         dazukoReturnAccess_TS_compat1_wrapper(dazuko_id, acc, 1, 0);
00793 
00794                         /* this could be dangerous, we do not check if the return was successfull! */
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 /* \nID=id */
00811                 + 1 /* \0 */
00812                 ;
00813 
00814         request = alloc_request(GET_AN_ACCESS, size,
00815                 1 + 2 + 1 + DAZUKO_FILENAME_MAX_LENGTH /* \nFN=filename */
00816                 + 1024 /* miscellaneous access attributes */
00817                 + 1 /* \0 */
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 /* \nID=id */
00962                         + 1 + 2 + 1 + ITOA_SIZE /* \nDN=deny */
00963                         + 1 /* \0 */
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                         /* there could be big problems if this happens */
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 /* \nID=id */
01023                         + 1 /* \0 */
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                         /* there could be big problems if this happens */
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 /* \nID=id */
01081                 + 1 + 2 + 1 + ITOA_SIZE /* \nCT=cachettl */
01082                 + 1 /* \0 */
01083                 ;
01084 
01085         request = alloc_request(INITIALIZE_CACHE, size,
01086                 1 + 2 + 1 + ITOA_SIZE /* \nCA=cacheavailable */
01087                 + 1024 /* miscellaneous cache attributes */
01088                 + 1 /* \0 */
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 /* \nID=id */
01145                 + 1 /* \0 */
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 /* \nID=id */
01193                 + 1 + 2 + 1 + strlen(token) /* \nTT=token */
01194                 + 1 /* \0 */
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 

Generated on Sun May 21 14:30:50 2006 for RSBAC by  doxygen 1.4.2