00001 #ifndef __ALCHEMIST__
00002 #define __ALCHEMIST__
00003
00004 #include <sys/types.h>
00005
00006
00007
00008
00009
00010
00011
00012 #define ALCHEMIST_ABI_MAJOR_VER 0
00013
00014
00015
00016
00017 #define ALCHEMIST_ABI_MINOR_VER 0
00018
00019 typedef struct AdmError AdmError;
00020
00030 void AdmError_create (AdmError **error,
00031 int num,
00032 const char *format,
00033 ...);
00034
00039 void AdmError_ref (AdmError *error);
00040
00047 void AdmError_unref (AdmError *error);
00048
00059 const char *AdmError_strerr (AdmError *error);
00060
00070 int AdmError_errno (AdmError *error);
00071
00072
00073 #define ADM_EDEADNODE 1
00074 #define ADM_EBADTYPE 2
00076 #define ADM_EBADNAME 3
00077 #define ADM_EBADDATA 4
00078 #define ADM_ECONSTRAINT 5
00080 #define ADM_ENOINDEX 51
00081 #define ADM_ENONAME 52
00082 #define ADM_ENOPATH 53
00084 #define ADM_EACCESSFAILED 101
00085 #define ADM_ENONAMESPACE 102
00086 #define ADM_ENOSUBSPACE 103
00088 #define ADM_ENOWRITE 201
00089 #define ADM_ENOREAD 202
00090 #define ADM_ENOLISTSERIAL 203
00091 #define ADM_ENOREADSERIAL 204
00092 #define ADM_ENOCACHE 205
00094 #define ADM_ENOBOXTYPE 251
00096 #define ADM_EPARSE 301
00098 typedef struct AdmRefStr AdmRefStr;
00099
00100 AdmRefStr * AdmRefStr_ref (AdmRefStr *refstr);
00101 void AdmRefStr_unref (AdmRefStr *refstr);
00102
00103 size_t AdmRefStr_len (AdmRefStr *refstr);
00104
00105 #define AdmRefStr_str(REFSTR) \
00106 ({ \
00107 AdmRefStr *__tok = (REFSTR); \
00108 (const char *) __tok; \
00109 })
00110
00118 AdmRefStr * AdmRefStr_get (const char *str,
00119 int force);
00120
00129 AdmRefStr * AdmRefStr_nget (const char *str,
00130 size_t len,
00131 int force);
00132
00133 typedef struct AdmData AdmData;
00134
00135 typedef struct AdmList AdmList;
00136
00137 typedef struct AdmInt AdmInt;
00138
00139 typedef struct AdmBool AdmBool;
00140
00141 typedef struct AdmFloat AdmFloat;
00142
00143 typedef struct AdmString AdmString;
00144
00145 typedef struct AdmString AdmBase64;
00146
00147 typedef struct AdmString AdmCopy;
00148
00149 typedef struct AdmIdentity AdmIdentity;
00150
00151 typedef struct AdmContext AdmContext;
00152
00153 typedef enum {
00154 ADM_TYPE_UNKNOWN = 0,
00155 ADM_TYPE_LIST = 1,
00156 ADM_TYPE_COPY = 2,
00157 ADM_TYPE_INT = 3,
00158 ADM_TYPE_FLOAT = 4,
00159 ADM_TYPE_BOOL = 5,
00160 ADM_TYPE_STRING = 6,
00161 ADM_TYPE_BASE64 = 7
00162 } AdmDataType;
00163
00164
00179 AdmContext * AdmContext_new (const char *name,
00180 unsigned int serial,
00181 AdmError **error);
00182
00193 AdmContext * AdmContext_ref (AdmContext *context,
00194 AdmError **error);
00195
00209 void AdmContext_unref (AdmContext *context,
00210 AdmError **error);
00211
00212
00213
00223 AdmContext * AdmContext_copy (AdmContext *context,
00224 AdmError **error);
00225
00244 AdmContext * AdmContext_merge (const char *name,
00245 unsigned int serial,
00246 AdmContext *contextA,
00247 AdmContext *contextB,
00248 AdmError **error);
00249
00260 void AdmContext_flatten (AdmContext *context,
00261 AdmError **error);
00262
00272 void AdmContext_strip (AdmContext *context,
00273 AdmError **error);
00274
00275
00276
00277 char * AdmContext_toXML (AdmContext *context,
00278 AdmError **error);
00279 AdmContext * AdmContext_fromXML (const char *xml,
00280 AdmError **error);
00281 int AdmContext_readFromFile (AdmContext **context,
00282 const char *path,
00283 AdmError **error);
00284
00285 int AdmContext_writeToFile (AdmContext *context,
00286 const char *path,
00287 int mode,
00288 uid_t uid,
00289 gid_t gid,
00290 AdmError **error);
00291
00292
00310 AdmRefStr * AdmContext_getMask (AdmContext *context,
00311 unsigned int index,
00312 AdmError **error);
00313
00328 int AdmContext_setMask (AdmContext *context,
00329 const char *path,
00330 AdmError **error);
00331
00346 int AdmContext_clearMaskByIndex (AdmContext *context,
00347 unsigned int index,
00348 AdmError **error);
00349
00363 int AdmContext_clearMaskByPath (AdmContext *context,
00364 const char *path,
00365 AdmError **error);
00366
00378 unsigned int AdmContext_getNumMasks (AdmContext *context,
00379 AdmError **error);
00380
00381
00382
00395 AdmIdentity *AdmContext_getIdentityRoot (AdmContext *context,
00396 AdmError **error);
00397 #define AdmContext_getIdentityRoot_b(CONTEXT, ERROR) \
00398 ({ \
00399 AdmError **__err = (ERROR); \
00400 AdmIdentity *__id; \
00401 __id = AdmContext_getIdentityRoot((CONTEXT), __err); \
00402 if (__id != NULL) \
00403 AdmIdentity_unref(__id, __err); \
00404 __id; \
00405 })
00406
00418 AdmIdentity *AdmIdentity_getParentA (AdmIdentity *identity,
00419 AdmError **error);
00420 #define AdmIdentity_getParentA_b(ID, ERROR) \
00421 ({ \
00422 AdmError **__err = (ERROR); \
00423 AdmIdentity *__id; \
00424 __id = AdmIdentity_getParentA((ID), __err); \
00425 if (__id != NULL) \
00426 AdmIdentity_unref(__id, __err); \
00427 __id; \
00428 })
00429
00441 AdmIdentity *AdmIdentity_getParentB (AdmIdentity *identity,
00442 AdmError **error);
00443 #define AdmIdentity_getParentB_b(ID, ERROR) \
00444 ({ \
00445 AdmError **__err = (ERROR); \
00446 AdmIdentity *__id; \
00447 __id = AdmIdentity_getParentB((ID), __err); \
00448 if (__id != NULL) \
00449 AdmIdentity_unref(__id, __err); \
00450 __id; \
00451 })
00452
00468 AdmRefStr *AdmIdentity_getName (AdmIdentity *identity,
00469 AdmError **error);
00470
00482 int AdmIdentity_setName (AdmIdentity *identity,
00483 const char *name,
00484 AdmError **error);
00485
00496 unsigned int AdmIdentity_getSerial (AdmIdentity *identity,
00497 AdmError **error);
00498
00510 int AdmIdentity_setSerial (AdmIdentity *identity,
00511 unsigned int serial,
00512 AdmError **error);
00513
00525 AdmIdentity *AdmIdentity_ref (AdmIdentity *identity,
00526 AdmError **error);
00527
00540 void AdmIdentity_unref (AdmIdentity *identity,
00541 AdmError **error);
00542
00554 AdmContext * AdmIdentity_getContext (AdmIdentity *identity,
00555 AdmError **error);
00556 #define AdmIdentity_getContext_b(ID, ERROR) \
00557 ({ \
00558 AdmError **__err = (ERROR); \
00559 AdmContext *__ctx; \
00560 __ctx = AdmIdentity_getContext((ID), __err); \
00561 if (__ctx != NULL) \
00562 AdmContext_unref(__ctx, __err); \
00563 __ctx; \
00564 })
00565
00581 int AdmIdentity_isAlive (AdmIdentity *identity,
00582 AdmError **error);
00583
00584
00585
00597 AdmData * AdmContext_getDataRoot (AdmContext *context,
00598 AdmError **error);
00599 #define AdmContext_getDataRoot_b(CONTEXT, ERROR) \
00600 ({ \
00601 AdmError **__err = (ERROR); \
00602 AdmData *__data; \
00603 __data = AdmContext_getDataRoot((CONTEXT), __err); \
00604 if (__data != NULL) \
00605 AdmData_unref(__data, __err); \
00606 __data; \
00607 })
00608
00621 AdmData * AdmData_getContainer (AdmData *data,
00622 AdmError **error);
00623 #define AdmData_getContainer_b(DATA, ERROR) \
00624 ({ \
00625 AdmError **__err = (ERROR); \
00626 AdmData *__data; \
00627 __data = AdmData_getContainer((DATA), __err); \
00628 if (__data != NULL) \
00629 AdmData_unref(__data, __err); \
00630 __data; \
00631 })
00632
00640 AdmData * AdmData_getPrev (AdmData *data,
00641 int wrap,
00642 AdmError **error);
00643 #define AdmData_getPrev_b(DATA, WRAP, ERROR) \
00644 ({ \
00645 AdmError **__err = (ERROR); \
00646 AdmData *__data; \
00647 __data = AdmData_getPrev((DATA), (WRAP), __err); \
00648 if (__data != NULL) \
00649 AdmData_unref(__data, __err); \
00650 __data; \
00651 })
00652
00660 AdmData * AdmData_getNext (AdmData *data,
00661 int wrap,
00662 AdmError **error);
00663 #define AdmData_getNext_b(DATA, WRAP, ERROR) \
00664 ({ \
00665 AdmError **__err = (ERROR); \
00666 AdmData *__data; \
00667 __data = AdmData_getNext((DATA), (WRAP), __err); \
00668 if (__data != NULL) \
00669 AdmData_unref(__data, __err); \
00670 __data; \
00671 })
00672
00684 AdmContext * AdmData_getContext (AdmData *data,
00685 AdmError **error);
00686 #define AdmData_getContext_b(DATA, ERROR) \
00687 ({ \
00688 AdmError **__err = (ERROR); \
00689 AdmContext *__ctx; \
00690 __ctx = AdmData_getContext((DATA), __err); \
00691 if (__ctx != NULL) \
00692 AdmContext_unref(__ctx, __err); \
00693 __ctx; \
00694 })
00695
00709 AdmData * AdmContext_getDataByPath (AdmContext *context,
00710 const char *path,
00711 AdmError **error);
00712 #define AdmContext_getDataByPath_b(CONTEXT, PATH, ERROR) \
00713 ({ \
00714 AdmError **__err = (ERROR); \
00715 AdmData *__data; \
00716 __data = AdmContext_getDataByPath((CONTEXT), (PATH), __err); \
00717 if (__data != NULL) \
00718 AdmData_unref(__data, __err); \
00719 __data; \
00720 })
00721
00722
00733 AdmDataType AdmData_getType (AdmData *data,
00734 AdmError **error);
00735
00747 AdmData * AdmData_ref (AdmData *data,
00748 AdmError **error);
00749
00762 void AdmData_unref (AdmData *data,
00763 AdmError **error);
00764
00780 int AdmData_isAlive (AdmData *data,
00781 AdmError **error);
00782
00796 int AdmData_unlink (AdmData *data,
00797 AdmError **error);
00798
00809 int AdmData_validName (const char *name);
00810
00826 AdmRefStr * AdmData_getName (AdmData *data,
00827 AdmError **error);
00828
00843 int AdmData_setName (AdmData *data,
00844 const char *name,
00845 AdmError **error);
00846
00863 AdmRefStr * AdmData_getSource (AdmData *data,
00864 AdmError **error);
00865
00880 int AdmData_setSource (AdmData *data,
00881 const char *source,
00882 AdmError **error);
00883
00895 int AdmData_isProtected (AdmData *data,
00896 AdmError **error);
00897
00913 int AdmData_setProtected (AdmData *data,
00914 int state,
00915 AdmError **error);
00916
00917
00918
00930 int AdmList_isAnonymous (AdmList *list,
00931 AdmError **error);
00932
00949 int AdmList_setAnonymous (AdmList *list,
00950 int state,
00951 AdmError **error);
00952
00964 int AdmList_isAtomic (AdmList *list,
00965 AdmError **error);
00966
00982 int AdmList_setAtomic (AdmList *list,
00983 int state,
00984 AdmError **error);
00985
00997 int AdmList_isPrepend (AdmList *list,
00998 AdmError **error);
00999
01015 int AdmList_setPrepend (AdmList *list,
01016 int state,
01017 AdmError **error);
01018
01019
01020
01032 unsigned int AdmList_getNumData (AdmList *list,
01033 AdmError **error);
01034
01048 AdmData * AdmList_getDataByIndex (AdmList *list,
01049 unsigned int index,
01050 AdmError **error);
01051 #define AdmList_getDataByIndex_b(LIST, INDEX, ERROR) \
01052 ({ \
01053 AdmError **__err = (ERROR); \
01054 AdmData *__data; \
01055 __data = AdmList_getDataByIndex((LIST), (INDEX), __err); \
01056 if (__data != NULL) \
01057 AdmData_unref(__data, __err); \
01058 __data; \
01059 })
01060
01074 AdmData * AdmList_getDataByName (AdmList *list,
01075 const char *name,
01076 AdmError **error);
01077 #define AdmList_getDataByName_b(LIST, NAME, ERROR) \
01078 ({ \
01079 AdmError **__err = (ERROR); \
01080 AdmData *__data; \
01081 __data = AdmList_getDataByName((LIST), (NAME), __err); \
01082 if (__data != NULL) \
01083 AdmData_unref(__data, __err); \
01084 __data; \
01085 })
01086
01100 AdmData * AdmList_getDataByPath (AdmList *list,
01101 const char *path,
01102 AdmError **error);
01103 #define AdmList_getDataByPath_b(LIST, PATH, ERROR) \
01104 ({ \
01105 AdmError **__err = (ERROR); \
01106 AdmData *__data; \
01107 __data = AdmList_getDataByPath((LIST), (PATH), __err); \
01108 if (__data != NULL) \
01109 AdmData_unref(__data, __err); \
01110 __data; \
01111 })
01112
01133 AdmData * AdmList_addData (AdmList *list,
01134 AdmDataType type,
01135 const char *name,
01136 AdmError **error);
01137 #define AdmList_addData_b(LIST, TYPE, NAME, ERROR) \
01138 ({ \
01139 AdmError **__err = (ERROR); \
01140 AdmData *__data; \
01141 __data = AdmList_addData((LIST), (TYPE), (NAME), __err); \
01142 if (__data != NULL) \
01143 AdmData_unref(__data, __err); \
01144 __data; \
01145 })
01146
01161 int AdmList_moveData (AdmList *list,
01162 AdmData *data,
01163 unsigned int index,
01164 AdmError **error);
01165
01180 AdmData * AdmList_copyData (AdmList *list,
01181 AdmData *data,
01182 AdmError **error);
01183 #define AdmList_copyData_b(LIST, DATA, ERROR) \
01184 ({ \
01185 AdmError **__err = (ERROR); \
01186 AdmData *__data; \
01187 __data = AdmList_copyData((LIST), (DATA), __err); \
01188 if (__data != NULL) \
01189 AdmData_unref(__data, __err); \
01190 __data; \
01191 })
01192
01208 AdmData * AdmList_renameCopyData (AdmList *list,
01209 AdmData *data,
01210 const char *name,
01211 AdmError **error);
01212 #define AdmList_renameCopyData_b(LIST, DATA, NAME, ERROR) \
01213 ({ \
01214 AdmError **__err = (ERROR); \
01215 AdmData *__data; \
01216 __data = AdmList_renameCopyData((LIST), (DATA), (NAME), __err); \
01217 if (__data != NULL) \
01218 AdmData_unref(__data, __err); \
01219 __data; \
01220 })
01221
01233 unsigned int AdmData_getPos (AdmData *data,
01234 AdmError **error);
01235
01236
01237
01247 int AdmInt_getValue (AdmInt *int_scalar,
01248 AdmError **error);
01249
01260 int AdmInt_setValue (AdmInt *int_scalar,
01261 int value,
01262 AdmError **error);
01263
01273 double AdmFloat_getValue (AdmFloat *float_scalar,
01274 AdmError **error);
01275
01286 int AdmFloat_setValue (AdmFloat *float_scalar,
01287 double value,
01288 AdmError **error);
01289
01299 int AdmBool_getValue (AdmBool *bool_scalar,
01300 AdmError **error);
01301
01312 int AdmBool_setValue (AdmBool *bool_scalar,
01313 int value,
01314 AdmError **error);
01315
01332 AdmRefStr * AdmString_getValue (AdmString *string_scalar,
01333 AdmError **error);
01334
01346 int AdmString_setValue (AdmString *string_scalar,
01347 const char *value,
01348 AdmError **error);
01349
01361 AdmRefStr * AdmBase64_getValue (AdmBase64 *base64_scalar,
01362 AdmError **error);
01363
01374 int AdmBase64_setValue (AdmBase64 *base64_scalar,
01375 const char *value,
01376 AdmError **error);
01389 size_t AdmBase64_getBinValue (AdmBase64 *base64_scalar,
01390 void **value,
01391 AdmError **error);
01403 int AdmBase64_setBinValue (AdmBase64 *base64_scalar,
01404 const void *value,
01405 size_t size,
01406 AdmError **error);
01407
01421 AdmRefStr * AdmCopy_getValue (AdmCopy *copy_scalar,
01422 AdmError **error);
01423
01434 int AdmCopy_setValue (AdmCopy *copy_scalar,
01435 const char *value,
01436 AdmError **error);
01437
01438
01439 typedef struct AdmBlackBox AdmBlackBox;
01440
01441
01448 AdmRefStr * AdmBlackBox_getCacheDir (AdmError **error);
01449
01457 int AdmBlackBox_setCacheDir (const char *path,
01458 AdmError **error);
01459
01460 AdmBlackBox *AdmBlackBox_getBox (AdmList *box_cfg,
01461 AdmError **error);
01462
01463 typedef struct {
01464 unsigned char array[1];
01465 } adm_bb_cap_t;
01474 adm_bb_cap_t AdmBlackBox_caps (AdmBlackBox *box,
01475 AdmError **error);
01476 #define ADM_BBCAP_SUP_WRITE(CAP) ((CAP).array[0] & (1 << 0))
01477 #define ADM_BBCAP_SUP_READ(CAP) ((CAP).array[0] & (1 << 1))
01478 #define ADM_BBCAP_SUP_LISTSERIAL(CAP) ((CAP).array[0] & (1 << 2))
01479 #define ADM_BBCAP_SUP_READSERIAL(CAP) ((CAP).array[0] & (1 << 3))
01480 #define ADM_BBCAP_CACHED(CAP) ((CAP).array[0] & (1 << 4))
01481
01489 void AdmBlackBox_ref (AdmBlackBox *box,
01490 AdmError **error);
01491
01499 void AdmBlackBox_unref (AdmBlackBox *box,
01500 AdmError **error);
01501
01512 AdmContext * AdmBlackBox_read (AdmBlackBox *box,
01513 AdmError **error);
01514
01533 int AdmBlackBox_listSerial (AdmBlackBox *box,
01534 unsigned int *array,
01535 unsigned int array_len,
01536 unsigned int top_serial,
01537 AdmError **error);
01538
01549 AdmContext * AdmBlackBox_readSerial (AdmBlackBox *box,
01550 unsigned int serial,
01551 AdmError **error);
01552
01563 int AdmBlackBox_write (AdmBlackBox *box,
01564 AdmContext *context,
01565 AdmError **error);
01566
01579 unsigned int AdmBlackBox_getMark (AdmBlackBox *box,
01580 const char *mark,
01581 AdmError **error);
01606 int AdmBlackBox_setMark (AdmBlackBox *box,
01607 const char *mark,
01608 AdmError **error);
01609
01619 int AdmBlackBox_clearMark (AdmBlackBox *box,
01620 const char *mark,
01621 AdmError **error);
01622
01623
01630 AdmRefStr * AdmSwitchboard_getSwbDir (AdmError **error);
01631
01639 int AdmSwitchboard_setSwbDir (const char *path,
01640 AdmError **error);
01641
01642 int AdmSwitchboard_markNsp (const char *namespace,
01643 const char *subspace,
01644 const char *mark,
01645 AdmError **error);
01646
01647 int AdmSwitchboard_markNspWithConfig (
01648 AdmList *namespace_cfg,
01649 const char *subspace,
01650 const char *mark,
01651 AdmError **error);
01652
01653 int AdmSwitchboard_checkNspMark (const char *namespace,
01654 const char *subspace,
01655 const char *mark,
01656 AdmError **error);
01657
01658 int AdmSwitchboard_checkNspMarkWithConfig (
01659 AdmList *namespace_cfg,
01660 const char *subspace,
01661 const char *mark,
01662 AdmError **error);
01663
01671 AdmContext *AdmSwitchboard_readNsp (const char *namespace,
01672 const char *subspace,
01673 unsigned int depth,
01674 AdmError **error);
01675
01676 AdmContext *AdmSwitchboard_readNspWithConfig (
01677 AdmList *namespace_cfg,
01678 const char *subspace,
01679 unsigned int depth,
01680 AdmError **error);
01681
01689 int AdmSwitchboard_writeNsp (const char *namespace,
01690 const char *subspace,
01691 AdmContext *context,
01692 AdmError **error);
01693
01694 int AdmSwitchboard_writeNspWithConfig (
01695 AdmList *namespace_cfg,
01696 const char *subspace,
01697 AdmContext *context,
01698 AdmError **error);
01699
01706 AdmContext *AdmSwitchboard_readNspCtx (const char *namespace,
01707 AdmError **error);
01708
01719 int AdmSwitchboard_writeNspCtx (const char *namespace,
01720 AdmContext *namespace_ctx,
01721 int mode,
01722 uid_t uid,
01723 gid_t gid,
01724 AdmError **error);
01725
01731 AdmList *AdmSwitchboard_getNspCfg (
01732 AdmContext *namespace_ctx,
01733 const char *namespace,
01734 AdmError **error);
01735 #define AdmSwitchboard_getNspCfg_b(CTX, NAMESPACE, ERROR) \
01736 ({ \
01737 AdmError **__err = (ERROR); \
01738 AdmList *__list; \
01739 __list = AdmSwitchboard_getNspCfg((CTX), (NAMESPACE), __err); \
01740 if (__list != NULL) \
01741 AdmData_unref((AdmData *) __list, __err); \
01742 __list; \
01743 })
01744
01751 AdmList *AdmSwitchboard_getSubspCfg (
01752 AdmList *namespace_cfg,
01753 const char *subspace,
01754 AdmError **error);
01755 #define AdmSwitchboard_getSubspCfg_b(CTX, SUBSPACE, ERROR) \
01756 ({ \
01757 AdmError **__err = (ERROR); \
01758 AdmList *__list; \
01759 __list = AdmSwitchboard_getSubspCfg((CTX), (SUBSPACE), __err); \
01760 if (__list != NULL) \
01761 AdmData_unref((AdmData *) __list, __err); \
01762 __list; \
01763 })
01764
01765
01771 AdmBlackBox *AdmSwitchboard_getBox (
01772 AdmList *subspace_cfg,
01773 const char *box_name,
01774 AdmError **error);
01775
01776 #endif