From: Lee Duncan <[email protected]> This move allows other clients (like open-iscsi) to access the include files they need to use libisns.a. --- Makefile.in | 2 +- attrs.c | 6 +- attrs.h | 262 ----------------- authblock.c | 8 +- bitvector.c | 4 +- buffer.c | 2 +- callback.c | 6 +- client.c | 4 +- config.c | 6 +- db-file.c | 6 +- db-policy.c | 4 +- db.c | 4 +- db.h | 2 +- dd.c | 8 +- deregister.c | 8 +- domain.c | 4 +- entity.c | 4 +- error.c | 2 +- esi.c | 8 +- export.c | 8 +- getnext.c | 8 +- include/libisns/attrs.h | 262 +++++++++++++++++ include/libisns/isns-proto.h | 259 +++++++++++++++++ include/libisns/isns.h | 676 +++++++++++++++++++++++++++++++++++++++++++ include/libisns/message.h | 196 +++++++++++++ include/libisns/paths.h | 24 ++ include/libisns/source.h | 32 ++ include/libisns/types.h | 57 ++++ include/libisns/util.h | 288 ++++++++++++++++++ isns-proto.h | 259 ----------------- isns.h | 676 ------------------------------------------- isnsadm.c | 8 +- isnsd.c | 6 +- isnsdd.c | 10 +- local.c | 12 +- logging.c | 2 +- mdebug.c | 2 +- message.c | 8 +- message.h | 196 ------------- objects.c | 8 +- objects.h | 4 +- parser.c | 2 +- paths.h | 24 -- pidfile.c | 2 +- pki.c | 4 +- policy.c | 6 +- portal-group.c | 6 +- query.c | 8 +- register.c | 8 +- relation.c | 4 +- scn.c | 8 +- scope.c | 8 +- security.c | 6 +- security.h | 2 +- server.c | 6 +- simple.c | 8 +- slp.c | 4 +- socket.c | 4 +- socket.h | 4 +- source.h | 32 -- storage-node.c | 4 +- sysdep-unix.c | 4 +- tags.c | 6 +- tests/pauw1.c | 8 +- tests/pauw2.c | 8 +- tests/pauw3.c | 8 +- tests/pauw4.c | 8 +- timer.c | 4 +- types.h | 57 ---- util.c | 2 +- util.h | 288 ------------------ vendor.c | 6 +- vendor.h | 2 +- 73 files changed, 1951 insertions(+), 1951 deletions(-) delete mode 100644 attrs.h create mode 100644 include/libisns/attrs.h create mode 100644 include/libisns/isns-proto.h create mode 100644 include/libisns/isns.h create mode 100644 include/libisns/message.h create mode 100644 include/libisns/paths.h create mode 100644 include/libisns/source.h create mode 100644 include/libisns/types.h create mode 100644 include/libisns/util.h delete mode 100644 isns-proto.h delete mode 100644 isns.h delete mode 100644 message.h delete mode 100644 paths.h delete mode 100644 source.h delete mode 100644 types.h delete mode 100644 util.h
diff --git a/Makefile.in b/Makefile.in index 270c67fc2316..674ff55204dc 100644 --- a/Makefile.in +++ b/Makefile.in @@ -15,7 +15,7 @@ SYSTEMDDIR = $(DESTDIR)$(systemddir) CC = @CC@ CPPFLAGS= @CPPFLAGS@ -CFLAGS = @CFLAGS@ -I. +CFLAGS = @CFLAGS@ -I. -Iinclude LDFLAGS = @LDFLAGS@ INSTALL = @INSTALL@ diff --git a/attrs.c b/attrs.c index 12517c11bfed..ac9b5249a25d 100644 --- a/attrs.c +++ b/attrs.c @@ -7,10 +7,10 @@ #include <stdlib.h> #include <string.h> #include <arpa/inet.h> -#include "util.h" +#include <libisns/util.h> #include "vendor.h" -#include "attrs.h" -#include "isns.h" +#include <libisns/attrs.h> +#include <libisns/isns.h> /* Implementation limit - sanity checking */ #define ISNS_ATTR_MAX_LEN 8192 diff --git a/attrs.h b/attrs.h deleted file mode 100644 index 1d3667efb2dc..000000000000 --- a/attrs.h +++ /dev/null @@ -1,262 +0,0 @@ -/* - * iSNS object attributes - * - * Copyright (C) 2007 Olaf Kirch <[email protected]> - */ - -#ifndef ISNS_ATTRS_H -#define ISNS_ATTRS_H - -#include <netinet/in.h> -#include "buffer.h" -#include "isns.h" - -/* - * Type identifier - */ -enum { - ISNS_ATTR_TYPE_NIL = 0, - ISNS_ATTR_TYPE_OPAQUE, - ISNS_ATTR_TYPE_STRING, - ISNS_ATTR_TYPE_INT32, - ISNS_ATTR_TYPE_UINT32, - ISNS_ATTR_TYPE_UINT64, - ISNS_ATTR_TYPE_IPADDR, - ISNS_ATTR_TYPE_RANGE16, - - __ISNS_ATTR_TYPE_BUILTIN_MAX -}; - -/* - * Union holding an attribute value - */ -typedef struct isns_value { - const struct isns_attr_type * iv_type; - - /* Data is stuffed into an anonymous union */ - union { - uint32_t iv_nil; - struct __isns_opaque { - void * ptr; - size_t len; - } iv_opaque; - char * iv_string; - int32_t iv_int32; - uint32_t iv_uint32; - uint64_t iv_uint64; - struct in6_addr iv_ipaddr; - struct { - uint16_t min, max; - } iv_range; - }; -} isns_value_t; - -#define __ISNS_ATTRTYPE(type) isns_attr_type_##type -#define __ISNS_MEMBER(type) iv_##type -#define ISNS_VALUE_INIT(type, value) \ - (isns_value_t) { .iv_type = &__ISNS_ATTRTYPE(type), \ - { .__ISNS_MEMBER(type) = (value) } } - -#define isns_attr_initialize(attrp, tag, type, value) do { \ - isns_attr_t *__attr = (attrp); \ - uint32_t __tag = (tag); \ - __attr->ia_users = 1; \ - __attr->ia_tag_id = (__tag); \ - __attr->ia_tag = isns_tag_type_by_id(__tag); \ - __attr->ia_value = ISNS_VALUE_INIT(type, value); \ - } while (0) -#define ISNS_ATTR_INIT(tag, type, value) (isns_attr_t) { \ - .ia_users = 1, \ - .ia_tag_id = (tag), \ - .ia_tag = isns_tag_type_by_id(tag), \ - .ia_value = ISNS_VALUE_INIT(type, value) \ - } - -/* - * Attribute type - */ -typedef struct isns_attr_type { - uint32_t it_id; - const char * it_name; - - void (*it_assign)(isns_value_t *, const isns_value_t *); - int (*it_set)(isns_value_t *, const void *); - int (*it_get)(isns_value_t *, void *); - int (*it_match)(const isns_value_t *, const isns_value_t *); - int (*it_compare)(const isns_value_t *, const isns_value_t *); - int (*it_encode)(buf_t *, const isns_value_t *); - int (*it_decode)(buf_t *, size_t, isns_value_t *); - void (*it_destroy)(isns_value_t *); - void (*it_print)(const isns_value_t *, char *, size_t); - int (*it_parse)(isns_value_t *, const char *); -} isns_attr_type_t; - -/* - * Tag info: for each tag, provides a printable name, - * and the attribute type associated with it. - */ -struct isns_tag_type { - uint32_t it_id; - const char * it_name; - unsigned int it_multiple : 1, - it_readonly : 1; - isns_attr_type_t *it_type; - - int (*it_validate)(const isns_value_t *, - const isns_policy_t *); - void (*it_print)(const isns_value_t *, char *, size_t); - int (*it_parse)(isns_value_t *, const char *); - const char * (*it_help)(void); -}; - -/* - * Attribute - */ -struct isns_attr { - unsigned int ia_users; - uint32_t ia_tag_id; - const isns_tag_type_t * ia_tag; - isns_value_t ia_value; -}; - -extern isns_attr_type_t isns_attr_type_nil; -extern isns_attr_type_t isns_attr_type_opaque; -extern isns_attr_type_t isns_attr_type_string; -extern isns_attr_type_t isns_attr_type_int32; -extern isns_attr_type_t isns_attr_type_uint32; -extern isns_attr_type_t isns_attr_type_uint64; -extern isns_attr_type_t isns_attr_type_ipaddr; -extern isns_attr_type_t isns_attr_type_range16; - -extern isns_attr_t * isns_attr_alloc(uint32_t, const isns_tag_type_t *, - const isns_value_t *); - -extern void isns_attr_list_append_value(isns_attr_list_t *, - uint32_t tag, const isns_tag_type_t *, - const isns_value_t *); -extern void isns_attr_list_update_value(isns_attr_list_t *, - uint32_t tag, const isns_tag_type_t *, - const isns_value_t *); -extern int isns_attr_list_get_value(const isns_attr_list_t *, - uint32_t tag, - isns_value_t *); -extern int isns_attr_list_get_uint32(const isns_attr_list_t *, - uint32_t tag, - uint32_t *); -extern int isns_attr_list_get_string(const isns_attr_list_t *, - uint32_t tag, - const char **); - -extern int isns_attr_list_validate(const isns_attr_list_t *, - const isns_policy_t *, - unsigned int function); -extern int isns_attr_validate(const isns_attr_t *, - const isns_policy_t *); - -extern void isns_attr_list_prune(isns_attr_list_t *, - const uint32_t *, - unsigned int); -extern int isns_attr_list_remove_member(isns_attr_list_t *, - const isns_attr_t *, - const uint32_t *); -extern void isns_attr_list_update_attr(isns_attr_list_t *, - const isns_attr_t *); - -extern int isns_attr_decode(buf_t *, isns_attr_t **); -extern int isns_attr_encode(buf_t *, const isns_attr_t *); - -extern int isns_attr_list_decode(buf_t *, isns_attr_list_t *); -extern int isns_attr_list_decode_delimited(buf_t *, isns_attr_list_t *); -extern int isns_attr_list_encode(buf_t *, const isns_attr_list_t *); -extern int isns_encode_delimiter(buf_t *); - -extern const isns_tag_type_t *isns_tag_type_by_id(unsigned int); -extern const isns_attr_type_t *isns_attr_type_by_id(unsigned int); - -typedef struct isns_quick_attr_list isns_quick_attr_list_t; -struct isns_quick_attr_list { - isns_attr_list_t iqa_list; - isns_attr_t * iqa_attrs[1]; - isns_attr_t iqa_attr; -}; -#define ISNS_QUICK_ATTR_LIST_DECLARE(qlist, tag, type, value) \ - isns_quick_attr_list_t qlist = { \ - .iqa_list = (isns_attr_list_t) { \ - .ial_data = qlist.iqa_attrs, \ - .ial_count = 1 \ - }, \ - .iqa_attrs = { &qlist.iqa_attr }, \ - .iqa_attr = ISNS_ATTR_INIT(tag, type, value), \ - } - -/* - * The following is used to chop up an incoming attr list as - * given in eg. a DevAttrReg message into separate chunks, - * following the ordering constraints laid out in the RFC. - * - * isns_attr_list_scanner_init initializes the scanner state. - * - * isns_attr_list_scanner_next advances to the next object in - * the list, returning the keys and attrs for one object. - * - * The isns_attr_list_scanner struct should really be opaque, but - * we put it here so you can declare a scanner variable on the - * stack. - */ -struct isns_attr_list_scanner { - isns_source_t * source; - isns_policy_t * policy; - isns_object_t * key_obj; - isns_attr_list_t orig_attrs; - unsigned int pos; - - isns_attr_list_t keys; - isns_attr_list_t attrs; - isns_object_template_t *tmpl; - unsigned int num_key_attrs; - - unsigned int entities; - - uint32_t pgt_next_attr; - uint32_t pgt_value; - const char * pgt_iscsi_name; - isns_portal_info_t pgt_portal_info; - isns_object_t * pgt_base_object; - - unsigned int index_acceptable : 1; -}; - -extern void isns_attr_list_scanner_init(struct isns_attr_list_scanner *, - isns_object_t *key_obj, - const isns_attr_list_t *attrs); -extern int isns_attr_list_scanner_next(struct isns_attr_list_scanner *); -extern void isns_attr_list_scanner_destroy(struct isns_attr_list_scanner *); - -/* - * The following is used to parse attribute lists given as - * a bunch of strings. - */ -struct isns_attr_list_parser { - struct isns_tag_prefix *prefix; - const char * default_port; - - unsigned int multi_type_permitted : 1, - nil_permitted : 1; - - isns_attr_t * (*load_key)(const char *); - isns_attr_t * (*generate_key)(void); -}; - -extern int isns_attr_list_split(char *line, char **argv, unsigned int argc_max); -extern void isns_attr_list_parser_init(struct isns_attr_list_parser *, - isns_object_template_t *); -extern int isns_parse_attrs(unsigned int, char **, - isns_attr_list_t *, struct isns_attr_list_parser *); -extern int isns_parse_query_attrs(unsigned int, char **, - isns_attr_list_t *, isns_attr_list_t *, - struct isns_attr_list_parser *); -extern void isns_attr_list_parser_help(struct isns_attr_list_parser *); -extern isns_object_template_t *isns_attr_list_parser_context(const struct isns_attr_list_parser *); -extern int isns_print_attrs(isns_object_t *, char **, unsigned int); - -#endif /* ISNS_ATTRS_H */ diff --git a/authblock.c b/authblock.c index 76d35b4bfe11..df9e21c5c0ee 100644 --- a/authblock.c +++ b/authblock.c @@ -6,10 +6,10 @@ #include <stdlib.h> #include <string.h> -#include "isns.h" -#include "attrs.h" -#include "message.h" -#include "util.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> +#include <libisns/message.h> +#include <libisns/util.h> /* We impose an artificial limit on the size of * the size of the authenticator diff --git a/bitvector.c b/bitvector.c index 9d66276d9ac8..00ef44a41b54 100644 --- a/bitvector.c +++ b/bitvector.c @@ -7,8 +7,8 @@ #include <stdlib.h> #include <string.h> -#include "isns.h" -#include "util.h" +#include <libisns/isns.h> +#include <libisns/util.h> struct isns_bitvector { unsigned int ib_count; diff --git a/buffer.c b/buffer.c index 279ab7617590..503d4ce48839 100644 --- a/buffer.c +++ b/buffer.c @@ -12,7 +12,7 @@ #include <unistd.h> #include <netinet/in.h> /* ntohl&htonl */ #include "buffer.h" -#include "util.h" /* htonll */ +#include <libisns/util.h> /* htonll */ static int buf_drain(buf_t *bp); diff --git a/callback.c b/callback.c index ecdabd7de3b1..979834366147 100644 --- a/callback.c +++ b/callback.c @@ -6,11 +6,11 @@ #include <stdlib.h> #include <string.h> -#include "isns.h" +#include <libisns/isns.h> #include "objects.h" #include "vendor.h" -#include "attrs.h" -#include "util.h" +#include <libisns/attrs.h> +#include <libisns/util.h> typedef struct isns_object_notifier isns_object_notifier_t; struct isns_object_notifier { diff --git a/client.c b/client.c index 501f716eca8a..e0f75c959257 100644 --- a/client.c +++ b/client.c @@ -12,9 +12,9 @@ #include <unistd.h> #include "config.h" -#include "isns.h" +#include <libisns/isns.h> #include "security.h" -#include "util.h" +#include <libisns/util.h> #include "internal.h" static isns_client_t * diff --git a/config.c b/config.c index 745d8ac5ceaf..9ad71cf7a047 100644 --- a/config.c +++ b/config.c @@ -8,9 +8,9 @@ #include <unistd.h> #include <ctype.h> -#include "isns.h" -#include "util.h" -#include "paths.h" +#include <libisns/isns.h> +#include <libisns/util.h> +#include <libisns/paths.h> /* * iSNS configuration diff --git a/db-file.c b/db-file.c index 98c08dbeb416..27e2b5acdb00 100644 --- a/db-file.c +++ b/db-file.c @@ -13,10 +13,10 @@ #include <errno.h> #include <limits.h> -#include "isns.h" +#include <libisns/isns.h> #include "objects.h" -#include "message.h" -#include "util.h" +#include <libisns/message.h> +#include <libisns/util.h> #include "db.h" #define DBE_FILE_VERSION 1 diff --git a/db-policy.c b/db-policy.c index 1095cf612681..bf30a18874ea 100644 --- a/db-policy.c +++ b/db-policy.c @@ -10,11 +10,11 @@ #include "config.h" #include <openssl/pem.h> #include <openssl/err.h> -#include "isns.h" +#include <libisns/isns.h> #include "security.h" #include "objects.h" #include "vendor.h" -#include "util.h" +#include <libisns/util.h> /* * DB keystore diff --git a/db.c b/db.c index c66dfbb232e4..04b7882821ba 100644 --- a/db.c +++ b/db.c @@ -9,10 +9,10 @@ #include <time.h> #include <stdarg.h> -#include "isns.h" +#include <libisns/isns.h> #include "objects.h" #include "db.h" -#include "util.h" +#include <libisns/util.h> enum { IDT_INSERT, diff --git a/db.h b/db.h index 148d93052f94..e0fe4778b9bb 100644 --- a/db.h +++ b/db.h @@ -7,7 +7,7 @@ #ifndef ISNS_DB_H #define ISNS_DB_H -#include "attrs.h" +#include <libisns/attrs.h> typedef struct isns_db_backend isns_db_backend_t; diff --git a/dd.c b/dd.c index b88d1e7638b4..d15b277ab8e5 100644 --- a/dd.c +++ b/dd.c @@ -13,12 +13,12 @@ #include <stdlib.h> #include <string.h> #include "config.h" -#include "isns.h" -#include "attrs.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> #include "objects.h" -#include "message.h" +#include <libisns/message.h> #include "security.h" -#include "util.h" +#include <libisns/util.h> #include "db.h" #define DD_DEBUG diff --git a/deregister.c b/deregister.c index 29c0f43e87ed..7fe1dd061ee4 100644 --- a/deregister.c +++ b/deregister.c @@ -7,12 +7,12 @@ #include <stdlib.h> #include <string.h> #include "config.h" -#include "isns.h" -#include "attrs.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> #include "objects.h" -#include "message.h" +#include <libisns/message.h> #include "security.h" -#include "util.h" +#include <libisns/util.h> #include "db.h" extern isns_source_t * isns_server_source; diff --git a/domain.c b/domain.c index 3b848ac8f229..fbacb2faab49 100644 --- a/domain.c +++ b/domain.c @@ -7,9 +7,9 @@ #include <stdlib.h> #include <string.h> #include <time.h> -#include "isns.h" +#include <libisns/isns.h> #include "objects.h" -#include "util.h" +#include <libisns/util.h> static int __isns_default_dd_rebuild(isns_object_t *obj, isns_db_t *db) diff --git a/entity.c b/entity.c index cd45e1f2969a..b97394ab933b 100644 --- a/entity.c +++ b/entity.c @@ -7,9 +7,9 @@ #include <stdlib.h> #include <string.h> #include <time.h> -#include "isns.h" +#include <libisns/isns.h> #include "objects.h" -#include "util.h" +#include <libisns/util.h> /* * Create a network entity diff --git a/error.c b/error.c index 0d365e8ac33b..f36cd18b253c 100644 --- a/error.c +++ b/error.c @@ -4,7 +4,7 @@ * Copyright (C) 2007 Olaf Kirch <[email protected]> */ -#include "isns.h" +#include <libisns/isns.h> const char * isns_strerror(enum isns_status status) diff --git a/esi.c b/esi.c index d1e04415a24e..f94831cb0367 100644 --- a/esi.c +++ b/esi.c @@ -8,12 +8,12 @@ #include <string.h> #include <time.h> #include "config.h" -#include "isns.h" -#include "attrs.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> #include "objects.h" -#include "message.h" +#include <libisns/message.h> #include "security.h" -#include "util.h" +#include <libisns/util.h> #include "db.h" #define ESI_RETRANS_TIMEOUT 60 diff --git a/export.c b/export.c index 4a9d776cd2b1..507f9af7ef70 100644 --- a/export.c +++ b/export.c @@ -15,13 +15,13 @@ #include <ctype.h> #include "config.h" -#include "isns.h" -#include "util.h" +#include <libisns/isns.h> +#include <libisns/util.h> #include "vendor.h" -#include "attrs.h" +#include <libisns/attrs.h> #include "security.h" #include "objects.h" -#include "paths.h" +#include <libisns/paths.h> #define MAX_ALIASES 4 diff --git a/getnext.c b/getnext.c index 4969f7aa6d72..2b3b3fe5f959 100644 --- a/getnext.c +++ b/getnext.c @@ -7,13 +7,13 @@ #include <stdlib.h> #include <string.h> #include "config.h" -#include "isns.h" -#include "attrs.h" -#include "message.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> +#include <libisns/message.h> #include "security.h" #include "objects.h" #include "db.h" -#include "util.h" +#include <libisns/util.h> /* * Create a GetNext query, and set the source name diff --git a/include/libisns/attrs.h b/include/libisns/attrs.h new file mode 100644 index 000000000000..d137886cf2de --- /dev/null +++ b/include/libisns/attrs.h @@ -0,0 +1,262 @@ +/* + * iSNS object attributes + * + * Copyright (C) 2007 Olaf Kirch <[email protected]> + */ + +#ifndef ISNS_ATTRS_H +#define ISNS_ATTRS_H + +#include <netinet/in.h> +#include "buffer.h" +#include <libisns/isns.h> + +/* + * Type identifier + */ +enum { + ISNS_ATTR_TYPE_NIL = 0, + ISNS_ATTR_TYPE_OPAQUE, + ISNS_ATTR_TYPE_STRING, + ISNS_ATTR_TYPE_INT32, + ISNS_ATTR_TYPE_UINT32, + ISNS_ATTR_TYPE_UINT64, + ISNS_ATTR_TYPE_IPADDR, + ISNS_ATTR_TYPE_RANGE16, + + __ISNS_ATTR_TYPE_BUILTIN_MAX +}; + +/* + * Union holding an attribute value + */ +typedef struct isns_value { + const struct isns_attr_type * iv_type; + + /* Data is stuffed into an anonymous union */ + union { + uint32_t iv_nil; + struct __isns_opaque { + void * ptr; + size_t len; + } iv_opaque; + char * iv_string; + int32_t iv_int32; + uint32_t iv_uint32; + uint64_t iv_uint64; + struct in6_addr iv_ipaddr; + struct { + uint16_t min, max; + } iv_range; + }; +} isns_value_t; + +#define __ISNS_ATTRTYPE(type) isns_attr_type_##type +#define __ISNS_MEMBER(type) iv_##type +#define ISNS_VALUE_INIT(type, value) \ + (isns_value_t) { .iv_type = &__ISNS_ATTRTYPE(type), \ + { .__ISNS_MEMBER(type) = (value) } } + +#define isns_attr_initialize(attrp, tag, type, value) do { \ + isns_attr_t *__attr = (attrp); \ + uint32_t __tag = (tag); \ + __attr->ia_users = 1; \ + __attr->ia_tag_id = (__tag); \ + __attr->ia_tag = isns_tag_type_by_id(__tag); \ + __attr->ia_value = ISNS_VALUE_INIT(type, value); \ + } while (0) +#define ISNS_ATTR_INIT(tag, type, value) (isns_attr_t) { \ + .ia_users = 1, \ + .ia_tag_id = (tag), \ + .ia_tag = isns_tag_type_by_id(tag), \ + .ia_value = ISNS_VALUE_INIT(type, value) \ + } + +/* + * Attribute type + */ +typedef struct isns_attr_type { + uint32_t it_id; + const char * it_name; + + void (*it_assign)(isns_value_t *, const isns_value_t *); + int (*it_set)(isns_value_t *, const void *); + int (*it_get)(isns_value_t *, void *); + int (*it_match)(const isns_value_t *, const isns_value_t *); + int (*it_compare)(const isns_value_t *, const isns_value_t *); + int (*it_encode)(buf_t *, const isns_value_t *); + int (*it_decode)(buf_t *, size_t, isns_value_t *); + void (*it_destroy)(isns_value_t *); + void (*it_print)(const isns_value_t *, char *, size_t); + int (*it_parse)(isns_value_t *, const char *); +} isns_attr_type_t; + +/* + * Tag info: for each tag, provides a printable name, + * and the attribute type associated with it. + */ +struct isns_tag_type { + uint32_t it_id; + const char * it_name; + unsigned int it_multiple : 1, + it_readonly : 1; + isns_attr_type_t *it_type; + + int (*it_validate)(const isns_value_t *, + const isns_policy_t *); + void (*it_print)(const isns_value_t *, char *, size_t); + int (*it_parse)(isns_value_t *, const char *); + const char * (*it_help)(void); +}; + +/* + * Attribute + */ +struct isns_attr { + unsigned int ia_users; + uint32_t ia_tag_id; + const isns_tag_type_t * ia_tag; + isns_value_t ia_value; +}; + +extern isns_attr_type_t isns_attr_type_nil; +extern isns_attr_type_t isns_attr_type_opaque; +extern isns_attr_type_t isns_attr_type_string; +extern isns_attr_type_t isns_attr_type_int32; +extern isns_attr_type_t isns_attr_type_uint32; +extern isns_attr_type_t isns_attr_type_uint64; +extern isns_attr_type_t isns_attr_type_ipaddr; +extern isns_attr_type_t isns_attr_type_range16; + +extern isns_attr_t * isns_attr_alloc(uint32_t, const isns_tag_type_t *, + const isns_value_t *); + +extern void isns_attr_list_append_value(isns_attr_list_t *, + uint32_t tag, const isns_tag_type_t *, + const isns_value_t *); +extern void isns_attr_list_update_value(isns_attr_list_t *, + uint32_t tag, const isns_tag_type_t *, + const isns_value_t *); +extern int isns_attr_list_get_value(const isns_attr_list_t *, + uint32_t tag, + isns_value_t *); +extern int isns_attr_list_get_uint32(const isns_attr_list_t *, + uint32_t tag, + uint32_t *); +extern int isns_attr_list_get_string(const isns_attr_list_t *, + uint32_t tag, + const char **); + +extern int isns_attr_list_validate(const isns_attr_list_t *, + const isns_policy_t *, + unsigned int function); +extern int isns_attr_validate(const isns_attr_t *, + const isns_policy_t *); + +extern void isns_attr_list_prune(isns_attr_list_t *, + const uint32_t *, + unsigned int); +extern int isns_attr_list_remove_member(isns_attr_list_t *, + const isns_attr_t *, + const uint32_t *); +extern void isns_attr_list_update_attr(isns_attr_list_t *, + const isns_attr_t *); + +extern int isns_attr_decode(buf_t *, isns_attr_t **); +extern int isns_attr_encode(buf_t *, const isns_attr_t *); + +extern int isns_attr_list_decode(buf_t *, isns_attr_list_t *); +extern int isns_attr_list_decode_delimited(buf_t *, isns_attr_list_t *); +extern int isns_attr_list_encode(buf_t *, const isns_attr_list_t *); +extern int isns_encode_delimiter(buf_t *); + +extern const isns_tag_type_t *isns_tag_type_by_id(unsigned int); +extern const isns_attr_type_t *isns_attr_type_by_id(unsigned int); + +typedef struct isns_quick_attr_list isns_quick_attr_list_t; +struct isns_quick_attr_list { + isns_attr_list_t iqa_list; + isns_attr_t * iqa_attrs[1]; + isns_attr_t iqa_attr; +}; +#define ISNS_QUICK_ATTR_LIST_DECLARE(qlist, tag, type, value) \ + isns_quick_attr_list_t qlist = { \ + .iqa_list = (isns_attr_list_t) { \ + .ial_data = qlist.iqa_attrs, \ + .ial_count = 1 \ + }, \ + .iqa_attrs = { &qlist.iqa_attr }, \ + .iqa_attr = ISNS_ATTR_INIT(tag, type, value), \ + } + +/* + * The following is used to chop up an incoming attr list as + * given in eg. a DevAttrReg message into separate chunks, + * following the ordering constraints laid out in the RFC. + * + * isns_attr_list_scanner_init initializes the scanner state. + * + * isns_attr_list_scanner_next advances to the next object in + * the list, returning the keys and attrs for one object. + * + * The isns_attr_list_scanner struct should really be opaque, but + * we put it here so you can declare a scanner variable on the + * stack. + */ +struct isns_attr_list_scanner { + isns_source_t * source; + isns_policy_t * policy; + isns_object_t * key_obj; + isns_attr_list_t orig_attrs; + unsigned int pos; + + isns_attr_list_t keys; + isns_attr_list_t attrs; + isns_object_template_t *tmpl; + unsigned int num_key_attrs; + + unsigned int entities; + + uint32_t pgt_next_attr; + uint32_t pgt_value; + const char * pgt_iscsi_name; + isns_portal_info_t pgt_portal_info; + isns_object_t * pgt_base_object; + + unsigned int index_acceptable : 1; +}; + +extern void isns_attr_list_scanner_init(struct isns_attr_list_scanner *, + isns_object_t *key_obj, + const isns_attr_list_t *attrs); +extern int isns_attr_list_scanner_next(struct isns_attr_list_scanner *); +extern void isns_attr_list_scanner_destroy(struct isns_attr_list_scanner *); + +/* + * The following is used to parse attribute lists given as + * a bunch of strings. + */ +struct isns_attr_list_parser { + struct isns_tag_prefix *prefix; + const char * default_port; + + unsigned int multi_type_permitted : 1, + nil_permitted : 1; + + isns_attr_t * (*load_key)(const char *); + isns_attr_t * (*generate_key)(void); +}; + +extern int isns_attr_list_split(char *line, char **argv, unsigned int argc_max); +extern void isns_attr_list_parser_init(struct isns_attr_list_parser *, + isns_object_template_t *); +extern int isns_parse_attrs(unsigned int, char **, + isns_attr_list_t *, struct isns_attr_list_parser *); +extern int isns_parse_query_attrs(unsigned int, char **, + isns_attr_list_t *, isns_attr_list_t *, + struct isns_attr_list_parser *); +extern void isns_attr_list_parser_help(struct isns_attr_list_parser *); +extern isns_object_template_t *isns_attr_list_parser_context(const struct isns_attr_list_parser *); +extern int isns_print_attrs(isns_object_t *, char **, unsigned int); + +#endif /* ISNS_ATTRS_H */ diff --git a/include/libisns/isns-proto.h b/include/libisns/isns-proto.h new file mode 100644 index 000000000000..fbc33767ca65 --- /dev/null +++ b/include/libisns/isns-proto.h @@ -0,0 +1,259 @@ +/* + * iSNS protocol definitions + * + * Copyright (C) 2007 Olaf Kirch <[email protected]> + */ + +#ifndef ISNS_PROTO_H +#define ISNS_PROTO_H + +#include <stdint.h> + +struct isns_hdr { + uint16_t i_version; + uint16_t i_function; + uint16_t i_length; + uint16_t i_flags; + uint16_t i_xid; + uint16_t i_seq; +}; + +#define ISNS_VERSION 0x0001 +#define ISNS_MAX_PDU_SIZE 65535 +#define ISNS_DEFAULT_PORT 3205 + +/* + * Values for the i_flags field: + */ +#define ISNS_F_CLIENT 0x8000 +#define ISNS_F_SERVER 0x4000 +#define ISNS_F_AUTHBLK_PRESENT 0x2000 +#define ISNS_F_REPLACE 0x1000 +#define ISNS_F_LAST_PDU 0x0800 +#define ISNS_F_FIRST_PDU 0x0400 + +/* + * Function values + */ +enum isns_function { + ISNS_DEVICE_ATTRIBUTE_REGISTER = 1, + ISNS_DEVICE_ATTRIBUTE_QUERY = 2, + ISNS_DEVICE_GET_NEXT = 3, + ISNS_DEVICE_DEREGISTER = 4, + ISNS_SCN_REGISTER = 5, + ISNS_SCN_DEREGISTER = 6, + ISNS_SCN_EVENT = 7, + ISNS_STATE_CHANGE_NOTIFICATION = 8, + ISNS_DD_REGISTER = 9, + ISNS_DD_DEREGISTER = 10, + ISNS_DDS_REGISTER = 11, + ISNS_DDS_DEREGISTER = 12, + ISNS_ENTITY_STATUS_INQUIRY = 13, + ISNS_HEARTBEAT = 14, +}; + +/* + * iSNS status codes: + */ +enum isns_status { + ISNS_SUCCESS = 0, + ISNS_UNKNOWN_ERROR, + ISNS_MESSAGE_FORMAT_ERROR, + ISNS_INVALID_REGISTRATION, + __ISNS_RESERVED_STATUS, + ISNS_INVALID_QUERY, + ISNS_SOURCE_UNKNOWN, + ISNS_SOURCE_ABSENT, + ISNS_SOURCE_UNAUTHORIZED, + ISNS_NO_SUCH_ENTRY, + ISNS_VERSION_NOT_SUPPORTED, + ISNS_INTERNAL_ERROR, + ISNS_BUSY, + ISNS_OPTION_NOT_UNDERSTOOD, + ISNS_INVALID_UPDATE, + ISNS_MESSAGE_NOT_SUPPORTED, + ISNS_SCN_EVENT_REJECTED, + ISNS_SCN_REGISTRATION_REJECTED, + ISNS_ATTRIBUTE_NOT_IMPLEMENTED, + ISNS_FC_DOMAIN_ID_NOT_AVAILABLE, + ISNS_FC_DOMAIN_ID_NOT_ALLOCATED, + ISNS_ESI_NOT_AVAILABLE, + ISNS_INVALID_DEREGISTRATION, + ISNS_REGISTRATION_FEATURE_NOT_SUPPORTED, +}; + +enum isns_tag { + ISNS_TAG_DELIMITER = 0, + ISNS_TAG_ENTITY_IDENTIFIER = 1, + ISNS_TAG_ENTITY_PROTOCOL = 2, + ISNS_TAG_MGMT_IP_ADDRESS = 3, + ISNS_TAG_TIMESTAMP = 4, + ISNS_TAG_PROTOCOL_VERSION_RANGE = 5, + ISNS_TAG_REGISTRATION_PERIOD = 6, + ISNS_TAG_ENTITY_INDEX = 7, + ISNS_TAG_ENTITY_NEXT_INDEX = 8, + ISNS_TAG_ENTITY_ISAKMP_PHASE_1 = 11, + ISNS_TAG_ENTITY_CERTIFICATE = 12, + ISNS_TAG_PORTAL_IP_ADDRESS = 16, + ISNS_TAG_PORTAL_TCP_UDP_PORT = 17, + ISNS_TAG_PORTAL_SYMBOLIC_NAME = 18, + ISNS_TAG_ESI_INTERVAL = 19, + ISNS_TAG_ESI_PORT = 20, + ISNS_TAG_PORTAL_INDEX = 22, + ISNS_TAG_SCN_PORT = 23, + ISNS_TAG_PORTAL_NEXT_INDEX = 24, + ISNS_TAG_PORTAL_SECURITY_BITMAP = 27, + ISNS_TAG_PORTAL_ISAKMP_PHASE_1 = 28, + ISNS_TAG_PORTAL_ISAKMP_PHASE_2 = 29, + ISNS_TAG_PORTAL_CERTIFICATE = 31, + ISNS_TAG_ISCSI_NAME = 32, + ISNS_TAG_ISCSI_NODE_TYPE = 33, + ISNS_TAG_ISCSI_ALIAS = 34, + ISNS_TAG_ISCSI_SCN_BITMAP = 35, + ISNS_TAG_ISCSI_NODE_INDEX = 36, + ISNS_TAG_WWNN_TOKEN = 37, + ISNS_TAG_ISCSI_NODE_NEXT_INDEX = 38, + ISNS_TAG_ISCSI_AUTHMETHOD = 42, + ISNS_TAG_PG_ISCSI_NAME = 48, + ISNS_TAG_PG_PORTAL_IP_ADDR = 49, + ISNS_TAG_PG_PORTAL_TCP_UDP_PORT = 50, + ISNS_TAG_PG_TAG = 51, + ISNS_TAG_PG_INDEX = 52, + ISNS_TAG_PG_NEXT_INDEX = 53, + ISNS_TAG_FC_PORT_NAME_WWPN = 64, + ISNS_TAG_PORT_ID = 65, + ISNS_TAG_FC_PORT_TYPE = 66, + ISNS_TAG_SYMBOLIC_PORT_NAME = 67, + ISNS_TAG_FABRIC_PORT_NAME = 68, + ISNS_TAG_HARD_ADDRESS = 69, + ISNS_TAG_PORT_IP_ADDRESS = 70, + ISNS_TAG_CLASS_OF_SERVICE = 71, + ISNS_TAG_FC4_TYPES = 72, + ISNS_TAG_FC4_DESCRIPTOR = 73, + ISNS_TAG_FC4_FEATURES = 74, + ISNS_TAG_IFCP_SCN_BITMAP = 75, + ISNS_TAG_PORT_ROLE = 76, + ISNS_TAG_PERMANENT_PORT_NAME = 77, + ISNS_TAG_FC4_TYPE_CODE = 95, + ISNS_TAG_FC_NODE_NAME_WWNN = 96, + ISNS_TAG_SYMBOLIC_NODE_NAME = 97, + ISNS_TAG_NODE_IP_ADDRESS = 98, + ISNS_TAG_NODE_IPA = 99, + ISNS_TAG_PROXY_ISCSI_NAME = 101, + ISNS_TAG_SWITCH_NAME = 128, + ISNS_TAG_PREFERRED_ID = 129, + ISNS_TAG_ASSIGNED_ID = 130, + ISNS_TAG_VIRTUAL_FABRIC_ID = 131, + ISNS_TAG_SERVER_VENDOR_OUI = 256, + ISNS_TAG_DD_SET_ID = 2049, + ISNS_TAG_DD_SET_SYMBOLIC_NAME = 2050, + ISNS_TAG_DD_SET_STATUS = 2051, + ISNS_TAG_DD_SET_NEXT_ID = 2052, + ISNS_TAG_DD_ID = 2065, + ISNS_TAG_DD_SYMBOLIC_NAME = 2066, + ISNS_TAG_DD_MEMBER_ISCSI_INDEX = 2067, + ISNS_TAG_DD_MEMBER_ISCSI_NAME = 2068, + ISNS_TAG_DD_MEMBER_FC_PORT_NAME = 2069, + ISNS_TAG_DD_MEMBER_PORTAL_INDEX = 2070, + ISNS_TAG_DD_MEMBER_PORTAL_IP_ADDR = 2071, + ISNS_TAG_DD_MEMBER_PORTAL_TCP_UDP_PORT = 2072, + ISNS_TAG_DD_FEATURES = 2078, + ISNS_TAG_DD_NEXT_ID = 2079, + + __ISNS_TAG_MAX, + + ISNS_VENDOR_SPECIFIC_SERVER_BASE = 257, /* end 384 */ + ISNS_VENDOR_SPECIFIC_ENTITY_BASE = 385, /* end 512 */ + ISNS_VENDOR_SPECIFIC_PORTAL_BASE = 513, /* end 640 */ + ISNS_VENDOR_SPECIFIC_NODE_BASE = 641, /* end 768 */ + ISNS_VENDOR_SPECIFIC_DD_BASE = 1024, /* end 1280 */ + ISNS_VENDOR_SPECIFIC_DDSET_BASE = 1281, /* end 1536 */ + ISNS_VENDOR_SPECIFIC_OTHER_BASE = 1537, /* end 2048 */ +}; + +typedef enum isns_entity_protocol { + ISNS_ENTITY_PROTOCOL_NONE = 1, + ISNS_ENTITY_PROTOCOL_ISCSI = 2, + ISNS_ENTITY_PROTOCOL_IFCP = 3, +} isns_entity_protocol_t; + +enum isns_iscsi_node_type_bits { + ISNS_ISCSI_NODE_TYPE_TARGET = 0, + ISNS_ISCSI_NODE_TYPE_INITIATOR = 1, + ISNS_ISCSI_NODE_TYPE_CONTROL = 2, +}; +#define ISNS_ISCSI_INITIATOR_MASK (1 << ISNS_ISCSI_NODE_TYPE_INITIATOR) +#define ISNS_ISCSI_TARGET_MASK (1 << ISNS_ISCSI_NODE_TYPE_TARGET) +#define ISNS_ISCSI_CONTROL_MASK (1 << ISNS_ISCSI_NODE_TYPE_CONTROL) + +enum isns_portal_port_bits { + ISNS_PORTAL_PORT_UDP = 16, +}; +#define ISNS_PORTAL_PORT_UDP_MASK (1 << ISNS_PORTAL_PORT_UDP) + +enum isns_portal_security_bits { + ISNS_PORTAL_SEC_BITMAP_VALID = 0, + ISNS_PORTAL_SEC_IPSEC_ENABLED = 1, + ISNS_PORTAL_SEC_MAIN_MODE_ENABLED = 2, + ISNS_PORTAL_SEC_AGGR_MODE_ENABLED = 3, + ISNS_PORTAL_SEC_PFS_ENABLED = 4, + ISNS_PORTAL_SEC_TRANSPORT_MODE_PREFERRED = 5, + ISNS_PORTAL_SEC_TUNNEL_MODE_PREFERRED = 6, +}; +#define ISNS_PORTAL_SEC_BITMAP_VALID_MASK (1 << ISNS_PORTAL_SEC_BITMAP_VALID) +#define ISNS_PORTAL_SEC_IPSEC_ENABLED_MASK (1 << ISNS_PORTAL_SEC_IPSEC_ENABLED) +#define ISNS_PORTAL_SEC_MAIN_MODE_ENABLED_MASK (1 << ISNS_PORTAL_SEC_MAIN_MODE_ENABLED) +#define ISNS_PORTAL_SEC_AGGR_MODE_ENABLED_MASK (1 << ISNS_PORTAL_SEC_AGGR_MODE_ENABLED) +#define ISNS_PORTAL_SEC_PFS_ENABLED_MASK (1 << ISNS_PORTAL_SEC_PFS_ENABLED) +#define ISNS_PORTAL_SEC_TRANSPORT_MODE_PREFERRED_MASK (1 << ISNS_PORTAL_SEC_TRANSPORT_MODE_PREFERRED) +#define ISNS_PORTAL_SEC_TUNNEL_MODE_PREFERRED_MASK (1 << ISNS_PORTAL_SEC_TUNNEL_MODE_PREFERRED) + +enum isns_scn_bits { + ISNS_SCN_DD_MEMBER_ADDED = 0, + ISNS_SCN_DD_MEMBER_REMOVED = 1, + ISNS_SCN_OBJECT_UPDATED = 2, + ISNS_SCN_OBJECT_ADDED = 3, + ISNS_SCN_OBJECT_REMOVED = 4, + ISNS_SCN_MANAGEMENT_REGISTRATION = 5, + ISNS_SCN_TARGET_AND_SELF_ONLY = 6, + ISNS_SCN_INITIATOR_AND_SELF_ONLY = 7, +}; +#define ISNS_SCN_DD_MEMBER_ADDED_MASK (1 << ISNS_SCN_DD_MEMBER_ADDED) +#define ISNS_SCN_DD_MEMBER_REMOVED_MASK (1 << ISNS_SCN_DD_MEMBER_REMOVED) +#define ISNS_SCN_OBJECT_UPDATED_MASK (1 << ISNS_SCN_OBJECT_UPDATED) +#define ISNS_SCN_OBJECT_ADDED_MASK (1 << ISNS_SCN_OBJECT_ADDED) +#define ISNS_SCN_OBJECT_REMOVED_MASK (1 << ISNS_SCN_OBJECT_REMOVED) +#define ISNS_SCN_MANAGEMENT_REGISTRATION_MASK (1 << ISNS_SCN_MANAGEMENT_REGISTRATION) +#define ISNS_SCN_TARGET_AND_SELF_ONLY_MASK (1 << ISNS_SCN_TARGET_AND_SELF_ONLY) +#define ISNS_SCN_INITIATOR_AND_SELF_ONLY_MASK (1 << ISNS_SCN_INITIATOR_AND_SELF_ONLY) + +enum isns_dds_status_bits { + ISNS_DDS_ENABLED = 0, +}; +#define ISNS_DDS_ENABLED_MASK (1 << ISNS_DDS_ENABLED) + +enum isns_dd_feature_bits { + ISNS_DD_BOOT_LIST_ENABLED = 0, +}; +#define ISNS_DD_BOOT_LIST_ENABLED_MASK (1 << ISN_BOOT_LIST_DDS_ENABLED) + +#define ISNS_PAD(len) (((len) + 3) & ~3UL) + +/* + * iSNS auth block + */ +#define ISNS_AUTHBLK_SIZE 20 +struct isns_authblk { + uint32_t iab_bsd; /* 16bit in SLP */ + uint32_t iab_length; /* 16bit in SLP */ + uint64_t iab_timestamp; /* 32bit in SLP */ + uint32_t iab_spi_len; /* 16bit in SLP */ + + char * iab_spi; + void * iab_sig; + uint32_t iab_sig_len; +} __attribute__((packed)); + +#define ISNS_AUTH_TYPE_SHA1_DSA 0x0002 + +#endif /* ISNS_PROTO_H */ diff --git a/include/libisns/isns.h b/include/libisns/isns.h new file mode 100644 index 000000000000..e0a2fa8016f1 --- /dev/null +++ b/include/libisns/isns.h @@ -0,0 +1,676 @@ +/* + * iSNS implementation - library header file. + * + * Copyright (C) 2007 Olaf Kirch <[email protected]> + * + * This file contains all declarations and definitions + * commonly required by users of libisns. + */ + +#ifndef ISNS_H +#define ISNS_H + +#include <sys/socket.h> +#include <netinet/in.h> +#include <stdio.h> + +#include <libisns/isns-proto.h> +#include <libisns/types.h> + +#define ISNS_MAX_BUFFER 8192 +#define ISNS_MAX_MESSAGE 8192 + + +/* + * Client handle + */ +typedef struct isns_client isns_client_t; +struct isns_client { + isns_source_t * ic_source; + isns_socket_t * ic_socket; +}; + +/* + * Server operations + */ +typedef int isns_service_fn_t(isns_server_t *, isns_simple_t *, isns_simple_t **); +typedef void isns_scn_callback_fn_t(isns_db_t *, uint32_t scn_bits, + isns_object_template_t *node_type, + const char *node_name, + const char *recipient); +struct isns_service_ops { + isns_service_fn_t * process_registration; + isns_service_fn_t * process_query; + isns_service_fn_t * process_getnext; + isns_service_fn_t * process_deregistration; + isns_service_fn_t * process_scn_registration; + isns_service_fn_t * process_scn_deregistration; + isns_service_fn_t * process_scn_event; + isns_service_fn_t * process_scn; + isns_service_fn_t * process_dd_registration; + isns_service_fn_t * process_dd_deregistration; + isns_service_fn_t * process_esi; + isns_service_fn_t * process_heartbeat; +}; + +extern struct isns_service_ops isns_default_service_ops; +extern struct isns_service_ops isns_callback_service_ops; + +/* + * Output function + */ +void isns_print_stdout(const char *, ...); + +/* + * Database events + */ +struct isns_db_event { + isns_object_t * ie_recipient; /* Recipient node or NULL */ + isns_object_t * ie_object; /* Affected object */ + isns_object_t * ie_trigger; /* Triggering object */ + unsigned int ie_bits; /* SCN bitmask */ +}; +typedef void isns_db_callback_t(const isns_db_event_t *, + void *user_data); + +/* + * Handling of client objects + */ +extern isns_client_t * isns_create_default_client(isns_security_t *); +extern isns_client_t * isns_create_client(isns_security_t *, + const char *source_name); +extern isns_client_t * isns_create_local_client(isns_security_t *, + const char *source_name); +extern int isns_client_call(isns_client_t *, + isns_simple_t **inout); +extern void isns_client_destroy(isns_client_t *); +extern int isns_client_get_local_address(const isns_client_t *, + isns_portal_info_t *); + +/* + * Handling of server objects + */ +extern isns_server_t * isns_create_server(isns_source_t *, + isns_db_t *, + struct isns_service_ops *); +extern void isns_server_set_scn_callback(isns_server_t *, + isns_scn_callback_fn_t *); + + +/* + * Handling of source names + */ +extern int isns_init_names(void); +extern const char * isns_default_source_name(void); +extern isns_source_t * isns_source_create(isns_attr_t *); +extern isns_source_t * isns_source_create_iscsi(const char *name); +extern isns_source_t * isns_source_create_ifcp(const char *name); +extern uint32_t isns_source_type(const isns_source_t *); +extern const char * isns_source_name(const isns_source_t *); +extern isns_attr_t * isns_source_attr(const isns_source_t *); +extern isns_source_t * isns_source_get(isns_source_t *); +extern isns_source_t * isns_source_from_object(const isns_object_t *); +extern void isns_source_release(isns_source_t *); +extern int isns_source_match(const isns_source_t *, + const isns_source_t *); + +extern void isns_server_set_source(isns_source_t *); +extern isns_message_t * isns_process_message(isns_server_t *, isns_message_t *); + +extern void isns_simple_print(isns_simple_t *, + isns_print_fn_t *); +extern int isns_simple_call(isns_socket_t *, + isns_simple_t **); +extern int isns_simple_transmit(isns_socket_t *, + isns_simple_t *, + const isns_portal_info_t *, + unsigned int, + void (*callback)(uint32_t, int, + isns_simple_t *)); +extern void isns_simple_free(isns_simple_t *); +extern const isns_attr_list_t *isns_simple_get_attrs(isns_simple_t *); + +extern isns_simple_t * isns_create_query(isns_client_t *clnt, + const isns_attr_list_t *query_key); +extern isns_simple_t * isns_create_query2(isns_client_t *clnt, + const isns_attr_list_t *query_key, + isns_source_t *source); +extern int isns_query_request_attr_tag(isns_simple_t *, + uint32_t); +extern int isns_query_request_attr(isns_simple_t *, + isns_attr_t *); +extern int isns_query_response_get_objects(isns_simple_t *qry, + isns_object_list_t *result); + +extern isns_simple_t * isns_create_registration(isns_client_t *clnt, + isns_object_t *key_object); +extern isns_simple_t * isns_create_registration2(isns_client_t *clnt, + isns_object_t *key_object, + isns_source_t *source); +extern void isns_registration_set_replace(isns_simple_t *, int); +extern void isns_registration_add_object(isns_simple_t *, + isns_object_t *object); +extern void isns_registration_add_object_list(isns_simple_t *, + isns_object_list_t *); +extern int isns_registration_response_get_objects(isns_simple_t *, + isns_object_list_t *); + +extern isns_simple_t * isns_create_getnext(isns_client_t *, + isns_object_template_t *, + const isns_attr_list_t *); +extern int isns_getnext_response_get_object(isns_simple_t *, + isns_object_t **); +extern isns_simple_t * isns_create_getnext_followup(isns_client_t *, + const isns_simple_t *, + const isns_attr_list_t *); + +extern isns_simple_t * isns_create_deregistration(isns_client_t *clnt, + const isns_attr_list_t *); + +extern isns_simple_t * isns_create_scn_registration(isns_client_t *clnt, + unsigned int); +extern isns_simple_t * isns_create_scn_registration2(isns_client_t *clnt, + unsigned int, + isns_source_t *); + +extern int isns_dd_load_all(isns_db_t *); +extern void isns_dd_get_members(uint32_t, isns_object_list_t *, int); +extern isns_simple_t * isns_create_dd_registration(isns_client_t *, + const isns_attr_list_t *); +extern isns_simple_t * isns_create_dd_deregistration(isns_client_t *, + uint32_t, const isns_attr_list_t *); + +extern isns_object_t * isns_create_object(isns_object_template_t *, + const isns_attr_list_t *, + isns_object_t *); +extern isns_object_t * isns_create_entity(int, const char *); +extern isns_object_t * isns_create_entity_for_source(const isns_source_t *, + const char *); +extern const char * isns_entity_name(const isns_object_t *); +extern isns_object_t * isns_create_portal(const isns_portal_info_t *, + isns_object_t *parent); +extern isns_object_t * isns_create_storage_node(const char *name, + uint32_t type_mask, + isns_object_t *parent); +extern isns_object_t * isns_create_storage_node2(const isns_source_t *, + uint32_t type_mask, + isns_object_t *parent); +extern isns_object_t * isns_create_iscsi_initiator(const char *name, + isns_object_t *parent); +extern isns_object_t * isns_create_iscsi_target(const char *name, + isns_object_t *parent); +extern const char * isns_storage_node_name(const isns_object_t *); +extern isns_attr_t * isns_storage_node_key_attr(const isns_object_t *); +extern isns_object_t * isns_create_portal_group(isns_object_t *portal, + isns_object_t *iscsi_node, uint32_t pg_tag); +extern isns_object_t * isns_create_default_portal_group(isns_db_t *, + isns_object_t *portal, + isns_object_t *node); +extern void isns_get_portal_groups(isns_object_t *portal, + isns_object_t *node, + isns_object_list_t *result); + +extern const char * isns_object_template_name(isns_object_template_t *); +extern int isns_object_set_attr(isns_object_t *, isns_attr_t *); +extern int isns_object_set_attrlist(isns_object_t *, const isns_attr_list_t *); +extern isns_object_t * isns_object_get(isns_object_t *); +extern int isns_object_get_attrlist(isns_object_t *obj, + isns_attr_list_t *result, + const isns_attr_list_t *requested_attrs); +extern int isns_object_get_key_attrs(isns_object_t *, + isns_attr_list_t *); +extern int isns_object_get_attr(const isns_object_t *, uint32_t, + isns_attr_t **); +extern void isns_object_get_related(isns_db_t *, + isns_object_t *, isns_object_list_t *); +extern void isns_object_get_descendants(const isns_object_t *, + isns_object_template_t *, + isns_object_list_t *); +extern void isns_object_release(isns_object_t *); +extern int isns_object_match(const isns_object_t *, + const isns_attr_list_t *); +extern isns_object_t * isns_object_get_entity(isns_object_t *); +extern int isns_object_attr_valid(isns_object_template_t *, uint32_t); +extern int isns_object_contains(const isns_object_t *, const isns_object_t *); +extern int isns_object_delete_attr(isns_object_t *, uint32_t); +extern int isns_object_is(const isns_object_t *, + isns_object_template_t *); +extern int isns_object_is_entity(const isns_object_t *); +extern int isns_object_is_iscsi_node(const isns_object_t *); +extern int isns_object_is_fc_port(const isns_object_t *); +extern int isns_object_is_fc_node(const isns_object_t *); +extern int isns_object_is_portal(const isns_object_t *); +extern int isns_object_is_pg(const isns_object_t *); +extern int isns_object_is_policy(const isns_object_t *); +extern int isns_object_is_dd(const isns_object_t *); +extern int isns_object_is_ddset(const isns_object_t *); +extern void isns_object_print(isns_object_t *, + isns_print_fn_t *); +extern time_t isns_object_last_modified(const isns_object_t *); +extern int isns_object_mark_membership(isns_object_t *, uint32_t); +extern int isns_object_clear_membership(isns_object_t *, uint32_t); +extern int isns_object_test_membership(const isns_object_t *, uint32_t); +extern int isns_object_test_visibility(const isns_object_t *, + const isns_object_t *); +extern void isns_object_get_visible(const isns_object_t *, + isns_db_t *, isns_object_list_t *); +extern void isns_entity_touch(isns_object_t *); +extern int isns_object_extract_keys(const isns_object_t *, + isns_attr_list_t *); +extern int isns_object_extract_all(const isns_object_t *, + isns_attr_list_t *); +extern int isns_object_extract_writable(const isns_object_t *, + isns_attr_list_t *); + + +extern int isns_object_set_nil(isns_object_t *obj, + uint32_t tag); +extern int isns_object_set_string(isns_object_t *obj, + uint32_t tag, + const char *value); +extern int isns_object_set_uint32(isns_object_t *obj, + uint32_t tag, + uint32_t value); +extern int isns_object_set_uint64(isns_object_t *obj, + uint32_t tag, + uint64_t value); +extern int isns_object_set_ipaddr(isns_object_t *obj, + uint32_t tag, + const struct in6_addr *value); + +extern int isns_object_get_string(const isns_object_t *, + uint32_t, + const char **); +extern int isns_object_get_ipaddr(const isns_object_t *, + uint32_t, + struct in6_addr *); +extern int isns_object_get_uint32(const isns_object_t *, + uint32_t, + uint32_t *); +extern int isns_object_get_uint64(const isns_object_t *, + uint32_t, + uint64_t *); +extern int isns_object_get_opaque(const isns_object_t *, + uint32_t, + const void **, size_t *); + + +extern int isns_object_find_descendants(isns_object_t *obj, + isns_object_template_t *, + const isns_attr_list_t *keys, + isns_object_list_t *result); +extern isns_object_t * isns_object_find_descendant(isns_object_t *obj, + const isns_attr_list_t *keys); +extern int isns_object_detach(isns_object_t *); +extern int isns_object_attach(isns_object_t *, isns_object_t *); +extern void isns_object_prune_attrs(isns_object_t *); +extern void isns_mark_object(isns_object_t *, unsigned int); + +extern int isns_get_entity_identifier(isns_object_t *, const char **); +extern int isns_get_entity_protocol(isns_object_t *, isns_entity_protocol_t *); +extern int isns_get_entity_index(isns_object_t *, uint32_t *); + +extern int isns_get_portal_ipaddr(isns_object_t *, struct in6_addr *); +extern int isns_get_portal_tcpudp_port(isns_object_t *, + int *ipprotocol, uint16_t *port); +extern int isns_get_portal_index(isns_object_t *, uint32_t *); + +extern int isns_get_address(struct sockaddr_storage *, + const char *, const char *, int, int, int); +extern char * isns_get_canon_name(const char *); + +extern isns_db_t * isns_db_open(const char *location); +extern isns_db_t * isns_db_open_shadow(isns_object_list_t *); +extern isns_object_t * isns_db_lookup(isns_db_t *, + isns_object_template_t *, + const isns_attr_list_t *); +extern isns_object_t * isns_db_vlookup(isns_db_t *, + isns_object_template_t *, + ...); +extern int isns_db_gang_lookup(isns_db_t *, + isns_object_template_t *, + const isns_attr_list_t *, + isns_object_list_t *); +extern isns_object_t * isns_db_get_next(isns_db_t *, + isns_object_template_t *, + const isns_attr_list_t *current, + const isns_attr_list_t *scope, + const isns_source_t *source); +extern isns_object_t * isns_db_lookup_source_node(isns_db_t *, + const isns_source_t *); +extern void isns_db_get_domainless(isns_db_t *, + isns_object_template_t *, + isns_object_list_t *); +extern uint32_t isns_db_allocate_index(isns_db_t *); +extern void isns_db_insert(isns_db_t *, isns_object_t *); +extern void isns_db_insert_limbo(isns_db_t *, isns_object_t *); +extern int isns_db_remove(isns_db_t *, isns_object_t *); +extern time_t isns_db_expire(isns_db_t *); +extern void isns_db_purge(isns_db_t *); +extern void isns_db_sync(isns_db_t *); +extern const char * isns_db_generate_eid(isns_db_t *, char *, size_t); +extern isns_object_t * isns_db_get_control(isns_db_t *); +extern void isns_db_print(isns_db_t *, + isns_print_fn_t *); + +extern void isns_db_begin_transaction(isns_db_t *); +extern void isns_db_commit(isns_db_t *); +extern void isns_db_rollback(isns_db_t *); + +extern void isns_object_event(isns_object_t *obj, + unsigned int bits, + isns_object_t *trigger); +extern void isns_unicast_event(isns_object_t *dst, + isns_object_t *obj, + unsigned int bits, + isns_object_t *trigger); +extern void isns_register_callback(isns_db_callback_t *, + void *); +extern void isns_flush_events(void); +extern const char * isns_event_string(unsigned int); + +extern void isns_add_timer(unsigned int, + isns_timer_callback_t *, void *); +extern void isns_add_oneshot_timer(unsigned int, + isns_timer_callback_t *, void *); +extern void isns_cancel_timer(isns_timer_callback_t *, void *); +extern time_t isns_run_timers(void); + +extern void isns_object_list_init(isns_object_list_t *); +extern void isns_object_list_destroy(isns_object_list_t *); +extern int isns_object_list_contains(const isns_object_list_t *, + isns_object_t *); +extern void isns_object_list_append(isns_object_list_t *, + isns_object_t *); +extern void isns_object_list_append_list(isns_object_list_t *, + const isns_object_list_t *); +extern isns_object_t * isns_object_list_lookup(const isns_object_list_t *, + isns_object_template_t *, + const isns_attr_list_t *); +extern int isns_object_list_gang_lookup(const isns_object_list_t *, + isns_object_template_t *, + const isns_attr_list_t *, + isns_object_list_t *); +extern int isns_object_list_remove(isns_object_list_t *, + isns_object_t *); +extern void isns_object_list_uniq(isns_object_list_t *); +extern void isns_object_list_print(const isns_object_list_t *, + isns_print_fn_t *); + +isns_object_template_t *isns_object_template_for_key_attrs(const isns_attr_list_t *); +isns_object_template_t *isns_object_template_for_tag(uint32_t); +isns_object_template_t *isns_object_template_for_index_tag(uint32_t); +isns_object_template_t *isns_object_template_find(uint32_t); + +extern int isns_attr_set(isns_attr_t *, const void *); +extern isns_attr_t * isns_attr_get(isns_attr_t *); +extern void isns_attr_release(isns_attr_t *); +extern void isns_attr_print(const isns_attr_t *, + isns_print_fn_t *); +extern char * isns_attr_print_value(const isns_attr_t *, + char *, size_t); +extern int isns_attr_match(const isns_attr_t *, + const isns_attr_t *); +extern int isns_attr_compare(const isns_attr_t *, + const isns_attr_t *); +extern isns_attr_t * isns_attr_from_string(uint32_t, const char *); + +extern void isns_attr_list_print(const isns_attr_list_t *, + isns_print_fn_t *); + +extern void isns_attr_list_init(isns_attr_list_t *); +extern void isns_attr_list_copy(isns_attr_list_t *, + const isns_attr_list_t *); +extern void isns_attr_list_destroy(isns_attr_list_t *); +extern int isns_attr_list_remove_tag(isns_attr_list_t *, + uint32_t); + +extern void isns_attr_list_append_attr(isns_attr_list_t *, + isns_attr_t *); +extern void isns_attr_list_append_list(isns_attr_list_t *, + const isns_attr_list_t *); +extern int isns_attr_list_replace_attr(isns_attr_list_t *, + isns_attr_t *); +/* Warning: this does *NOT* return a reference to the attribute */ +extern int isns_attr_list_get_attr(const isns_attr_list_t *, + uint32_t tag, + isns_attr_t **); + +extern void isns_attr_list_append_nil(isns_attr_list_t *, + uint32_t tag); +extern void isns_attr_list_append_string(isns_attr_list_t *, + uint32_t tag, const char *value); +extern void isns_attr_list_append_uint32(isns_attr_list_t *, + uint32_t tag, uint32_t value); +extern void isns_attr_list_append_uint64(isns_attr_list_t *, + uint32_t, int64_t); +extern void isns_attr_list_append_int32(isns_attr_list_t *, + uint32_t tag, int32_t value); +extern void isns_attr_list_append_opaque(isns_attr_list_t *, + uint32_t tag, const void *ptr, size_t len); +extern void isns_attr_list_append_ipaddr(isns_attr_list_t *, + uint32_t tag, const struct in6_addr *); + +extern int isns_attr_list_append(isns_attr_list_t *, + uint32_t tag, const void *); +extern int isns_attr_list_update(isns_attr_list_t *, + uint32_t tag, const void *); + +extern int isns_attr_list_contains(const isns_attr_list_t *, + uint32_t tag); +extern int isns_attr_list_compare(const isns_attr_list_t *, + const isns_attr_list_t *); + +/* + * Helper macros + */ +#define ISNS_ATTR_TYPE_CHECK(attr, type) \ + ((attr)->ia_value.iv_type == &isns_attr_type_##type) +#define ISNS_ATTR_IS_NIL(attr) \ + ISNS_ATTR_TYPE_CHECK(attr, nil) +#define ISNS_ATTR_IS_STRING(attr) \ + ISNS_ATTR_TYPE_CHECK(attr, string) +#define ISNS_ATTR_IS_IPADDR(attr) \ + ISNS_ATTR_TYPE_CHECK(attr, ipaddr) +#define ISNS_ATTR_IS_UINT32(attr) \ + ISNS_ATTR_TYPE_CHECK(attr, uint32) +#define ISNS_ATTR_IS_UINT64(attr) \ + ISNS_ATTR_TYPE_CHECK(attr, uint64) +#define ISNS_ATTR_IS_OPAQUE(attr) \ + ISNS_ATTR_TYPE_CHECK(attr, opaque) + + + +extern isns_socket_t * isns_create_server_socket(const char *hostname, const char *portname, + int af_hint, int sock_type); +extern isns_socket_t * isns_create_client_socket(const char *hostname, const char *portname, + int af_hint, int sock_type); +extern isns_socket_t * isns_create_systemd_socket(int index); +extern isns_socket_t * isns_create_bound_client_socket(const char *myaddr, + const char *hostname, const char *portname, + int af_hint, int sock_type); +extern isns_socket_t * isns_connect_to_portal(const isns_portal_info_t *); +extern void isns_socket_set_report_failure(isns_socket_t *); +extern void isns_socket_set_disconnect_fatal(isns_socket_t *); +extern int isns_socket_get_local_addr(const isns_socket_t *, + struct sockaddr_storage *); +extern int isns_socket_get_portal_info(const isns_socket_t *, + isns_portal_info_t *); +extern void isns_socket_set_security_ctx(isns_socket_t *, + isns_security_t *); +extern isns_message_t * isns_recv_message(struct timeval *timeout); +extern isns_message_t * isns_socket_call(isns_socket_t *, isns_message_t *, long); +extern int isns_socket_send(isns_socket_t *, isns_message_t *); +extern void isns_socket_free(isns_socket_t *); +extern int isns_addr_get_port(const struct sockaddr *); +extern void isns_addr_set_port(struct sockaddr *, unsigned int); +extern isns_socket_t * isns_socket_find_server(const isns_portal_info_t *); + +extern isns_message_t * isns_create_message(uint16_t function, uint16_t flags); +extern isns_message_t * isns_create_reply(const isns_message_t *); +extern int isns_message_init(isns_message_t *, + uint16_t, uint16_t, size_t); +extern int isns_message_status(isns_message_t *); +extern void isns_message_release(isns_message_t *); +extern unsigned int isns_message_function(const isns_message_t *); +extern isns_socket_t * isns_message_socket(const isns_message_t *); +extern void isns_message_set_error(isns_message_t *, uint32_t); + +extern const char * isns_strerror(enum isns_status); +extern const char * isns_function_name(unsigned int); + +/* + * Security related functions + */ +extern int isns_security_init(void); +extern isns_principal_t *isns_security_load_privkey(isns_security_t *, + const char *filename); +extern isns_principal_t *isns_security_load_pubkey(isns_security_t *, + const char *filename); +extern isns_security_t *isns_default_security_context(int server_only); +extern isns_security_t *isns_control_security_context(int server_only); +extern isns_security_t *isns_create_dsa_context(void); +extern void isns_security_set_identity(isns_security_t *, isns_principal_t *); +extern void isns_principal_free(isns_principal_t *); +extern void isns_add_principal(isns_security_t *, isns_principal_t *); +extern isns_keystore_t *isns_create_keystore(const char *); +extern void isns_security_set_keystore(isns_security_t *, + isns_keystore_t *); +extern void isns_principal_set_name(isns_principal_t *, const char *); +extern const char * isns_principal_name(const isns_principal_t *); + +extern isns_object_template_t isns_entity_template; +extern isns_object_template_t isns_portal_template; +extern isns_object_template_t isns_iscsi_node_template; +extern isns_object_template_t isns_fc_port_template; +extern isns_object_template_t isns_fc_node_template; +extern isns_object_template_t isns_iscsi_pg_template; +extern isns_object_template_t isns_dd_template; +extern isns_object_template_t isns_ddset_template; + +/* + * Config file parser + */ +struct isns_config { + char * ic_host_name; + char * ic_auth_name; + char * ic_source_name; + char * ic_source_suffix; + char * ic_entity_name; + char * ic_iqn_prefix; + + char * ic_server_name; + char * ic_bind_address; + char * ic_database; + char * ic_auth_key_file; + char * ic_server_key_file; + char * ic_client_keystore; + char * ic_control_socket; + char * ic_pidfile; + char * ic_local_registry_file; + int ic_security; + int ic_slp_register; + + char * ic_control_name; + char * ic_control_key_file; + + unsigned int ic_registration_period; + unsigned int ic_scn_timeout; + unsigned int ic_scn_retries; + char * ic_scn_callout; + + unsigned int ic_esi_max_interval; + unsigned int ic_esi_min_interval; + unsigned int ic_esi_retries; + + unsigned int ic_use_default_domain; + + struct { + unsigned int policy; + unsigned int replay_window; + unsigned int timestamp_jitter; + int allow_unknown_peers; + } ic_auth; + struct { + unsigned int max_sockets; + unsigned int connect_timeout; + unsigned int reconnect_timeout; + unsigned int call_timeout; + unsigned int udp_retrans_timeout; + unsigned int tcp_retrans_timeout; + unsigned int idle_timeout; + } ic_network; + struct { + char * param_file; + unsigned int key_bits; + } ic_dsa; + +}; + +extern struct isns_config isns_config; +extern int isns_read_initiatorname(const char *); +extern int isns_read_config(const char *); +extern int isns_config_set(const char *, char *); + +/* + * Reserved entity name for Policy information + */ +#define ISNS_ENTITY_CONTROL "CONTROL" + + +/* + * Helpers to deal with portal information + */ +struct isns_portal_info { + struct sockaddr_in6 addr; + int proto; +}; + +extern void isns_portal_init(isns_portal_info_t *, + const struct sockaddr *, int); +extern int isns_portal_parse(isns_portal_info_t *portal, + const char *addr_spec, + const char *default_port); +extern int isns_portal_from_attr_list(isns_portal_info_t *, + uint32_t addr_tag, uint32_t port_tag, + const isns_attr_list_t *); +extern int isns_portal_from_attr_pair(isns_portal_info_t *, + const isns_attr_t *, + const isns_attr_t *); +extern int isns_portal_from_object(isns_portal_info_t *, + uint32_t addr_tag, uint32_t port_tag, + const isns_object_t *); +extern int isns_portal_from_sockaddr(isns_portal_info_t *, + const struct sockaddr_storage *); +extern int isns_portal_to_sockaddr(const isns_portal_info_t *, + struct sockaddr_storage *); +extern int isns_portal_to_attr_list(const isns_portal_info_t *, + uint32_t addr_tag, uint32_t port_tag, + isns_attr_list_t *); +extern int isns_portal_to_object(const isns_portal_info_t *, + uint32_t addr_tag, uint32_t port_tag, + isns_object_t *); +extern int isns_portal_is_wildcard(const isns_portal_info_t *); +extern uint32_t isns_portal_tcpudp_port(const isns_portal_info_t *); +extern const char * isns_portal_string(const isns_portal_info_t *); +extern int isns_portal_equal(const isns_portal_info_t *, + const isns_portal_info_t *); +extern int isns_enumerate_portals(isns_portal_info_t *, + unsigned int); +extern int isns_get_nr_portals(void); + +/* Local registry stuff */ +extern int isns_local_registry_load(const char *, pid_t, isns_object_list_t *); +extern int isns_local_registry_store(const char *, pid_t, const isns_object_list_t *); +extern int isns_local_registry_purge(const char *, pid_t); + +/* Should go somwhere else .*/ +extern int isns_esi_enabled; + +extern void isns_esi_init(isns_server_t *); +extern void isns_esi_register(isns_object_t *); + +extern void isns_scn_init(isns_server_t *); +extern time_t isns_scn_transmit_all(void); + +#endif /* ISNS_H */ diff --git a/include/libisns/message.h b/include/libisns/message.h new file mode 100644 index 000000000000..7d0bbdb6be9f --- /dev/null +++ b/include/libisns/message.h @@ -0,0 +1,196 @@ +/* + * iSNS message definitions and functions + * + * Copyright (C) 2007 Olaf Kirch <[email protected]> + */ + +#ifndef ISNS_MESSAGE_H +#define ISNS_MESSAGE_H + +#include <libisns/attrs.h> +#include <libisns/source.h> +#include <libisns/util.h> + +typedef struct isns_message_queue isns_message_queue_t; + +struct isns_simple { + uint32_t is_function; + isns_source_t * is_source; + isns_policy_t * is_policy; + uint16_t is_xid; + + unsigned int is_replace : 1; + + isns_attr_list_t is_message_attrs; + isns_attr_list_t is_operating_attrs; +}; + +struct isns_message { + unsigned int im_users; + isns_list_t im_list; + struct sockaddr_storage im_addr; + socklen_t im_addrlen; + uint32_t im_xid; + struct isns_hdr im_header; + struct isns_buf * im_payload; + isns_socket_t * im_socket; + isns_principal_t * im_security; + struct ucred * im_creds; + + isns_message_queue_t * im_queue; + + /* When to retransmit */ + struct timeval im_resend_timeout; + struct timeval im_timeout; + + void (*im_destroy)(isns_message_t *); + void (*im_callback)(isns_message_t *, + isns_message_t *); + void * im_calldata; +}; + +enum { + ISNS_MQ_SORT_NONE, + ISNS_MQ_SORT_RESEND_TIMEOUT, +}; + +struct isns_message_queue { + isns_list_t imq_list; + size_t imq_count; +}; + +struct isns_server { + isns_source_t * is_source; + isns_db_t * is_db; + + isns_scn_callback_fn_t *is_scn_callback; + struct isns_service_ops *is_ops; +}; + +extern isns_message_t * __isns_alloc_message(uint32_t, size_t, void (*)(isns_message_t *)); +extern isns_security_t *isns_message_security(const isns_message_t *); + +extern isns_message_t * isns_message_queue_find(isns_message_queue_t *, uint32_t, + const struct sockaddr_storage *, socklen_t); +extern void isns_message_queue_insert_sorted(isns_message_queue_t *, + int, isns_message_t *); +extern void isns_message_queue_move(isns_message_queue_t *, + isns_message_t *); +extern void isns_message_queue_destroy(isns_message_queue_t *); + +extern isns_simple_t * isns_simple_create(uint32_t, + isns_source_t *, + const isns_attr_list_t *); +extern void isns_simple_free(isns_simple_t *); +extern int isns_simple_encode(isns_simple_t *, + isns_message_t **result); +extern int isns_simple_decode(isns_message_t *, + isns_simple_t **); +extern int isns_simple_encode_response(isns_simple_t *, + const isns_message_t *, isns_message_t **); +extern int isns_simple_response_get_objects(isns_simple_t *, + isns_object_list_t *); +extern const char * isns_function_name(uint32_t); + +extern isns_source_t * isns_simple_get_source(isns_simple_t *); + +extern int isns_process_registration(isns_server_t *, isns_simple_t *, isns_simple_t **); +extern int isns_process_query(isns_server_t *, isns_simple_t *, isns_simple_t **); +extern int isns_process_getnext(isns_server_t *, isns_simple_t *, isns_simple_t **); +extern int isns_process_deregistration(isns_server_t *, isns_simple_t *, isns_simple_t **); +extern int isns_process_scn_register(isns_server_t *, isns_simple_t *, isns_simple_t **); +extern int isns_process_scn_deregistration(isns_server_t *, isns_simple_t *, isns_simple_t **); +extern int isns_process_dd_registration(isns_server_t *, isns_simple_t *, isns_simple_t **); +extern int isns_process_dd_deregistration(isns_server_t *, isns_simple_t *, isns_simple_t **); +extern int isns_process_esi(isns_server_t *, isns_simple_t *, isns_simple_t **); +extern int isns_process_scn(isns_server_t *, isns_simple_t *, isns_simple_t **); + +/* + * Inline functions for message queues. + */ +static inline void +isns_message_queue_init(isns_message_queue_t *q) +{ + isns_list_init(&q->imq_list); + q->imq_count = 0; +} + +static inline isns_message_t * +isns_message_queue_head(const isns_message_queue_t *q) +{ + isns_list_t *pos = q->imq_list.next; + + if (pos == &q->imq_list) + return NULL; + return isns_list_item(isns_message_t, im_list, pos); +} + +static inline void +isns_message_queue_append(isns_message_queue_t *q, isns_message_t *msg) +{ + isns_assert(msg->im_queue == NULL); + isns_list_append(&q->imq_list, &msg->im_list); + q->imq_count++; + + msg->im_queue = q; + msg->im_users++; +} + +static inline isns_message_t * +isns_message_queue_remove(isns_message_queue_t *q, isns_message_t *msg) +{ + isns_assert(msg->im_queue == q); + isns_list_del(&msg->im_list); + msg->im_queue = NULL; + q->imq_count--; + + return msg; +} + +static inline isns_message_t * +isns_message_unlink(isns_message_t *msg) +{ + if (msg->im_queue) + return isns_message_queue_remove(msg->im_queue, msg); + return NULL; +} + +static inline isns_message_t * +isns_message_dequeue(isns_message_queue_t *q) +{ + isns_message_t *msg; + + if ((msg = isns_message_queue_head(q)) != NULL) { + isns_list_del(&msg->im_list); + msg->im_queue = NULL; + q->imq_count--; + } + return msg; +} + +/* + * Iterator for looping over all messages in a queue + */ +static inline void +isns_message_queue_begin(isns_message_queue_t *q, isns_list_t **pos) +{ + *pos = q->imq_list.next; +} + +static inline isns_message_t * +isns_message_queue_next(isns_message_queue_t *q, isns_list_t **pos) +{ + isns_list_t *next = *pos; + + if (next == &q->imq_list) + return NULL; + *pos = next->next; + return isns_list_item(isns_message_t, im_list, next); +} + +#define isns_message_queue_foreach(q, pos, item) \ + for (isns_message_queue_begin(q, &pos); \ + (item = isns_message_queue_next(q, &pos)) != NULL; \ + ) + +#endif /* ISNS_MESSAGE_H */ diff --git a/include/libisns/paths.h b/include/libisns/paths.h new file mode 100644 index 000000000000..64cf486137ca --- /dev/null +++ b/include/libisns/paths.h @@ -0,0 +1,24 @@ +/* + * Compile time configuration. + * For now, let's keep it simple and ignore autoconf... + * + * Copyright (C) 2006, 2007 Olaf Kirch <[email protected]> + */ + +#ifndef ISNS_CONFIG_H +#define ISNS_CONFIG_H + +#define __OPENISNS_MKVERSION(maj, min) (((maj) << 8) + (min)) +#define OPENISNS_VERSION __OPENISNS_MKVERSION(0, 93); +#define OPENISNS_VERSION_STRING "0.93" + +#define ISNS_ETCDIR "/etc/isns" +#define ISNS_RUNDIR "/var/run" +#define ISNS_DEFAULT_ISNSD_CONFIG ISNS_ETCDIR "/isnsd.conf" +#define ISNS_DEFAULT_ISNSDD_CONFIG ISNS_ETCDIR "/isnsdd.conf" +#define ISNS_DEFAULT_ISNSADM_CONFIG ISNS_ETCDIR "/isnsadm.conf" +#define ISNS_DEFAULT_LOCAL_REGISTRY ISNS_RUNDIR "/isns.registry" + +#define ISCSI_DEFAULT_INITIATORNAME "/etc/iscsi/initiatorname.iscsi" + +#endif /* ISNS_CONFIG_H */ diff --git a/include/libisns/source.h b/include/libisns/source.h new file mode 100644 index 000000000000..db522f6fac0d --- /dev/null +++ b/include/libisns/source.h @@ -0,0 +1,32 @@ +/* + * iSNS source attribute handling + * + * Copyright (C) 2007 Olaf Kirch <[email protected]> + */ + +#ifndef ISNS_SOURCE_H +#define ISNS_SOURCE_H + +#include <libisns/attrs.h> + +struct isns_source { + unsigned int is_users; + isns_attr_t * is_attr; + unsigned int is_untrusted : 1; + + isns_object_t * is_node; + unsigned int is_node_type; + + isns_object_t * is_entity; +}; + +extern int isns_source_encode(buf_t *, const isns_source_t *); +extern int isns_source_decode(buf_t *, isns_source_t **); +extern int isns_source_set_node(isns_source_t *, isns_db_t *); +extern void isns_source_set_entity(isns_source_t *, isns_object_t *); +extern isns_source_t * isns_source_dummy(void); + +extern char * isns_build_source_pattern(const char *); +extern int isns_source_pattern_match(const char *, const char *); + +#endif /* ISNS_SOURCE_H */ diff --git a/include/libisns/types.h b/include/libisns/types.h new file mode 100644 index 000000000000..ddd153f8401d --- /dev/null +++ b/include/libisns/types.h @@ -0,0 +1,57 @@ +/* + * Open-iSNS types + * + * Copyright (C) 2007 Olaf Kirch <[email protected]> + */ + +#ifndef ISNS_TYPES_H +#define ISNS_TYPES_H + +typedef struct isns_simple isns_simple_t; +typedef struct isns_source isns_source_t; +typedef struct isns_object isns_object_t; +typedef struct isns_relation isns_relation_t; +typedef struct isns_attr isns_attr_t; +typedef struct isns_attr_list isns_attr_list_t; +typedef struct isns_message isns_message_t; +typedef struct isns_socket isns_socket_t; +typedef struct isns_db isns_db_t; +typedef struct isns_tag_type isns_tag_type_t; +typedef const struct isns_object_template isns_object_template_t; +typedef struct isns_authdata isns_authdata_t; +typedef struct isns_security isns_security_t; +typedef struct isns_principal isns_principal_t; +typedef struct isns_policy isns_policy_t; +typedef struct isns_keystore isns_keystore_t; +typedef struct isns_scope isns_scope_t; +typedef struct isns_portal_info isns_portal_info_t; +typedef struct isns_server isns_server_t; +typedef struct isns_db_event isns_db_event_t; +typedef struct isns_bitvector isns_bitvector_t; + +typedef struct isns_object_list { + unsigned int iol_count; + isns_object_t ** iol_data; +} isns_object_list_t; + +#define ISNS_OBJECT_LIST_INIT { .iol_count = 0, .iol_data = NULL } + +/* + * An attribute list + */ +struct isns_attr_list { + unsigned int ial_count; + isns_attr_t ** ial_data; +}; +#define ISNS_ATTR_LIST_INIT { .ial_count = 0, .ial_data = NULL } + +/* + * Function types. + */ +typedef void isns_print_fn_t(const char *, ...); +typedef void isns_timer_callback_t(void *); + + +#endif /* ISNS_TYPES_H */ + + diff --git a/include/libisns/util.h b/include/libisns/util.h new file mode 100644 index 000000000000..9b192cc188e5 --- /dev/null +++ b/include/libisns/util.h @@ -0,0 +1,288 @@ +/* + * Utility functions + * + * Copyright (C) 2006, 2007 Olaf Kirch <[email protected]> + */ + +#ifndef UTIL_H +#define UTIL_H + +#include <sys/types.h> +#include <stdint.h> +#include <stdio.h> +#include <stddef.h> +#include <string.h> // for strdup +#include <libisns/types.h> + +#define array_num_elements(a) (sizeof(a) / sizeof((a)[0])) + +const char * isns_dirname(const char *); +int isns_mkdir_recursive(const char *); + +extern const char *parser_separators; +char * parser_get_next_line(FILE *); +char * parser_get_next_word(char **); +char * parser_get_rest_of_line(char **); +int parser_split_line(char *, unsigned int, char **); + +unsigned long parse_size(const char *); +unsigned int parse_count(const char *); +int parse_int(const char *); +long long parse_longlong(const char *); +double parse_double(const char *); +unsigned int parse_timeout(const char *); + +char * print_size(unsigned long); + +/* + * Very simple and stupid string array. + */ +struct string_array { + unsigned int count; + char ** list; +}; + +void isns_string_array_append(struct string_array *, const char *); +void isns_string_array_destroy(struct string_array *); + +void isns_assign_string(char **, const char *); + +void isns_write_pidfile(const char *); +void isns_update_pidfile(const char *); +void isns_remove_pidfile(const char *); + +extern void isns_log_background(void); +extern void isns_assert_failed(const char *, + const char *, unsigned int); +extern void isns_fatal(const char *, ...); +extern void isns_warning(const char *, ...); +extern void isns_error(const char *, ...); +extern void isns_notice(const char *, ...); +extern void isns_debug_general(const char *, ...); +extern void isns_debug_socket(const char *, ...); +extern void isns_debug_protocol(const char *, ...); +extern void isns_debug_message(const char *, ...); +extern void isns_debug_state(const char *, ...); +extern void isns_debug_auth(const char *, ...); +extern void isns_debug_scn(const char *, ...); +extern void isns_debug_esi(const char *, ...); +extern void isns_enable_debugging(const char *); +extern int isns_debug_enabled(int); + +enum { + DBG_GENERAL = 0, + DBG_SOCKET, + DBG_PROTOCOL, + DBG_MESSAGE, + DBG_STATE, + DBG_AUTH, + DBG_SCN, + DBG_ESI, +}; + +/* + * There's no htonll yet + */ +#ifndef htonll +# include <endian.h> +# include <byteswap.h> +# if __BYTE_ORDER == __BIG_ENDIAN +# define htonll(x) (x) +# define ntohll(x) (x) +# elif __BYTE_ORDER == __LITTLE_ENDIAN +# define htonll(x) __bswap_64(x) +# define ntohll(x) __bswap_64(x) +# endif +#endif + +/* + * One of the those eternal staples of C coding: + */ +#ifndef MIN +# define MIN(a, b) ((a) < (b)? (a) : (b)) +# define MAX(a, b) ((a) > (b)? (a) : (b)) +#endif + +#define DECLARE_BITMAP(name, NBITS) \ + uint32_t name[(NBITS+31) >> 5] = { 0 } + +#define __BIT_INDEX(nr) (nr >> 5) +#define __BIT_MASK(nr) (1 << (nr & 31)) + +static inline void +set_bit(uint32_t *map, unsigned int nr) +{ + map[__BIT_INDEX(nr)] |= __BIT_MASK(nr); +} + +static inline void +clear_bit(uint32_t *map, unsigned int nr) +{ + map[__BIT_INDEX(nr)] &= ~__BIT_MASK(nr); +} + +static inline int +test_bit(const uint32_t *map, unsigned int nr) +{ + return !!(map[__BIT_INDEX(nr)] & __BIT_MASK(nr)); +} + +/* + * Dynamically sized bit vector + */ +extern isns_bitvector_t *isns_bitvector_alloc(void); +extern void isns_bitvector_init(isns_bitvector_t *); +extern void isns_bitvector_destroy(isns_bitvector_t *); +extern void isns_bitvector_free(isns_bitvector_t *); +extern int isns_bitvector_test_bit(const isns_bitvector_t *, unsigned int); +extern int isns_bitvector_set_bit(isns_bitvector_t *, unsigned int); +extern int isns_bitvector_clear_bit(isns_bitvector_t *, unsigned int); +extern int isns_bitvector_is_empty(const isns_bitvector_t *); +extern int isns_bitvector_intersect(const isns_bitvector_t *a, + const isns_bitvector_t *b, + isns_bitvector_t *result); +extern void isns_bitvector_print(const isns_bitvector_t *, + isns_print_fn_t *); +extern void isns_bitvector_foreach(const isns_bitvector_t *bv, + int (*cb)(uint32_t, void *), + void *user_data); + +/* + * List manipulation primites + */ +typedef struct isns_list isns_list_t; +struct isns_list { + isns_list_t * next; + isns_list_t * prev; +}; + +#define ISNS_LIST_DECLARE(list) \ + isns_list_t list = { &list, &list } + +static inline void +isns_list_init(isns_list_t *head) +{ + head->next = head->prev = head; +} + +static inline void +__isns_list_insert(isns_list_t *prev, isns_list_t *item, isns_list_t *next) +{ + item->next = next; + item->prev = prev; + next->prev = item; + prev->next = item; +} + +static inline void +isns_list_append(isns_list_t *head, isns_list_t *item) +{ + __isns_list_insert(head->prev, item, head); +} + +static inline void +isns_list_insert(isns_list_t *head, isns_list_t *item) +{ + __isns_list_insert(head, item, head->next); +} + +static inline void +isns_item_insert_before(isns_list_t *where, isns_list_t *item) +{ + __isns_list_insert(where->prev, item, where); +} + +static inline void +isns_item_insert_after(isns_list_t *where, isns_list_t *item) +{ + __isns_list_insert(where, item, where->next); +} + +static inline void +isns_list_del(isns_list_t *item) +{ + isns_list_t *prev = item->prev; + isns_list_t *next = item->next; + + prev->next = next; + next->prev = prev; + item->next = item->prev = item; +} + +static inline int +isns_list_empty(const isns_list_t *head) +{ + return head == head->next; +} + +static inline void +isns_list_move(isns_list_t *dst, isns_list_t *src) +{ + isns_list_t *prev, *next; + isns_list_t *head, *tail; + + if (isns_list_empty(src)) + return; + + prev = dst->prev; + next = dst; + + head = src->next; + tail = src->prev; + + next->prev = tail; + prev->next = head; + head->prev = prev; + tail->next = next; + + src->next = src->prev = src; +} + +#define isns_list_item(type, member, ptr) \ + container_of(type, member, ptr) + +#define isns_list_foreach(list, __pos, __next) \ + for (__pos = (list)->next; \ + (__pos != list) && (__next = __pos->next, 1); \ + __pos = __next) + +#if 0 +/* This is defined in stddef */ +#define offsetof(type, member) ((unsigned long) &(((type *) 0)->member)) +#endif +#define container_of(type, member, ptr) \ + ((type *) (((unsigned char *) ptr) - offsetof(type, member))) + +/* + * Use isns_assert instead of libc's assert, so that the + * message can be captured and sent to syslog. + */ +#define isns_assert(condition) do { \ + if (!(condition)) \ + isns_assert_failed(#condition, \ + __FILE__, __LINE__); \ +} while (0) + +#ifndef MDEBUG +# define isns_malloc(size) malloc(size) +# define isns_calloc(n, size) calloc(n, size) +# define isns_realloc(p, size) realloc(p, size) +# define isns_strdup(s) strdup(s) +# define isns_free(p) free(p) +#else +# define isns_malloc(size) isns_malloc_fn(size, __FILE__, __LINE__) +# define isns_calloc(n, size) isns_calloc_fn(n, size, __FILE__, __LINE__) +# define isns_realloc(p, size) isns_realloc_fn(p, size, __FILE__, __LINE__) +# define isns_strdup(s) isns_strdup_fn(s, __FILE__, __LINE__) +# define isns_free(p) isns_free_fn(p, __FILE__, __LINE__) + +extern void * (*isns_malloc_fn)(size_t, const char *, unsigned int); +extern void * (*isns_calloc_fn)(unsigned int, size_t, + const char *, unsigned int); +extern void * (*isns_realloc_fn)(void *, size_t, + const char *, unsigned int); +extern char * (*isns_strdup_fn)(const char *, const char *, unsigned int); +extern void (*isns_free_fn)(void *, const char *, unsigned int); +#endif + +#endif /* UTIL_H */ diff --git a/isns-proto.h b/isns-proto.h deleted file mode 100644 index fbc33767ca65..000000000000 --- a/isns-proto.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - * iSNS protocol definitions - * - * Copyright (C) 2007 Olaf Kirch <[email protected]> - */ - -#ifndef ISNS_PROTO_H -#define ISNS_PROTO_H - -#include <stdint.h> - -struct isns_hdr { - uint16_t i_version; - uint16_t i_function; - uint16_t i_length; - uint16_t i_flags; - uint16_t i_xid; - uint16_t i_seq; -}; - -#define ISNS_VERSION 0x0001 -#define ISNS_MAX_PDU_SIZE 65535 -#define ISNS_DEFAULT_PORT 3205 - -/* - * Values for the i_flags field: - */ -#define ISNS_F_CLIENT 0x8000 -#define ISNS_F_SERVER 0x4000 -#define ISNS_F_AUTHBLK_PRESENT 0x2000 -#define ISNS_F_REPLACE 0x1000 -#define ISNS_F_LAST_PDU 0x0800 -#define ISNS_F_FIRST_PDU 0x0400 - -/* - * Function values - */ -enum isns_function { - ISNS_DEVICE_ATTRIBUTE_REGISTER = 1, - ISNS_DEVICE_ATTRIBUTE_QUERY = 2, - ISNS_DEVICE_GET_NEXT = 3, - ISNS_DEVICE_DEREGISTER = 4, - ISNS_SCN_REGISTER = 5, - ISNS_SCN_DEREGISTER = 6, - ISNS_SCN_EVENT = 7, - ISNS_STATE_CHANGE_NOTIFICATION = 8, - ISNS_DD_REGISTER = 9, - ISNS_DD_DEREGISTER = 10, - ISNS_DDS_REGISTER = 11, - ISNS_DDS_DEREGISTER = 12, - ISNS_ENTITY_STATUS_INQUIRY = 13, - ISNS_HEARTBEAT = 14, -}; - -/* - * iSNS status codes: - */ -enum isns_status { - ISNS_SUCCESS = 0, - ISNS_UNKNOWN_ERROR, - ISNS_MESSAGE_FORMAT_ERROR, - ISNS_INVALID_REGISTRATION, - __ISNS_RESERVED_STATUS, - ISNS_INVALID_QUERY, - ISNS_SOURCE_UNKNOWN, - ISNS_SOURCE_ABSENT, - ISNS_SOURCE_UNAUTHORIZED, - ISNS_NO_SUCH_ENTRY, - ISNS_VERSION_NOT_SUPPORTED, - ISNS_INTERNAL_ERROR, - ISNS_BUSY, - ISNS_OPTION_NOT_UNDERSTOOD, - ISNS_INVALID_UPDATE, - ISNS_MESSAGE_NOT_SUPPORTED, - ISNS_SCN_EVENT_REJECTED, - ISNS_SCN_REGISTRATION_REJECTED, - ISNS_ATTRIBUTE_NOT_IMPLEMENTED, - ISNS_FC_DOMAIN_ID_NOT_AVAILABLE, - ISNS_FC_DOMAIN_ID_NOT_ALLOCATED, - ISNS_ESI_NOT_AVAILABLE, - ISNS_INVALID_DEREGISTRATION, - ISNS_REGISTRATION_FEATURE_NOT_SUPPORTED, -}; - -enum isns_tag { - ISNS_TAG_DELIMITER = 0, - ISNS_TAG_ENTITY_IDENTIFIER = 1, - ISNS_TAG_ENTITY_PROTOCOL = 2, - ISNS_TAG_MGMT_IP_ADDRESS = 3, - ISNS_TAG_TIMESTAMP = 4, - ISNS_TAG_PROTOCOL_VERSION_RANGE = 5, - ISNS_TAG_REGISTRATION_PERIOD = 6, - ISNS_TAG_ENTITY_INDEX = 7, - ISNS_TAG_ENTITY_NEXT_INDEX = 8, - ISNS_TAG_ENTITY_ISAKMP_PHASE_1 = 11, - ISNS_TAG_ENTITY_CERTIFICATE = 12, - ISNS_TAG_PORTAL_IP_ADDRESS = 16, - ISNS_TAG_PORTAL_TCP_UDP_PORT = 17, - ISNS_TAG_PORTAL_SYMBOLIC_NAME = 18, - ISNS_TAG_ESI_INTERVAL = 19, - ISNS_TAG_ESI_PORT = 20, - ISNS_TAG_PORTAL_INDEX = 22, - ISNS_TAG_SCN_PORT = 23, - ISNS_TAG_PORTAL_NEXT_INDEX = 24, - ISNS_TAG_PORTAL_SECURITY_BITMAP = 27, - ISNS_TAG_PORTAL_ISAKMP_PHASE_1 = 28, - ISNS_TAG_PORTAL_ISAKMP_PHASE_2 = 29, - ISNS_TAG_PORTAL_CERTIFICATE = 31, - ISNS_TAG_ISCSI_NAME = 32, - ISNS_TAG_ISCSI_NODE_TYPE = 33, - ISNS_TAG_ISCSI_ALIAS = 34, - ISNS_TAG_ISCSI_SCN_BITMAP = 35, - ISNS_TAG_ISCSI_NODE_INDEX = 36, - ISNS_TAG_WWNN_TOKEN = 37, - ISNS_TAG_ISCSI_NODE_NEXT_INDEX = 38, - ISNS_TAG_ISCSI_AUTHMETHOD = 42, - ISNS_TAG_PG_ISCSI_NAME = 48, - ISNS_TAG_PG_PORTAL_IP_ADDR = 49, - ISNS_TAG_PG_PORTAL_TCP_UDP_PORT = 50, - ISNS_TAG_PG_TAG = 51, - ISNS_TAG_PG_INDEX = 52, - ISNS_TAG_PG_NEXT_INDEX = 53, - ISNS_TAG_FC_PORT_NAME_WWPN = 64, - ISNS_TAG_PORT_ID = 65, - ISNS_TAG_FC_PORT_TYPE = 66, - ISNS_TAG_SYMBOLIC_PORT_NAME = 67, - ISNS_TAG_FABRIC_PORT_NAME = 68, - ISNS_TAG_HARD_ADDRESS = 69, - ISNS_TAG_PORT_IP_ADDRESS = 70, - ISNS_TAG_CLASS_OF_SERVICE = 71, - ISNS_TAG_FC4_TYPES = 72, - ISNS_TAG_FC4_DESCRIPTOR = 73, - ISNS_TAG_FC4_FEATURES = 74, - ISNS_TAG_IFCP_SCN_BITMAP = 75, - ISNS_TAG_PORT_ROLE = 76, - ISNS_TAG_PERMANENT_PORT_NAME = 77, - ISNS_TAG_FC4_TYPE_CODE = 95, - ISNS_TAG_FC_NODE_NAME_WWNN = 96, - ISNS_TAG_SYMBOLIC_NODE_NAME = 97, - ISNS_TAG_NODE_IP_ADDRESS = 98, - ISNS_TAG_NODE_IPA = 99, - ISNS_TAG_PROXY_ISCSI_NAME = 101, - ISNS_TAG_SWITCH_NAME = 128, - ISNS_TAG_PREFERRED_ID = 129, - ISNS_TAG_ASSIGNED_ID = 130, - ISNS_TAG_VIRTUAL_FABRIC_ID = 131, - ISNS_TAG_SERVER_VENDOR_OUI = 256, - ISNS_TAG_DD_SET_ID = 2049, - ISNS_TAG_DD_SET_SYMBOLIC_NAME = 2050, - ISNS_TAG_DD_SET_STATUS = 2051, - ISNS_TAG_DD_SET_NEXT_ID = 2052, - ISNS_TAG_DD_ID = 2065, - ISNS_TAG_DD_SYMBOLIC_NAME = 2066, - ISNS_TAG_DD_MEMBER_ISCSI_INDEX = 2067, - ISNS_TAG_DD_MEMBER_ISCSI_NAME = 2068, - ISNS_TAG_DD_MEMBER_FC_PORT_NAME = 2069, - ISNS_TAG_DD_MEMBER_PORTAL_INDEX = 2070, - ISNS_TAG_DD_MEMBER_PORTAL_IP_ADDR = 2071, - ISNS_TAG_DD_MEMBER_PORTAL_TCP_UDP_PORT = 2072, - ISNS_TAG_DD_FEATURES = 2078, - ISNS_TAG_DD_NEXT_ID = 2079, - - __ISNS_TAG_MAX, - - ISNS_VENDOR_SPECIFIC_SERVER_BASE = 257, /* end 384 */ - ISNS_VENDOR_SPECIFIC_ENTITY_BASE = 385, /* end 512 */ - ISNS_VENDOR_SPECIFIC_PORTAL_BASE = 513, /* end 640 */ - ISNS_VENDOR_SPECIFIC_NODE_BASE = 641, /* end 768 */ - ISNS_VENDOR_SPECIFIC_DD_BASE = 1024, /* end 1280 */ - ISNS_VENDOR_SPECIFIC_DDSET_BASE = 1281, /* end 1536 */ - ISNS_VENDOR_SPECIFIC_OTHER_BASE = 1537, /* end 2048 */ -}; - -typedef enum isns_entity_protocol { - ISNS_ENTITY_PROTOCOL_NONE = 1, - ISNS_ENTITY_PROTOCOL_ISCSI = 2, - ISNS_ENTITY_PROTOCOL_IFCP = 3, -} isns_entity_protocol_t; - -enum isns_iscsi_node_type_bits { - ISNS_ISCSI_NODE_TYPE_TARGET = 0, - ISNS_ISCSI_NODE_TYPE_INITIATOR = 1, - ISNS_ISCSI_NODE_TYPE_CONTROL = 2, -}; -#define ISNS_ISCSI_INITIATOR_MASK (1 << ISNS_ISCSI_NODE_TYPE_INITIATOR) -#define ISNS_ISCSI_TARGET_MASK (1 << ISNS_ISCSI_NODE_TYPE_TARGET) -#define ISNS_ISCSI_CONTROL_MASK (1 << ISNS_ISCSI_NODE_TYPE_CONTROL) - -enum isns_portal_port_bits { - ISNS_PORTAL_PORT_UDP = 16, -}; -#define ISNS_PORTAL_PORT_UDP_MASK (1 << ISNS_PORTAL_PORT_UDP) - -enum isns_portal_security_bits { - ISNS_PORTAL_SEC_BITMAP_VALID = 0, - ISNS_PORTAL_SEC_IPSEC_ENABLED = 1, - ISNS_PORTAL_SEC_MAIN_MODE_ENABLED = 2, - ISNS_PORTAL_SEC_AGGR_MODE_ENABLED = 3, - ISNS_PORTAL_SEC_PFS_ENABLED = 4, - ISNS_PORTAL_SEC_TRANSPORT_MODE_PREFERRED = 5, - ISNS_PORTAL_SEC_TUNNEL_MODE_PREFERRED = 6, -}; -#define ISNS_PORTAL_SEC_BITMAP_VALID_MASK (1 << ISNS_PORTAL_SEC_BITMAP_VALID) -#define ISNS_PORTAL_SEC_IPSEC_ENABLED_MASK (1 << ISNS_PORTAL_SEC_IPSEC_ENABLED) -#define ISNS_PORTAL_SEC_MAIN_MODE_ENABLED_MASK (1 << ISNS_PORTAL_SEC_MAIN_MODE_ENABLED) -#define ISNS_PORTAL_SEC_AGGR_MODE_ENABLED_MASK (1 << ISNS_PORTAL_SEC_AGGR_MODE_ENABLED) -#define ISNS_PORTAL_SEC_PFS_ENABLED_MASK (1 << ISNS_PORTAL_SEC_PFS_ENABLED) -#define ISNS_PORTAL_SEC_TRANSPORT_MODE_PREFERRED_MASK (1 << ISNS_PORTAL_SEC_TRANSPORT_MODE_PREFERRED) -#define ISNS_PORTAL_SEC_TUNNEL_MODE_PREFERRED_MASK (1 << ISNS_PORTAL_SEC_TUNNEL_MODE_PREFERRED) - -enum isns_scn_bits { - ISNS_SCN_DD_MEMBER_ADDED = 0, - ISNS_SCN_DD_MEMBER_REMOVED = 1, - ISNS_SCN_OBJECT_UPDATED = 2, - ISNS_SCN_OBJECT_ADDED = 3, - ISNS_SCN_OBJECT_REMOVED = 4, - ISNS_SCN_MANAGEMENT_REGISTRATION = 5, - ISNS_SCN_TARGET_AND_SELF_ONLY = 6, - ISNS_SCN_INITIATOR_AND_SELF_ONLY = 7, -}; -#define ISNS_SCN_DD_MEMBER_ADDED_MASK (1 << ISNS_SCN_DD_MEMBER_ADDED) -#define ISNS_SCN_DD_MEMBER_REMOVED_MASK (1 << ISNS_SCN_DD_MEMBER_REMOVED) -#define ISNS_SCN_OBJECT_UPDATED_MASK (1 << ISNS_SCN_OBJECT_UPDATED) -#define ISNS_SCN_OBJECT_ADDED_MASK (1 << ISNS_SCN_OBJECT_ADDED) -#define ISNS_SCN_OBJECT_REMOVED_MASK (1 << ISNS_SCN_OBJECT_REMOVED) -#define ISNS_SCN_MANAGEMENT_REGISTRATION_MASK (1 << ISNS_SCN_MANAGEMENT_REGISTRATION) -#define ISNS_SCN_TARGET_AND_SELF_ONLY_MASK (1 << ISNS_SCN_TARGET_AND_SELF_ONLY) -#define ISNS_SCN_INITIATOR_AND_SELF_ONLY_MASK (1 << ISNS_SCN_INITIATOR_AND_SELF_ONLY) - -enum isns_dds_status_bits { - ISNS_DDS_ENABLED = 0, -}; -#define ISNS_DDS_ENABLED_MASK (1 << ISNS_DDS_ENABLED) - -enum isns_dd_feature_bits { - ISNS_DD_BOOT_LIST_ENABLED = 0, -}; -#define ISNS_DD_BOOT_LIST_ENABLED_MASK (1 << ISN_BOOT_LIST_DDS_ENABLED) - -#define ISNS_PAD(len) (((len) + 3) & ~3UL) - -/* - * iSNS auth block - */ -#define ISNS_AUTHBLK_SIZE 20 -struct isns_authblk { - uint32_t iab_bsd; /* 16bit in SLP */ - uint32_t iab_length; /* 16bit in SLP */ - uint64_t iab_timestamp; /* 32bit in SLP */ - uint32_t iab_spi_len; /* 16bit in SLP */ - - char * iab_spi; - void * iab_sig; - uint32_t iab_sig_len; -} __attribute__((packed)); - -#define ISNS_AUTH_TYPE_SHA1_DSA 0x0002 - -#endif /* ISNS_PROTO_H */ diff --git a/isns.h b/isns.h deleted file mode 100644 index fa6ec3725c84..000000000000 --- a/isns.h +++ /dev/null @@ -1,676 +0,0 @@ -/* - * iSNS implementation - library header file. - * - * Copyright (C) 2007 Olaf Kirch <[email protected]> - * - * This file contains all declarations and definitions - * commonly required by users of libisns. - */ - -#ifndef ISNS_H -#define ISNS_H - -#include <sys/socket.h> -#include <netinet/in.h> -#include <stdio.h> - -#include <isns-proto.h> -#include "types.h" - -#define ISNS_MAX_BUFFER 8192 -#define ISNS_MAX_MESSAGE 8192 - - -/* - * Client handle - */ -typedef struct isns_client isns_client_t; -struct isns_client { - isns_source_t * ic_source; - isns_socket_t * ic_socket; -}; - -/* - * Server operations - */ -typedef int isns_service_fn_t(isns_server_t *, isns_simple_t *, isns_simple_t **); -typedef void isns_scn_callback_fn_t(isns_db_t *, uint32_t scn_bits, - isns_object_template_t *node_type, - const char *node_name, - const char *recipient); -struct isns_service_ops { - isns_service_fn_t * process_registration; - isns_service_fn_t * process_query; - isns_service_fn_t * process_getnext; - isns_service_fn_t * process_deregistration; - isns_service_fn_t * process_scn_registration; - isns_service_fn_t * process_scn_deregistration; - isns_service_fn_t * process_scn_event; - isns_service_fn_t * process_scn; - isns_service_fn_t * process_dd_registration; - isns_service_fn_t * process_dd_deregistration; - isns_service_fn_t * process_esi; - isns_service_fn_t * process_heartbeat; -}; - -extern struct isns_service_ops isns_default_service_ops; -extern struct isns_service_ops isns_callback_service_ops; - -/* - * Output function - */ -void isns_print_stdout(const char *, ...); - -/* - * Database events - */ -struct isns_db_event { - isns_object_t * ie_recipient; /* Recipient node or NULL */ - isns_object_t * ie_object; /* Affected object */ - isns_object_t * ie_trigger; /* Triggering object */ - unsigned int ie_bits; /* SCN bitmask */ -}; -typedef void isns_db_callback_t(const isns_db_event_t *, - void *user_data); - -/* - * Handling of client objects - */ -extern isns_client_t * isns_create_default_client(isns_security_t *); -extern isns_client_t * isns_create_client(isns_security_t *, - const char *source_name); -extern isns_client_t * isns_create_local_client(isns_security_t *, - const char *source_name); -extern int isns_client_call(isns_client_t *, - isns_simple_t **inout); -extern void isns_client_destroy(isns_client_t *); -extern int isns_client_get_local_address(const isns_client_t *, - isns_portal_info_t *); - -/* - * Handling of server objects - */ -extern isns_server_t * isns_create_server(isns_source_t *, - isns_db_t *, - struct isns_service_ops *); -extern void isns_server_set_scn_callback(isns_server_t *, - isns_scn_callback_fn_t *); - - -/* - * Handling of source names - */ -extern int isns_init_names(void); -extern const char * isns_default_source_name(void); -extern isns_source_t * isns_source_create(isns_attr_t *); -extern isns_source_t * isns_source_create_iscsi(const char *name); -extern isns_source_t * isns_source_create_ifcp(const char *name); -extern uint32_t isns_source_type(const isns_source_t *); -extern const char * isns_source_name(const isns_source_t *); -extern isns_attr_t * isns_source_attr(const isns_source_t *); -extern isns_source_t * isns_source_get(isns_source_t *); -extern isns_source_t * isns_source_from_object(const isns_object_t *); -extern void isns_source_release(isns_source_t *); -extern int isns_source_match(const isns_source_t *, - const isns_source_t *); - -extern void isns_server_set_source(isns_source_t *); -extern isns_message_t * isns_process_message(isns_server_t *, isns_message_t *); - -extern void isns_simple_print(isns_simple_t *, - isns_print_fn_t *); -extern int isns_simple_call(isns_socket_t *, - isns_simple_t **); -extern int isns_simple_transmit(isns_socket_t *, - isns_simple_t *, - const isns_portal_info_t *, - unsigned int, - void (*callback)(uint32_t, int, - isns_simple_t *)); -extern void isns_simple_free(isns_simple_t *); -extern const isns_attr_list_t *isns_simple_get_attrs(isns_simple_t *); - -extern isns_simple_t * isns_create_query(isns_client_t *clnt, - const isns_attr_list_t *query_key); -extern isns_simple_t * isns_create_query2(isns_client_t *clnt, - const isns_attr_list_t *query_key, - isns_source_t *source); -extern int isns_query_request_attr_tag(isns_simple_t *, - uint32_t); -extern int isns_query_request_attr(isns_simple_t *, - isns_attr_t *); -extern int isns_query_response_get_objects(isns_simple_t *qry, - isns_object_list_t *result); - -extern isns_simple_t * isns_create_registration(isns_client_t *clnt, - isns_object_t *key_object); -extern isns_simple_t * isns_create_registration2(isns_client_t *clnt, - isns_object_t *key_object, - isns_source_t *source); -extern void isns_registration_set_replace(isns_simple_t *, int); -extern void isns_registration_add_object(isns_simple_t *, - isns_object_t *object); -extern void isns_registration_add_object_list(isns_simple_t *, - isns_object_list_t *); -extern int isns_registration_response_get_objects(isns_simple_t *, - isns_object_list_t *); - -extern isns_simple_t * isns_create_getnext(isns_client_t *, - isns_object_template_t *, - const isns_attr_list_t *); -extern int isns_getnext_response_get_object(isns_simple_t *, - isns_object_t **); -extern isns_simple_t * isns_create_getnext_followup(isns_client_t *, - const isns_simple_t *, - const isns_attr_list_t *); - -extern isns_simple_t * isns_create_deregistration(isns_client_t *clnt, - const isns_attr_list_t *); - -extern isns_simple_t * isns_create_scn_registration(isns_client_t *clnt, - unsigned int); -extern isns_simple_t * isns_create_scn_registration2(isns_client_t *clnt, - unsigned int, - isns_source_t *); - -extern int isns_dd_load_all(isns_db_t *); -extern void isns_dd_get_members(uint32_t, isns_object_list_t *, int); -extern isns_simple_t * isns_create_dd_registration(isns_client_t *, - const isns_attr_list_t *); -extern isns_simple_t * isns_create_dd_deregistration(isns_client_t *, - uint32_t, const isns_attr_list_t *); - -extern isns_object_t * isns_create_object(isns_object_template_t *, - const isns_attr_list_t *, - isns_object_t *); -extern isns_object_t * isns_create_entity(int, const char *); -extern isns_object_t * isns_create_entity_for_source(const isns_source_t *, - const char *); -extern const char * isns_entity_name(const isns_object_t *); -extern isns_object_t * isns_create_portal(const isns_portal_info_t *, - isns_object_t *parent); -extern isns_object_t * isns_create_storage_node(const char *name, - uint32_t type_mask, - isns_object_t *parent); -extern isns_object_t * isns_create_storage_node2(const isns_source_t *, - uint32_t type_mask, - isns_object_t *parent); -extern isns_object_t * isns_create_iscsi_initiator(const char *name, - isns_object_t *parent); -extern isns_object_t * isns_create_iscsi_target(const char *name, - isns_object_t *parent); -extern const char * isns_storage_node_name(const isns_object_t *); -extern isns_attr_t * isns_storage_node_key_attr(const isns_object_t *); -extern isns_object_t * isns_create_portal_group(isns_object_t *portal, - isns_object_t *iscsi_node, uint32_t pg_tag); -extern isns_object_t * isns_create_default_portal_group(isns_db_t *, - isns_object_t *portal, - isns_object_t *node); -extern void isns_get_portal_groups(isns_object_t *portal, - isns_object_t *node, - isns_object_list_t *result); - -extern const char * isns_object_template_name(isns_object_template_t *); -extern int isns_object_set_attr(isns_object_t *, isns_attr_t *); -extern int isns_object_set_attrlist(isns_object_t *, const isns_attr_list_t *); -extern isns_object_t * isns_object_get(isns_object_t *); -extern int isns_object_get_attrlist(isns_object_t *obj, - isns_attr_list_t *result, - const isns_attr_list_t *requested_attrs); -extern int isns_object_get_key_attrs(isns_object_t *, - isns_attr_list_t *); -extern int isns_object_get_attr(const isns_object_t *, uint32_t, - isns_attr_t **); -extern void isns_object_get_related(isns_db_t *, - isns_object_t *, isns_object_list_t *); -extern void isns_object_get_descendants(const isns_object_t *, - isns_object_template_t *, - isns_object_list_t *); -extern void isns_object_release(isns_object_t *); -extern int isns_object_match(const isns_object_t *, - const isns_attr_list_t *); -extern isns_object_t * isns_object_get_entity(isns_object_t *); -extern int isns_object_attr_valid(isns_object_template_t *, uint32_t); -extern int isns_object_contains(const isns_object_t *, const isns_object_t *); -extern int isns_object_delete_attr(isns_object_t *, uint32_t); -extern int isns_object_is(const isns_object_t *, - isns_object_template_t *); -extern int isns_object_is_entity(const isns_object_t *); -extern int isns_object_is_iscsi_node(const isns_object_t *); -extern int isns_object_is_fc_port(const isns_object_t *); -extern int isns_object_is_fc_node(const isns_object_t *); -extern int isns_object_is_portal(const isns_object_t *); -extern int isns_object_is_pg(const isns_object_t *); -extern int isns_object_is_policy(const isns_object_t *); -extern int isns_object_is_dd(const isns_object_t *); -extern int isns_object_is_ddset(const isns_object_t *); -extern void isns_object_print(isns_object_t *, - isns_print_fn_t *); -extern time_t isns_object_last_modified(const isns_object_t *); -extern int isns_object_mark_membership(isns_object_t *, uint32_t); -extern int isns_object_clear_membership(isns_object_t *, uint32_t); -extern int isns_object_test_membership(const isns_object_t *, uint32_t); -extern int isns_object_test_visibility(const isns_object_t *, - const isns_object_t *); -extern void isns_object_get_visible(const isns_object_t *, - isns_db_t *, isns_object_list_t *); -extern void isns_entity_touch(isns_object_t *); -extern int isns_object_extract_keys(const isns_object_t *, - isns_attr_list_t *); -extern int isns_object_extract_all(const isns_object_t *, - isns_attr_list_t *); -extern int isns_object_extract_writable(const isns_object_t *, - isns_attr_list_t *); - - -extern int isns_object_set_nil(isns_object_t *obj, - uint32_t tag); -extern int isns_object_set_string(isns_object_t *obj, - uint32_t tag, - const char *value); -extern int isns_object_set_uint32(isns_object_t *obj, - uint32_t tag, - uint32_t value); -extern int isns_object_set_uint64(isns_object_t *obj, - uint32_t tag, - uint64_t value); -extern int isns_object_set_ipaddr(isns_object_t *obj, - uint32_t tag, - const struct in6_addr *value); - -extern int isns_object_get_string(const isns_object_t *, - uint32_t, - const char **); -extern int isns_object_get_ipaddr(const isns_object_t *, - uint32_t, - struct in6_addr *); -extern int isns_object_get_uint32(const isns_object_t *, - uint32_t, - uint32_t *); -extern int isns_object_get_uint64(const isns_object_t *, - uint32_t, - uint64_t *); -extern int isns_object_get_opaque(const isns_object_t *, - uint32_t, - const void **, size_t *); - - -extern int isns_object_find_descendants(isns_object_t *obj, - isns_object_template_t *, - const isns_attr_list_t *keys, - isns_object_list_t *result); -extern isns_object_t * isns_object_find_descendant(isns_object_t *obj, - const isns_attr_list_t *keys); -extern int isns_object_detach(isns_object_t *); -extern int isns_object_attach(isns_object_t *, isns_object_t *); -extern void isns_object_prune_attrs(isns_object_t *); -extern void isns_mark_object(isns_object_t *, unsigned int); - -extern int isns_get_entity_identifier(isns_object_t *, const char **); -extern int isns_get_entity_protocol(isns_object_t *, isns_entity_protocol_t *); -extern int isns_get_entity_index(isns_object_t *, uint32_t *); - -extern int isns_get_portal_ipaddr(isns_object_t *, struct in6_addr *); -extern int isns_get_portal_tcpudp_port(isns_object_t *, - int *ipprotocol, uint16_t *port); -extern int isns_get_portal_index(isns_object_t *, uint32_t *); - -extern int isns_get_address(struct sockaddr_storage *, - const char *, const char *, int, int, int); -extern char * isns_get_canon_name(const char *); - -extern isns_db_t * isns_db_open(const char *location); -extern isns_db_t * isns_db_open_shadow(isns_object_list_t *); -extern isns_object_t * isns_db_lookup(isns_db_t *, - isns_object_template_t *, - const isns_attr_list_t *); -extern isns_object_t * isns_db_vlookup(isns_db_t *, - isns_object_template_t *, - ...); -extern int isns_db_gang_lookup(isns_db_t *, - isns_object_template_t *, - const isns_attr_list_t *, - isns_object_list_t *); -extern isns_object_t * isns_db_get_next(isns_db_t *, - isns_object_template_t *, - const isns_attr_list_t *current, - const isns_attr_list_t *scope, - const isns_source_t *source); -extern isns_object_t * isns_db_lookup_source_node(isns_db_t *, - const isns_source_t *); -extern void isns_db_get_domainless(isns_db_t *, - isns_object_template_t *, - isns_object_list_t *); -extern uint32_t isns_db_allocate_index(isns_db_t *); -extern void isns_db_insert(isns_db_t *, isns_object_t *); -extern void isns_db_insert_limbo(isns_db_t *, isns_object_t *); -extern int isns_db_remove(isns_db_t *, isns_object_t *); -extern time_t isns_db_expire(isns_db_t *); -extern void isns_db_purge(isns_db_t *); -extern void isns_db_sync(isns_db_t *); -extern const char * isns_db_generate_eid(isns_db_t *, char *, size_t); -extern isns_object_t * isns_db_get_control(isns_db_t *); -extern void isns_db_print(isns_db_t *, - isns_print_fn_t *); - -extern void isns_db_begin_transaction(isns_db_t *); -extern void isns_db_commit(isns_db_t *); -extern void isns_db_rollback(isns_db_t *); - -extern void isns_object_event(isns_object_t *obj, - unsigned int bits, - isns_object_t *trigger); -extern void isns_unicast_event(isns_object_t *dst, - isns_object_t *obj, - unsigned int bits, - isns_object_t *trigger); -extern void isns_register_callback(isns_db_callback_t *, - void *); -extern void isns_flush_events(void); -extern const char * isns_event_string(unsigned int); - -extern void isns_add_timer(unsigned int, - isns_timer_callback_t *, void *); -extern void isns_add_oneshot_timer(unsigned int, - isns_timer_callback_t *, void *); -extern void isns_cancel_timer(isns_timer_callback_t *, void *); -extern time_t isns_run_timers(void); - -extern void isns_object_list_init(isns_object_list_t *); -extern void isns_object_list_destroy(isns_object_list_t *); -extern int isns_object_list_contains(const isns_object_list_t *, - isns_object_t *); -extern void isns_object_list_append(isns_object_list_t *, - isns_object_t *); -extern void isns_object_list_append_list(isns_object_list_t *, - const isns_object_list_t *); -extern isns_object_t * isns_object_list_lookup(const isns_object_list_t *, - isns_object_template_t *, - const isns_attr_list_t *); -extern int isns_object_list_gang_lookup(const isns_object_list_t *, - isns_object_template_t *, - const isns_attr_list_t *, - isns_object_list_t *); -extern int isns_object_list_remove(isns_object_list_t *, - isns_object_t *); -extern void isns_object_list_uniq(isns_object_list_t *); -extern void isns_object_list_print(const isns_object_list_t *, - isns_print_fn_t *); - -isns_object_template_t *isns_object_template_for_key_attrs(const isns_attr_list_t *); -isns_object_template_t *isns_object_template_for_tag(uint32_t); -isns_object_template_t *isns_object_template_for_index_tag(uint32_t); -isns_object_template_t *isns_object_template_find(uint32_t); - -extern int isns_attr_set(isns_attr_t *, const void *); -extern isns_attr_t * isns_attr_get(isns_attr_t *); -extern void isns_attr_release(isns_attr_t *); -extern void isns_attr_print(const isns_attr_t *, - isns_print_fn_t *); -extern char * isns_attr_print_value(const isns_attr_t *, - char *, size_t); -extern int isns_attr_match(const isns_attr_t *, - const isns_attr_t *); -extern int isns_attr_compare(const isns_attr_t *, - const isns_attr_t *); -extern isns_attr_t * isns_attr_from_string(uint32_t, const char *); - -extern void isns_attr_list_print(const isns_attr_list_t *, - isns_print_fn_t *); - -extern void isns_attr_list_init(isns_attr_list_t *); -extern void isns_attr_list_copy(isns_attr_list_t *, - const isns_attr_list_t *); -extern void isns_attr_list_destroy(isns_attr_list_t *); -extern int isns_attr_list_remove_tag(isns_attr_list_t *, - uint32_t); - -extern void isns_attr_list_append_attr(isns_attr_list_t *, - isns_attr_t *); -extern void isns_attr_list_append_list(isns_attr_list_t *, - const isns_attr_list_t *); -extern int isns_attr_list_replace_attr(isns_attr_list_t *, - isns_attr_t *); -/* Warning: this does *NOT* return a reference to the attribute */ -extern int isns_attr_list_get_attr(const isns_attr_list_t *, - uint32_t tag, - isns_attr_t **); - -extern void isns_attr_list_append_nil(isns_attr_list_t *, - uint32_t tag); -extern void isns_attr_list_append_string(isns_attr_list_t *, - uint32_t tag, const char *value); -extern void isns_attr_list_append_uint32(isns_attr_list_t *, - uint32_t tag, uint32_t value); -extern void isns_attr_list_append_uint64(isns_attr_list_t *, - uint32_t, int64_t); -extern void isns_attr_list_append_int32(isns_attr_list_t *, - uint32_t tag, int32_t value); -extern void isns_attr_list_append_opaque(isns_attr_list_t *, - uint32_t tag, const void *ptr, size_t len); -extern void isns_attr_list_append_ipaddr(isns_attr_list_t *, - uint32_t tag, const struct in6_addr *); - -extern int isns_attr_list_append(isns_attr_list_t *, - uint32_t tag, const void *); -extern int isns_attr_list_update(isns_attr_list_t *, - uint32_t tag, const void *); - -extern int isns_attr_list_contains(const isns_attr_list_t *, - uint32_t tag); -extern int isns_attr_list_compare(const isns_attr_list_t *, - const isns_attr_list_t *); - -/* - * Helper macros - */ -#define ISNS_ATTR_TYPE_CHECK(attr, type) \ - ((attr)->ia_value.iv_type == &isns_attr_type_##type) -#define ISNS_ATTR_IS_NIL(attr) \ - ISNS_ATTR_TYPE_CHECK(attr, nil) -#define ISNS_ATTR_IS_STRING(attr) \ - ISNS_ATTR_TYPE_CHECK(attr, string) -#define ISNS_ATTR_IS_IPADDR(attr) \ - ISNS_ATTR_TYPE_CHECK(attr, ipaddr) -#define ISNS_ATTR_IS_UINT32(attr) \ - ISNS_ATTR_TYPE_CHECK(attr, uint32) -#define ISNS_ATTR_IS_UINT64(attr) \ - ISNS_ATTR_TYPE_CHECK(attr, uint64) -#define ISNS_ATTR_IS_OPAQUE(attr) \ - ISNS_ATTR_TYPE_CHECK(attr, opaque) - - - -extern isns_socket_t * isns_create_server_socket(const char *hostname, const char *portname, - int af_hint, int sock_type); -extern isns_socket_t * isns_create_client_socket(const char *hostname, const char *portname, - int af_hint, int sock_type); -extern isns_socket_t * isns_create_systemd_socket(int index); -extern isns_socket_t * isns_create_bound_client_socket(const char *myaddr, - const char *hostname, const char *portname, - int af_hint, int sock_type); -extern isns_socket_t * isns_connect_to_portal(const isns_portal_info_t *); -extern void isns_socket_set_report_failure(isns_socket_t *); -extern void isns_socket_set_disconnect_fatal(isns_socket_t *); -extern int isns_socket_get_local_addr(const isns_socket_t *, - struct sockaddr_storage *); -extern int isns_socket_get_portal_info(const isns_socket_t *, - isns_portal_info_t *); -extern void isns_socket_set_security_ctx(isns_socket_t *, - isns_security_t *); -extern isns_message_t * isns_recv_message(struct timeval *timeout); -extern isns_message_t * isns_socket_call(isns_socket_t *, isns_message_t *, long); -extern int isns_socket_send(isns_socket_t *, isns_message_t *); -extern void isns_socket_free(isns_socket_t *); -extern int isns_addr_get_port(const struct sockaddr *); -extern void isns_addr_set_port(struct sockaddr *, unsigned int); -extern isns_socket_t * isns_socket_find_server(const isns_portal_info_t *); - -extern isns_message_t * isns_create_message(uint16_t function, uint16_t flags); -extern isns_message_t * isns_create_reply(const isns_message_t *); -extern int isns_message_init(isns_message_t *, - uint16_t, uint16_t, size_t); -extern int isns_message_status(isns_message_t *); -extern void isns_message_release(isns_message_t *); -extern unsigned int isns_message_function(const isns_message_t *); -extern isns_socket_t * isns_message_socket(const isns_message_t *); -extern void isns_message_set_error(isns_message_t *, uint32_t); - -extern const char * isns_strerror(enum isns_status); -extern const char * isns_function_name(unsigned int); - -/* - * Security related functions - */ -extern int isns_security_init(void); -extern isns_principal_t *isns_security_load_privkey(isns_security_t *, - const char *filename); -extern isns_principal_t *isns_security_load_pubkey(isns_security_t *, - const char *filename); -extern isns_security_t *isns_default_security_context(int server_only); -extern isns_security_t *isns_control_security_context(int server_only); -extern isns_security_t *isns_create_dsa_context(void); -extern void isns_security_set_identity(isns_security_t *, isns_principal_t *); -extern void isns_principal_free(isns_principal_t *); -extern void isns_add_principal(isns_security_t *, isns_principal_t *); -extern isns_keystore_t *isns_create_keystore(const char *); -extern void isns_security_set_keystore(isns_security_t *, - isns_keystore_t *); -extern void isns_principal_set_name(isns_principal_t *, const char *); -extern const char * isns_principal_name(const isns_principal_t *); - -extern isns_object_template_t isns_entity_template; -extern isns_object_template_t isns_portal_template; -extern isns_object_template_t isns_iscsi_node_template; -extern isns_object_template_t isns_fc_port_template; -extern isns_object_template_t isns_fc_node_template; -extern isns_object_template_t isns_iscsi_pg_template; -extern isns_object_template_t isns_dd_template; -extern isns_object_template_t isns_ddset_template; - -/* - * Config file parser - */ -struct isns_config { - char * ic_host_name; - char * ic_auth_name; - char * ic_source_name; - char * ic_source_suffix; - char * ic_entity_name; - char * ic_iqn_prefix; - - char * ic_server_name; - char * ic_bind_address; - char * ic_database; - char * ic_auth_key_file; - char * ic_server_key_file; - char * ic_client_keystore; - char * ic_control_socket; - char * ic_pidfile; - char * ic_local_registry_file; - int ic_security; - int ic_slp_register; - - char * ic_control_name; - char * ic_control_key_file; - - unsigned int ic_registration_period; - unsigned int ic_scn_timeout; - unsigned int ic_scn_retries; - char * ic_scn_callout; - - unsigned int ic_esi_max_interval; - unsigned int ic_esi_min_interval; - unsigned int ic_esi_retries; - - unsigned int ic_use_default_domain; - - struct { - unsigned int policy; - unsigned int replay_window; - unsigned int timestamp_jitter; - int allow_unknown_peers; - } ic_auth; - struct { - unsigned int max_sockets; - unsigned int connect_timeout; - unsigned int reconnect_timeout; - unsigned int call_timeout; - unsigned int udp_retrans_timeout; - unsigned int tcp_retrans_timeout; - unsigned int idle_timeout; - } ic_network; - struct { - char * param_file; - unsigned int key_bits; - } ic_dsa; - -}; - -extern struct isns_config isns_config; -extern int isns_read_initiatorname(const char *); -extern int isns_read_config(const char *); -extern int isns_config_set(const char *, char *); - -/* - * Reserved entity name for Policy information - */ -#define ISNS_ENTITY_CONTROL "CONTROL" - - -/* - * Helpers to deal with portal information - */ -struct isns_portal_info { - struct sockaddr_in6 addr; - int proto; -}; - -extern void isns_portal_init(isns_portal_info_t *, - const struct sockaddr *, int); -extern int isns_portal_parse(isns_portal_info_t *portal, - const char *addr_spec, - const char *default_port); -extern int isns_portal_from_attr_list(isns_portal_info_t *, - uint32_t addr_tag, uint32_t port_tag, - const isns_attr_list_t *); -extern int isns_portal_from_attr_pair(isns_portal_info_t *, - const isns_attr_t *, - const isns_attr_t *); -extern int isns_portal_from_object(isns_portal_info_t *, - uint32_t addr_tag, uint32_t port_tag, - const isns_object_t *); -extern int isns_portal_from_sockaddr(isns_portal_info_t *, - const struct sockaddr_storage *); -extern int isns_portal_to_sockaddr(const isns_portal_info_t *, - struct sockaddr_storage *); -extern int isns_portal_to_attr_list(const isns_portal_info_t *, - uint32_t addr_tag, uint32_t port_tag, - isns_attr_list_t *); -extern int isns_portal_to_object(const isns_portal_info_t *, - uint32_t addr_tag, uint32_t port_tag, - isns_object_t *); -extern int isns_portal_is_wildcard(const isns_portal_info_t *); -extern uint32_t isns_portal_tcpudp_port(const isns_portal_info_t *); -extern const char * isns_portal_string(const isns_portal_info_t *); -extern int isns_portal_equal(const isns_portal_info_t *, - const isns_portal_info_t *); -extern int isns_enumerate_portals(isns_portal_info_t *, - unsigned int); -extern int isns_get_nr_portals(void); - -/* Local registry stuff */ -extern int isns_local_registry_load(const char *, pid_t, isns_object_list_t *); -extern int isns_local_registry_store(const char *, pid_t, const isns_object_list_t *); -extern int isns_local_registry_purge(const char *, pid_t); - -/* Should go somwhere else .*/ -extern int isns_esi_enabled; - -extern void isns_esi_init(isns_server_t *); -extern void isns_esi_register(isns_object_t *); - -extern void isns_scn_init(isns_server_t *); -extern time_t isns_scn_transmit_all(void); - -#endif /* ISNS_H */ diff --git a/isnsadm.c b/isnsadm.c index c170595372da..184a22fb84d7 100644 --- a/isnsadm.c +++ b/isnsadm.c @@ -12,13 +12,13 @@ #include <limits.h> #include "config.h" -#include "isns.h" -#include "util.h" +#include <libisns/isns.h> +#include <libisns/util.h> #include "vendor.h" -#include "attrs.h" +#include <libisns/attrs.h> #include "security.h" #include "objects.h" -#include "paths.h" +#include <libisns/paths.h> #define ISNS_DEFAULT_PORT_INITIATOR 860 #define ISNS_DEFAULT_PORT_TARGET 3260 diff --git a/isnsd.c b/isnsd.c index b8a41c4e2fcc..9d383de246ad 100644 --- a/isnsd.c +++ b/isnsd.c @@ -16,10 +16,10 @@ # include <mcheck.h> #endif -#include <isns.h> +#include <libisns/isns.h> #include "security.h" -#include "util.h" -#include "paths.h" +#include <libisns/util.h> +#include <libisns/paths.h> #include "internal.h" enum { diff --git a/isnsdd.c b/isnsdd.c index 5b0dfb4c56fe..0b034cbd3563 100644 --- a/isnsdd.c +++ b/isnsdd.c @@ -22,13 +22,13 @@ # include <mcheck.h> #endif -#include <isns.h> +#include <libisns/isns.h> #include "config.h" #include "security.h" -#include "util.h" -#include "isns-proto.h" -#include "paths.h" -#include "attrs.h" +#include <libisns/util.h> +#include <libisns/isns-proto.h> +#include <libisns/paths.h> +#include <libisns/attrs.h> enum { ROLE_INITIATOR = 1, diff --git a/local.c b/local.c index ec7d1a8bcd4e..5be3f099c07c 100644 --- a/local.c +++ b/local.c @@ -33,13 +33,13 @@ #include <limits.h> #include "config.h" -#include "isns.h" +#include <libisns/isns.h> #include "security.h" -#include "util.h" -#include "isns-proto.h" -#include "paths.h" -#include "attrs.h" -#include "util.h" +#include <libisns/util.h> +#include <libisns/isns-proto.h> +#include <libisns/paths.h> +#include <libisns/attrs.h> +#include <libisns/util.h> typedef int __isns_local_registry_cb_fn_t(const char *line, int argc, char **argv, diff --git a/logging.c b/logging.c index c3edc360298f..25390bcc797c 100644 --- a/logging.c +++ b/logging.c @@ -10,7 +10,7 @@ #include <string.h> #include <syslog.h> -#include "util.h" +#include <libisns/util.h> static unsigned int log_stdout = 1; static unsigned int debugging = 0; diff --git a/mdebug.c b/mdebug.c index 90dcaf0f575f..4eda52bc9064 100644 --- a/mdebug.c +++ b/mdebug.c @@ -8,7 +8,7 @@ #include <stdlib.h> #include <string.h> -#include "util.h" +#include <libisns/util.h> static void * isns_malloc_default(size_t, const char *, unsigned int); static void * isns_calloc_default(unsigned int, size_t, diff --git a/message.c b/message.c index 5fa09d57cc22..ed190defff98 100644 --- a/message.c +++ b/message.c @@ -11,11 +11,11 @@ #include <sys/time.h> /* for timercmp */ #include <unistd.h> /* gethostname */ #include <ctype.h> -#include "isns.h" -#include "attrs.h" -#include "message.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> +#include <libisns/message.h> #include "socket.h" -#include "util.h" +#include <libisns/util.h> /* iSCSI qualified names include the year and * month in which the domain was assigned. diff --git a/message.h b/message.h deleted file mode 100644 index f1f4ed604063..000000000000 --- a/message.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - * iSNS message definitions and functions - * - * Copyright (C) 2007 Olaf Kirch <[email protected]> - */ - -#ifndef ISNS_MESSAGE_H -#define ISNS_MESSAGE_H - -#include "attrs.h" -#include "source.h" -#include "util.h" - -typedef struct isns_message_queue isns_message_queue_t; - -struct isns_simple { - uint32_t is_function; - isns_source_t * is_source; - isns_policy_t * is_policy; - uint16_t is_xid; - - unsigned int is_replace : 1; - - isns_attr_list_t is_message_attrs; - isns_attr_list_t is_operating_attrs; -}; - -struct isns_message { - unsigned int im_users; - isns_list_t im_list; - struct sockaddr_storage im_addr; - socklen_t im_addrlen; - uint32_t im_xid; - struct isns_hdr im_header; - struct isns_buf * im_payload; - isns_socket_t * im_socket; - isns_principal_t * im_security; - struct ucred * im_creds; - - isns_message_queue_t * im_queue; - - /* When to retransmit */ - struct timeval im_resend_timeout; - struct timeval im_timeout; - - void (*im_destroy)(isns_message_t *); - void (*im_callback)(isns_message_t *, - isns_message_t *); - void * im_calldata; -}; - -enum { - ISNS_MQ_SORT_NONE, - ISNS_MQ_SORT_RESEND_TIMEOUT, -}; - -struct isns_message_queue { - isns_list_t imq_list; - size_t imq_count; -}; - -struct isns_server { - isns_source_t * is_source; - isns_db_t * is_db; - - isns_scn_callback_fn_t *is_scn_callback; - struct isns_service_ops *is_ops; -}; - -extern isns_message_t * __isns_alloc_message(uint32_t, size_t, void (*)(isns_message_t *)); -extern isns_security_t *isns_message_security(const isns_message_t *); - -extern isns_message_t * isns_message_queue_find(isns_message_queue_t *, uint32_t, - const struct sockaddr_storage *, socklen_t); -extern void isns_message_queue_insert_sorted(isns_message_queue_t *, - int, isns_message_t *); -extern void isns_message_queue_move(isns_message_queue_t *, - isns_message_t *); -extern void isns_message_queue_destroy(isns_message_queue_t *); - -extern isns_simple_t * isns_simple_create(uint32_t, - isns_source_t *, - const isns_attr_list_t *); -extern void isns_simple_free(isns_simple_t *); -extern int isns_simple_encode(isns_simple_t *, - isns_message_t **result); -extern int isns_simple_decode(isns_message_t *, - isns_simple_t **); -extern int isns_simple_encode_response(isns_simple_t *, - const isns_message_t *, isns_message_t **); -extern int isns_simple_response_get_objects(isns_simple_t *, - isns_object_list_t *); -extern const char * isns_function_name(uint32_t); - -extern isns_source_t * isns_simple_get_source(isns_simple_t *); - -extern int isns_process_registration(isns_server_t *, isns_simple_t *, isns_simple_t **); -extern int isns_process_query(isns_server_t *, isns_simple_t *, isns_simple_t **); -extern int isns_process_getnext(isns_server_t *, isns_simple_t *, isns_simple_t **); -extern int isns_process_deregistration(isns_server_t *, isns_simple_t *, isns_simple_t **); -extern int isns_process_scn_register(isns_server_t *, isns_simple_t *, isns_simple_t **); -extern int isns_process_scn_deregistration(isns_server_t *, isns_simple_t *, isns_simple_t **); -extern int isns_process_dd_registration(isns_server_t *, isns_simple_t *, isns_simple_t **); -extern int isns_process_dd_deregistration(isns_server_t *, isns_simple_t *, isns_simple_t **); -extern int isns_process_esi(isns_server_t *, isns_simple_t *, isns_simple_t **); -extern int isns_process_scn(isns_server_t *, isns_simple_t *, isns_simple_t **); - -/* - * Inline functions for message queues. - */ -static inline void -isns_message_queue_init(isns_message_queue_t *q) -{ - isns_list_init(&q->imq_list); - q->imq_count = 0; -} - -static inline isns_message_t * -isns_message_queue_head(const isns_message_queue_t *q) -{ - isns_list_t *pos = q->imq_list.next; - - if (pos == &q->imq_list) - return NULL; - return isns_list_item(isns_message_t, im_list, pos); -} - -static inline void -isns_message_queue_append(isns_message_queue_t *q, isns_message_t *msg) -{ - isns_assert(msg->im_queue == NULL); - isns_list_append(&q->imq_list, &msg->im_list); - q->imq_count++; - - msg->im_queue = q; - msg->im_users++; -} - -static inline isns_message_t * -isns_message_queue_remove(isns_message_queue_t *q, isns_message_t *msg) -{ - isns_assert(msg->im_queue == q); - isns_list_del(&msg->im_list); - msg->im_queue = NULL; - q->imq_count--; - - return msg; -} - -static inline isns_message_t * -isns_message_unlink(isns_message_t *msg) -{ - if (msg->im_queue) - return isns_message_queue_remove(msg->im_queue, msg); - return NULL; -} - -static inline isns_message_t * -isns_message_dequeue(isns_message_queue_t *q) -{ - isns_message_t *msg; - - if ((msg = isns_message_queue_head(q)) != NULL) { - isns_list_del(&msg->im_list); - msg->im_queue = NULL; - q->imq_count--; - } - return msg; -} - -/* - * Iterator for looping over all messages in a queue - */ -static inline void -isns_message_queue_begin(isns_message_queue_t *q, isns_list_t **pos) -{ - *pos = q->imq_list.next; -} - -static inline isns_message_t * -isns_message_queue_next(isns_message_queue_t *q, isns_list_t **pos) -{ - isns_list_t *next = *pos; - - if (next == &q->imq_list) - return NULL; - *pos = next->next; - return isns_list_item(isns_message_t, im_list, next); -} - -#define isns_message_queue_foreach(q, pos, item) \ - for (isns_message_queue_begin(q, &pos); \ - (item = isns_message_queue_next(q, &pos)) != NULL; \ - ) - -#endif /* ISNS_MESSAGE_H */ diff --git a/objects.c b/objects.c index 1504026e2d60..5de5c4521f10 100644 --- a/objects.c +++ b/objects.c @@ -7,12 +7,12 @@ #include <stdlib.h> #include <string.h> #include <time.h> -#include "isns.h" +#include <libisns/isns.h> #include "objects.h" -#include "source.h" +#include <libisns/source.h> #include "vendor.h" -#include "attrs.h" -#include "util.h" +#include <libisns/attrs.h> +#include <libisns/util.h> /* For relationship stuff - should go */ #include "db.h" diff --git a/objects.h b/objects.h index 8cc40c6fc3af..f764abb8d4c5 100644 --- a/objects.h +++ b/objects.h @@ -7,8 +7,8 @@ #ifndef ISNS_OBJECTS_H #define ISNS_OBJECTS_H -#include "isns.h" -#include "attrs.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> enum isns_object_id { ISNS_OBJECT_TYPE_ENTITY = 1, diff --git a/parser.c b/parser.c index 378f2c8daead..878ed5285e43 100644 --- a/parser.c +++ b/parser.c @@ -10,7 +10,7 @@ #include <string.h> #include <ctype.h> #include <err.h> -#include "util.h" +#include <libisns/util.h> /* * By default, the parser will recognize any white space diff --git a/paths.h b/paths.h deleted file mode 100644 index 64cf486137ca..000000000000 --- a/paths.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Compile time configuration. - * For now, let's keep it simple and ignore autoconf... - * - * Copyright (C) 2006, 2007 Olaf Kirch <[email protected]> - */ - -#ifndef ISNS_CONFIG_H -#define ISNS_CONFIG_H - -#define __OPENISNS_MKVERSION(maj, min) (((maj) << 8) + (min)) -#define OPENISNS_VERSION __OPENISNS_MKVERSION(0, 93); -#define OPENISNS_VERSION_STRING "0.93" - -#define ISNS_ETCDIR "/etc/isns" -#define ISNS_RUNDIR "/var/run" -#define ISNS_DEFAULT_ISNSD_CONFIG ISNS_ETCDIR "/isnsd.conf" -#define ISNS_DEFAULT_ISNSDD_CONFIG ISNS_ETCDIR "/isnsdd.conf" -#define ISNS_DEFAULT_ISNSADM_CONFIG ISNS_ETCDIR "/isnsadm.conf" -#define ISNS_DEFAULT_LOCAL_REGISTRY ISNS_RUNDIR "/isns.registry" - -#define ISCSI_DEFAULT_INITIATORNAME "/etc/iscsi/initiatorname.iscsi" - -#endif /* ISNS_CONFIG_H */ diff --git a/pidfile.c b/pidfile.c index 338437316f66..580d70fa854a 100644 --- a/pidfile.c +++ b/pidfile.c @@ -11,7 +11,7 @@ #include <errno.h> #include <unistd.h> -#include "util.h" +#include <libisns/util.h> static void __update_pidfile(int fd) diff --git a/pki.c b/pki.c index 261e093743de..584c20c20407 100644 --- a/pki.c +++ b/pki.c @@ -12,9 +12,9 @@ #include <openssl/err.h> #include <fcntl.h> #include "config.h" -#include "isns.h" +#include <libisns/isns.h> #include "security.h" -#include "util.h" +#include <libisns/util.h> #ifdef WITH_SECURITY diff --git a/policy.c b/policy.c index 27da60f4ee9c..80d17bb02ac3 100644 --- a/policy.c +++ b/policy.c @@ -9,11 +9,11 @@ #include <string.h> #include "config.h" -#include "isns.h" +#include <libisns/isns.h> #include "security.h" #include "objects.h" -#include "message.h" -#include "util.h" +#include <libisns/message.h> +#include <libisns/util.h> /* A brief discussion of policy diff --git a/portal-group.c b/portal-group.c index 647bbde5434f..f7fbec8a7469 100644 --- a/portal-group.c +++ b/portal-group.c @@ -6,11 +6,11 @@ #include <stdlib.h> #include <string.h> -#include "isns.h" +#include <libisns/isns.h> #include "objects.h" #include "vendor.h" -#include "attrs.h" -#include "util.h" +#include <libisns/attrs.h> +#include <libisns/util.h> /* For relationship stuff - should go */ #include "db.h" diff --git a/query.c b/query.c index 8382de8614c0..37a3d6206d83 100644 --- a/query.c +++ b/query.c @@ -7,13 +7,13 @@ #include <stdlib.h> #include <string.h> #include "config.h" -#include "isns.h" -#include "attrs.h" -#include "message.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> +#include <libisns/message.h> #include "security.h" #include "objects.h" #include "db.h" -#include "util.h" +#include <libisns/util.h> /* * Create a query, and set the source name diff --git a/register.c b/register.c index 007cf551c3e9..0cebd1e7735a 100644 --- a/register.c +++ b/register.c @@ -8,12 +8,12 @@ #include <string.h> #include <time.h> #include "config.h" -#include "isns.h" -#include "attrs.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> #include "objects.h" -#include "message.h" +#include <libisns/message.h> #include "security.h" -#include "util.h" +#include <libisns/util.h> #include "db.h" diff --git a/relation.c b/relation.c index caac38bca92d..88b1bb4989bb 100644 --- a/relation.c +++ b/relation.c @@ -30,9 +30,9 @@ #include <time.h> #include <stdarg.h> -#include "isns.h" +#include <libisns/isns.h> #include "objects.h" -#include "util.h" +#include <libisns/util.h> #include "db.h" struct isns_relation_soup { diff --git a/scn.c b/scn.c index 92721e02ba4d..725d22267c39 100644 --- a/scn.c +++ b/scn.c @@ -8,12 +8,12 @@ #include <string.h> #include <time.h> #include "config.h" -#include "isns.h" -#include "attrs.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> #include "objects.h" -#include "message.h" +#include <libisns/message.h> #include "security.h" -#include "util.h" +#include <libisns/util.h> #include "db.h" typedef struct isns_scn isns_scn_t; diff --git a/scope.c b/scope.c index 844d552b0774..90af99480c6a 100644 --- a/scope.c +++ b/scope.c @@ -7,12 +7,12 @@ #include <stdlib.h> #include <string.h> #include "config.h" -#include "isns.h" -#include "attrs.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> #include "objects.h" -#include "message.h" +#include <libisns/message.h> #include "security.h" -#include "util.h" +#include <libisns/util.h> #include "db.h" struct isns_scope { diff --git a/security.c b/security.c index 60bd8d744fb3..2cf6235f76e7 100644 --- a/security.c +++ b/security.c @@ -8,10 +8,10 @@ #include <string.h> #include <time.h> #include "config.h" -#include "isns.h" +#include <libisns/isns.h> #include "security.h" -#include "source.h" -#include "util.h" +#include <libisns/source.h> +#include <libisns/util.h> #ifdef WITH_SECURITY diff --git a/security.h b/security.h index 9ba0f0d55f3e..bbab3fe73631 100644 --- a/security.h +++ b/security.h @@ -9,7 +9,7 @@ #include <openssl/evp.h> #include "buffer.h" -#include "util.h" +#include <libisns/util.h> /* * Security context diff --git a/server.c b/server.c index 930d20538b10..82b7bb9f50c7 100644 --- a/server.c +++ b/server.c @@ -5,10 +5,10 @@ */ #include "config.h" -#include "isns.h" -#include "util.h" +#include <libisns/isns.h> +#include <libisns/util.h> #include "security.h" -#include "message.h" +#include <libisns/message.h> static int isns_not_supported(isns_server_t *, isns_simple_t *, isns_simple_t **); diff --git a/simple.c b/simple.c index 8972a0c858bc..56860fcb610c 100644 --- a/simple.c +++ b/simple.c @@ -8,13 +8,13 @@ #include <stdlib.h> #include <string.h> #include "config.h" -#include "isns.h" -#include "attrs.h" -#include "message.h" +#include <libisns/isns.h> +#include <libisns/attrs.h> +#include <libisns/message.h> #include "objects.h" #include "security.h" #include "socket.h" -#include "util.h" +#include <libisns/util.h> typedef void isns_simple_callback_fn_t(uint32_t, int status, isns_simple_t *); diff --git a/slp.c b/slp.c index 43075b310913..cc54680e620b 100644 --- a/slp.c +++ b/slp.c @@ -10,8 +10,8 @@ # include <slp.h> #endif -#include "isns.h" -#include "util.h" +#include <libisns/isns.h> +#include <libisns/util.h> #include "internal.h" #define ISNS_SLP_SERVICE_NAME "iscsi:sms" diff --git a/socket.c b/socket.c index 883df51b8993..bd6d6b441077 100644 --- a/socket.c +++ b/socket.c @@ -21,10 +21,10 @@ #include "config.h" #include "buffer.h" -#include "isns.h" +#include <libisns/isns.h> #include "socket.h" #include "security.h" -#include "util.h" +#include <libisns/util.h> #define SOCK_DEBUG_VERBOSE 0 diff --git a/socket.h b/socket.h index cc63d231d56b..a721a3b3c81f 100644 --- a/socket.h +++ b/socket.h @@ -7,9 +7,9 @@ #ifndef ISNS_SOCKET_H #define ISNS_SOCKET_H -#include "isns.h" +#include <libisns/isns.h> #include "buffer.h" -#include "message.h" +#include <libisns/message.h> struct isns_partial_msg { isns_message_t imp_base; diff --git a/source.h b/source.h deleted file mode 100644 index 59fb6628a5bd..000000000000 --- a/source.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * iSNS source attribute handling - * - * Copyright (C) 2007 Olaf Kirch <[email protected]> - */ - -#ifndef ISNS_SOURCE_H -#define ISNS_SOURCE_H - -#include "attrs.h" - -struct isns_source { - unsigned int is_users; - isns_attr_t * is_attr; - unsigned int is_untrusted : 1; - - isns_object_t * is_node; - unsigned int is_node_type; - - isns_object_t * is_entity; -}; - -extern int isns_source_encode(buf_t *, const isns_source_t *); -extern int isns_source_decode(buf_t *, isns_source_t **); -extern int isns_source_set_node(isns_source_t *, isns_db_t *); -extern void isns_source_set_entity(isns_source_t *, isns_object_t *); -extern isns_source_t * isns_source_dummy(void); - -extern char * isns_build_source_pattern(const char *); -extern int isns_source_pattern_match(const char *, const char *); - -#endif /* ISNS_SOURCE_H */ diff --git a/storage-node.c b/storage-node.c index 97e54d1ead73..85414e7291c3 100644 --- a/storage-node.c +++ b/storage-node.c @@ -7,9 +7,9 @@ #include <stdlib.h> #include <string.h> #include <time.h> -#include "isns.h" +#include <libisns/isns.h> #include "objects.h" -#include "util.h" +#include <libisns/util.h> isns_object_t * isns_create_storage_node(const char *name, uint32_t type, diff --git a/sysdep-unix.c b/sysdep-unix.c index d2a95326001a..a710b0cc02f6 100644 --- a/sysdep-unix.c +++ b/sysdep-unix.c @@ -8,8 +8,8 @@ #include <sys/ioctl.h> #include <string.h> #include <unistd.h> -#include "isns.h" -#include "util.h" +#include <libisns/isns.h> +#include <libisns/util.h> int isns_get_nr_portals(void) { diff --git a/tags.c b/tags.c index ec6d0f6d3dae..46e8f352fcd7 100644 --- a/tags.c +++ b/tags.c @@ -8,12 +8,12 @@ #include <stdlib.h> #include <time.h> #include "config.h" -#include "isns-proto.h" +#include <libisns/isns-proto.h> #include "vendor.h" -#include "attrs.h" +#include <libisns/attrs.h> #include "security.h" #include "objects.h" -#include "util.h" +#include <libisns/util.h> #define ISNS_MAX_BUILTIN_TAG 4096 diff --git a/tests/pauw1.c b/tests/pauw1.c index c3e66f7fdfb4..ab4be7284613 100644 --- a/tests/pauw1.c +++ b/tests/pauw1.c @@ -3,10 +3,10 @@ * registering itself. */ #include <getopt.h> -#include <isns.h> -#include <paths.h> -#include <util.h> -#include <message.h> +#include <libisns/isns.h> +#include <libisns/paths.h> +#include <libisns/util.h> +#include <libisns/message.h> int main(int argc, char **argv) diff --git a/tests/pauw2.c b/tests/pauw2.c index 29084b304030..63015b1dbdfb 100644 --- a/tests/pauw2.c +++ b/tests/pauw2.c @@ -3,10 +3,10 @@ * registering itself. */ #include <getopt.h> -#include <isns.h> -#include <paths.h> -#include <util.h> -#include <message.h> +#include <libisns/isns.h> +#include <libisns/paths.h> +#include <libisns/util.h> +#include <libisns/message.h> #define ADD(type, tag, value) \ isns_attr_list_append_##type(attrs, ISNS_TAG_##tag, value) diff --git a/tests/pauw3.c b/tests/pauw3.c index 3be0baa63f15..1989ec254e91 100644 --- a/tests/pauw3.c +++ b/tests/pauw3.c @@ -12,10 +12,10 @@ #include <getopt.h> #include <unistd.h> -#include <isns.h> -#include <paths.h> -#include <util.h> -#include <message.h> +#include <libisns/isns.h> +#include <libisns/paths.h> +#include <libisns/util.h> +#include <libisns/message.h> #define ADD(type, tag, value) \ isns_attr_list_append_##type(attrs, ISNS_TAG_##tag, value) diff --git a/tests/pauw4.c b/tests/pauw4.c index 9510ddd53f60..02f74b2c24b9 100644 --- a/tests/pauw4.c +++ b/tests/pauw4.c @@ -7,10 +7,10 @@ #include <getopt.h> #include <unistd.h> -#include <isns.h> -#include <paths.h> -#include <util.h> -#include <message.h> +#include <libisns/isns.h> +#include <libisns/paths.h> +#include <libisns/util.h> +#include <libisns/message.h> #define ADD(type, tag, value) \ isns_attr_list_append_##type(attrs, ISNS_TAG_##tag, value) diff --git a/timer.c b/timer.c index ed8a23ff23ce..2708fa0d7384 100644 --- a/timer.c +++ b/timer.c @@ -6,8 +6,8 @@ #include <stdlib.h> #include <time.h> -#include "isns.h" -#include "util.h" +#include <libisns/isns.h> +#include <libisns/util.h> typedef struct isns_timer isns_timer_t; struct isns_timer { diff --git a/types.h b/types.h deleted file mode 100644 index ddd153f8401d..000000000000 --- a/types.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Open-iSNS types - * - * Copyright (C) 2007 Olaf Kirch <[email protected]> - */ - -#ifndef ISNS_TYPES_H -#define ISNS_TYPES_H - -typedef struct isns_simple isns_simple_t; -typedef struct isns_source isns_source_t; -typedef struct isns_object isns_object_t; -typedef struct isns_relation isns_relation_t; -typedef struct isns_attr isns_attr_t; -typedef struct isns_attr_list isns_attr_list_t; -typedef struct isns_message isns_message_t; -typedef struct isns_socket isns_socket_t; -typedef struct isns_db isns_db_t; -typedef struct isns_tag_type isns_tag_type_t; -typedef const struct isns_object_template isns_object_template_t; -typedef struct isns_authdata isns_authdata_t; -typedef struct isns_security isns_security_t; -typedef struct isns_principal isns_principal_t; -typedef struct isns_policy isns_policy_t; -typedef struct isns_keystore isns_keystore_t; -typedef struct isns_scope isns_scope_t; -typedef struct isns_portal_info isns_portal_info_t; -typedef struct isns_server isns_server_t; -typedef struct isns_db_event isns_db_event_t; -typedef struct isns_bitvector isns_bitvector_t; - -typedef struct isns_object_list { - unsigned int iol_count; - isns_object_t ** iol_data; -} isns_object_list_t; - -#define ISNS_OBJECT_LIST_INIT { .iol_count = 0, .iol_data = NULL } - -/* - * An attribute list - */ -struct isns_attr_list { - unsigned int ial_count; - isns_attr_t ** ial_data; -}; -#define ISNS_ATTR_LIST_INIT { .ial_count = 0, .ial_data = NULL } - -/* - * Function types. - */ -typedef void isns_print_fn_t(const char *, ...); -typedef void isns_timer_callback_t(void *); - - -#endif /* ISNS_TYPES_H */ - - diff --git a/util.c b/util.c index 4c0a7b298d88..ae5f2bed6504 100644 --- a/util.c +++ b/util.c @@ -11,7 +11,7 @@ #include <string.h> #include <err.h> #include <errno.h> -#include "util.h" +#include <libisns/util.h> unsigned long parse_size(const char *arg) diff --git a/util.h b/util.h deleted file mode 100644 index bd6b979bd0b5..000000000000 --- a/util.h +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Utility functions - * - * Copyright (C) 2006, 2007 Olaf Kirch <[email protected]> - */ - -#ifndef UTIL_H -#define UTIL_H - -#include <sys/types.h> -#include <stdint.h> -#include <stdio.h> -#include <stddef.h> -#include <string.h> // for strdup -#include "types.h" - -#define array_num_elements(a) (sizeof(a) / sizeof((a)[0])) - -const char * isns_dirname(const char *); -int isns_mkdir_recursive(const char *); - -extern const char *parser_separators; -char * parser_get_next_line(FILE *); -char * parser_get_next_word(char **); -char * parser_get_rest_of_line(char **); -int parser_split_line(char *, unsigned int, char **); - -unsigned long parse_size(const char *); -unsigned int parse_count(const char *); -int parse_int(const char *); -long long parse_longlong(const char *); -double parse_double(const char *); -unsigned int parse_timeout(const char *); - -char * print_size(unsigned long); - -/* - * Very simple and stupid string array. - */ -struct string_array { - unsigned int count; - char ** list; -}; - -void isns_string_array_append(struct string_array *, const char *); -void isns_string_array_destroy(struct string_array *); - -void isns_assign_string(char **, const char *); - -void isns_write_pidfile(const char *); -void isns_update_pidfile(const char *); -void isns_remove_pidfile(const char *); - -extern void isns_log_background(void); -extern void isns_assert_failed(const char *, - const char *, unsigned int); -extern void isns_fatal(const char *, ...); -extern void isns_warning(const char *, ...); -extern void isns_error(const char *, ...); -extern void isns_notice(const char *, ...); -extern void isns_debug_general(const char *, ...); -extern void isns_debug_socket(const char *, ...); -extern void isns_debug_protocol(const char *, ...); -extern void isns_debug_message(const char *, ...); -extern void isns_debug_state(const char *, ...); -extern void isns_debug_auth(const char *, ...); -extern void isns_debug_scn(const char *, ...); -extern void isns_debug_esi(const char *, ...); -extern void isns_enable_debugging(const char *); -extern int isns_debug_enabled(int); - -enum { - DBG_GENERAL = 0, - DBG_SOCKET, - DBG_PROTOCOL, - DBG_MESSAGE, - DBG_STATE, - DBG_AUTH, - DBG_SCN, - DBG_ESI, -}; - -/* - * There's no htonll yet - */ -#ifndef htonll -# include <endian.h> -# include <byteswap.h> -# if __BYTE_ORDER == __BIG_ENDIAN -# define htonll(x) (x) -# define ntohll(x) (x) -# elif __BYTE_ORDER == __LITTLE_ENDIAN -# define htonll(x) __bswap_64(x) -# define ntohll(x) __bswap_64(x) -# endif -#endif - -/* - * One of the those eternal staples of C coding: - */ -#ifndef MIN -# define MIN(a, b) ((a) < (b)? (a) : (b)) -# define MAX(a, b) ((a) > (b)? (a) : (b)) -#endif - -#define DECLARE_BITMAP(name, NBITS) \ - uint32_t name[(NBITS+31) >> 5] = { 0 } - -#define __BIT_INDEX(nr) (nr >> 5) -#define __BIT_MASK(nr) (1 << (nr & 31)) - -static inline void -set_bit(uint32_t *map, unsigned int nr) -{ - map[__BIT_INDEX(nr)] |= __BIT_MASK(nr); -} - -static inline void -clear_bit(uint32_t *map, unsigned int nr) -{ - map[__BIT_INDEX(nr)] &= ~__BIT_MASK(nr); -} - -static inline int -test_bit(const uint32_t *map, unsigned int nr) -{ - return !!(map[__BIT_INDEX(nr)] & __BIT_MASK(nr)); -} - -/* - * Dynamically sized bit vector - */ -extern isns_bitvector_t *isns_bitvector_alloc(void); -extern void isns_bitvector_init(isns_bitvector_t *); -extern void isns_bitvector_destroy(isns_bitvector_t *); -extern void isns_bitvector_free(isns_bitvector_t *); -extern int isns_bitvector_test_bit(const isns_bitvector_t *, unsigned int); -extern int isns_bitvector_set_bit(isns_bitvector_t *, unsigned int); -extern int isns_bitvector_clear_bit(isns_bitvector_t *, unsigned int); -extern int isns_bitvector_is_empty(const isns_bitvector_t *); -extern int isns_bitvector_intersect(const isns_bitvector_t *a, - const isns_bitvector_t *b, - isns_bitvector_t *result); -extern void isns_bitvector_print(const isns_bitvector_t *, - isns_print_fn_t *); -extern void isns_bitvector_foreach(const isns_bitvector_t *bv, - int (*cb)(uint32_t, void *), - void *user_data); - -/* - * List manipulation primites - */ -typedef struct isns_list isns_list_t; -struct isns_list { - isns_list_t * next; - isns_list_t * prev; -}; - -#define ISNS_LIST_DECLARE(list) \ - isns_list_t list = { &list, &list } - -static inline void -isns_list_init(isns_list_t *head) -{ - head->next = head->prev = head; -} - -static inline void -__isns_list_insert(isns_list_t *prev, isns_list_t *item, isns_list_t *next) -{ - item->next = next; - item->prev = prev; - next->prev = item; - prev->next = item; -} - -static inline void -isns_list_append(isns_list_t *head, isns_list_t *item) -{ - __isns_list_insert(head->prev, item, head); -} - -static inline void -isns_list_insert(isns_list_t *head, isns_list_t *item) -{ - __isns_list_insert(head, item, head->next); -} - -static inline void -isns_item_insert_before(isns_list_t *where, isns_list_t *item) -{ - __isns_list_insert(where->prev, item, where); -} - -static inline void -isns_item_insert_after(isns_list_t *where, isns_list_t *item) -{ - __isns_list_insert(where, item, where->next); -} - -static inline void -isns_list_del(isns_list_t *item) -{ - isns_list_t *prev = item->prev; - isns_list_t *next = item->next; - - prev->next = next; - next->prev = prev; - item->next = item->prev = item; -} - -static inline int -isns_list_empty(const isns_list_t *head) -{ - return head == head->next; -} - -static inline void -isns_list_move(isns_list_t *dst, isns_list_t *src) -{ - isns_list_t *prev, *next; - isns_list_t *head, *tail; - - if (isns_list_empty(src)) - return; - - prev = dst->prev; - next = dst; - - head = src->next; - tail = src->prev; - - next->prev = tail; - prev->next = head; - head->prev = prev; - tail->next = next; - - src->next = src->prev = src; -} - -#define isns_list_item(type, member, ptr) \ - container_of(type, member, ptr) - -#define isns_list_foreach(list, __pos, __next) \ - for (__pos = (list)->next; \ - (__pos != list) && (__next = __pos->next, 1); \ - __pos = __next) - -#if 0 -/* This is defined in stddef */ -#define offsetof(type, member) ((unsigned long) &(((type *) 0)->member)) -#endif -#define container_of(type, member, ptr) \ - ((type *) (((unsigned char *) ptr) - offsetof(type, member))) - -/* - * Use isns_assert instead of libc's assert, so that the - * message can be captured and sent to syslog. - */ -#define isns_assert(condition) do { \ - if (!(condition)) \ - isns_assert_failed(#condition, \ - __FILE__, __LINE__); \ -} while (0) - -#ifndef MDEBUG -# define isns_malloc(size) malloc(size) -# define isns_calloc(n, size) calloc(n, size) -# define isns_realloc(p, size) realloc(p, size) -# define isns_strdup(s) strdup(s) -# define isns_free(p) free(p) -#else -# define isns_malloc(size) isns_malloc_fn(size, __FILE__, __LINE__) -# define isns_calloc(n, size) isns_calloc_fn(n, size, __FILE__, __LINE__) -# define isns_realloc(p, size) isns_realloc_fn(p, size, __FILE__, __LINE__) -# define isns_strdup(s) isns_strdup_fn(s, __FILE__, __LINE__) -# define isns_free(p) isns_free_fn(p, __FILE__, __LINE__) - -extern void * (*isns_malloc_fn)(size_t, const char *, unsigned int); -extern void * (*isns_calloc_fn)(unsigned int, size_t, - const char *, unsigned int); -extern void * (*isns_realloc_fn)(void *, size_t, - const char *, unsigned int); -extern char * (*isns_strdup_fn)(const char *, const char *, unsigned int); -extern void (*isns_free_fn)(void *, const char *, unsigned int); -#endif - -#endif /* UTIL_H */ diff --git a/vendor.c b/vendor.c index e24164d5d049..82cdac36cd10 100644 --- a/vendor.c +++ b/vendor.c @@ -6,11 +6,11 @@ #include <stdlib.h> #include <string.h> -#include "isns.h" +#include <libisns/isns.h> #include "objects.h" -#include "attrs.h" +#include <libisns/attrs.h> #include "vendor.h" -#include "util.h" +#include <libisns/util.h> static uint32_t policy_attrs[] = { OPENISNS_TAG_POLICY_SPI, diff --git a/vendor.h b/vendor.h index 49c61321368d..fb456ec5c11c 100644 --- a/vendor.h +++ b/vendor.h @@ -7,7 +7,7 @@ #ifndef ISNS_VENDOR_H #define ISNS_VENDOR_H -#include "isns-proto.h" +#include <libisns/isns-proto.h> /* * We're poor, we don't own a OUI. Let's fake one. -- 2.1.4 -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
