Added SilcID to describe any ID.
authorPekka Riikonen <priikone@silcnet.org>
Thu, 29 Jun 2006 21:09:19 +0000 (21:09 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Thu, 29 Jun 2006 21:09:19 +0000 (21:09 +0000)
Added non-allocating encoding/decoding of IDs.

lib/silccore/silcid.c
lib/silccore/silcid.h

index 1e5727bc215bd96d94831b3aa7119e9e5b71ff97..027cf6eadd676915845e6de6784b6661a9c92b5a 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2005 Pekka Riikonen
+  Copyright (C) 1997 - 2006 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -85,8 +85,7 @@ SilcIDPayload silc_id_payload_parse(const unsigned char *payload,
 /* Return the ID directly from the raw payload data. */
 
 SilcBool silc_id_payload_parse_id(const unsigned char *data, SilcUInt32 len,
-                                 SilcIdType *ret_type, void *ret_id,
-                                 SilcUInt32 ret_id_size)
+                                 SilcID *ret_id)
 {
   SilcBufferStruct buffer;
   SilcIdType type;
@@ -94,6 +93,9 @@ SilcBool silc_id_payload_parse_id(const unsigned char *data, SilcUInt32 len,
   unsigned char *id_data;
   int ret;
 
+  if (!ret_id)
+    return FALSE;
+
   silc_buffer_set(&buffer, (unsigned char *)data, len);
   ret = silc_buffer_unformat(&buffer,
                             SILC_STR_UI_SHORT(&type),
@@ -116,11 +118,21 @@ SilcBool silc_id_payload_parse_id(const unsigned char *data, SilcUInt32 len,
   if (ret == -1)
     goto err;
 
-  if (!silc_id_str2id(id_data, idlen, type, ret_id, ret_id_size))
-    goto err;
-
-  if (ret_type)
-    *ret_type = type;
+  ret_id->type = type;
+
+  if (type == SILC_ID_CLIENT) {
+    if (!silc_id_str2id(id_data, idlen, type, &ret_id->u.client_id,
+                       sizeof(SilcClientID)))
+      goto err;
+  } else if (type == SILC_ID_SERVER) {
+    if (!silc_id_str2id(id_data, idlen, type, &ret_id->u.server_id,
+                       sizeof(SilcServerID)))
+      goto err;
+  } else {
+    if (!silc_id_str2id(id_data, idlen, type, &ret_id->u.channel_id,
+                       sizeof(SilcChannelID)))
+      goto err;
+  }
 
   return TRUE;
 
index 8bdf6cc0e2e019bcc9db230e7d29de19e311ba01..e6a595c62fc6056c75cd5f511eafabd6183e4f44 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2005 Pekka Riikonen
+  Copyright (C) 1997 - 2006 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
 #ifndef SILCID_H
 #define SILCID_H
 
+/* The ID Lenghts. These are IPv4 based and should be noted if used directly
+   that these cannot be used with IPv6. */
+#define SILC_ID_SERVER_LEN     (64 / 8)
+#define SILC_ID_CLIENT_LEN     (128 / 8)
+#define SILC_ID_CHANNEL_LEN    (64 / 8)
+
+#define CLIENTID_HASH_LEN       (88 / 8) /* Client ID's 88 bit MD5 hash */
+
 /****d* silccore/SilcIDAPI/SilcIdType
  *
  * NAME
@@ -60,167 +68,6 @@ typedef SilcUInt16 SilcIdType;
 #define SILC_ID_CHANNEL     3
 /***/
 
-/* The ID Lenghts. These are IPv4 based and should be noted if used directly
-   that these cannot be used with IPv6. */
-#define SILC_ID_SERVER_LEN     (64 / 8)
-#define SILC_ID_CLIENT_LEN     (128 / 8)
-#define SILC_ID_CHANNEL_LEN    (64 / 8)
-
-#define CLIENTID_HASH_LEN       (88 / 8) /* Client ID's 88 bit MD5 hash */
-
-/****s* silccore/SilcIDAPI/SilcIDPayload
- *
- * NAME
- *
- *    typedef struct SilcIDPayloadStruct *SilcIDPayload;
- *
- * DESCRIPTION
- *
- *    This context is the actual ID Payload and is allocated by
- *    silc_id_payload_parse and given as argument usually to all
- *    silc_id_payload_* functions.  It is freed by the function
- *    silc_id_payload_free.
- *
- ***/
-typedef struct SilcIDPayloadStruct *SilcIDPayload;
-
-/* Prototypes */
-
-/****f* silccore/SilcIDAPI/silc_id_payload_parse
- *
- * SYNOPSIS
- *
- *    SilcIDPayload silc_id_payload_parse(const unsigned char *payload,
- *                                        SilcUInt32 payload_len);
- *
- * DESCRIPTION
- *
- *    Parses buffer and return ID payload into payload structure. The
- *    `buffer' is raw payload buffer.  The caller must free the returned
- *    payload.
- *
- ***/
-SilcIDPayload silc_id_payload_parse(const unsigned char *payload,
-                                   SilcUInt32 payload_len);
-
-/****f* silccore/SilcIDAPI/silc_id_payload_parse_id
- *
- * SYNOPSIS
- *
- *    SilcBool silc_id_payload_parse_id(const unsigned char *data,
- *                                      SilcUInt32 len,
- *                                      SilcIdType *type, void *ret_id,
- *                                      SilcUInt32 ret_id_size);
- *
- * DESCRIPTION
- *
- *    Return ID directly from the raw ID Payload data buffer.  This does
- *    not allocate any memory.
- *
- ***/
-SilcBool silc_id_payload_parse_id(const unsigned char *data, SilcUInt32 len,
-                                 SilcIdType *type, void *ret_id,
-                                 SilcUInt32 ret_id_size);
-
-/****f* silccore/SilcIDAPI/silc_id_payload_encode
- *
- * SYNOPSIS
- *
- *    SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type);
- *
- * DESCRIPTION
- *
- *    Encodes ID Payload. The `id' is the ID of the type `type' to put
- *    into the payload. Returns the encoded payload buffer.
- *
- ***/
-SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type);
-
-/****f* silccore/SilcIDAPI/silc_id_payload_encode_data
- *
- * SYNOPSIS
- *
- *    SilcBuffer silc_id_payload_encode_data(const unsigned char *id,
- *                                           uin32 id_len, SilcIdType type);
- *
- * DESCRIPTION
- *
- *    Encodes ID Payload. The `id' is raw ID data of the length of `id_len'
- *    of type of `type'. Returns the encoded payload buffer.
- *
- ***/
-SilcBuffer silc_id_payload_encode_data(const unsigned char *id,
-                                      SilcUInt32 id_len, SilcIdType type);
-
-/****f* silccore/SilcIDAPI/silc_id_payload_free
- *
- * SYNOPSIS
- *
- *    void silc_id_payload_free(SilcIDPayload payload);
- *
- * DESCRIPTION
- *
- *    Frees the ID Payload and all data in it.
- *
- ***/
-void silc_id_payload_free(SilcIDPayload payload);
-
-/****f* silccore/SilcIDAPI/silc_id_payload_get_type
- *
- * SYNOPSIS
- *
- *    SilcIdType silc_id_payload_get_type(SilcIDPayload payload);
- *
- * DESCRIPTION
- *
- *    Returns the ID type from the ID Payload. The type tells the
- *    type of the ID in the payload.
- *
- ***/
-SilcIdType silc_id_payload_get_type(SilcIDPayload payload);
-
-/****f* silccore/SilcIDAPI/silc_id_payload_get_id
- *
- * SYNOPSIS
- *
- *    SilcBool silc_id_payload_get_id(SilcIDPayload payload, void *ret_id,
- *                                    SilcUInt32 ret_id_len);
- *
- * DESCRIPTION
- *
- *    Returns the ID in the ID Payload. This does not allocate any memory.
- *
- ***/
-SilcBool silc_id_payload_get_id(SilcIDPayload payload, void *ret_id,
-                               SilcUInt32 ret_id_len);
-
-/****f* silccore/SilcIDAPI/silc_id_payload_get_data
- *
- * SYNOPSIS
- *
- *    unsigned char *silc_id_payload_get_data(SilcIDPayload payload);
- *
- * DESCRIPTION
- *
- *    Returns the raw ID data from the ID Payload. The data is duplicated
- *    and the caller must free it.
- *
- ***/
-unsigned char *silc_id_payload_get_data(SilcIDPayload payload);
-
-/****f* silccore/SilcIDAPI/silc_id_payload_get_len
- *
- * SYNOPSIS
- *
- *    SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload);
- *
- * DESCRIPTION
- *
- *    Returns the length of the ID in the ID Payload.
- *
- ***/
-SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload);
-
 /****s* silccore/SilcIDAPI/SilcIDIP
  *
  * NAME
@@ -310,6 +157,31 @@ typedef struct {
 } SilcChannelID;
 /***/
 
+/****s* silccore/SilcIDAPI/SilcID
+ *
+ * NAME
+ *
+ *    typedef struct { ... } SilcID;
+ *
+ * DESCRIPTION
+ *
+ *    The generic ID structure that can represent SilcClientID, SilcServerID
+ *    and SilcChannelID.  The silc_id_payload_parse_id returns the ID in the
+ *    SilcID structure.  Other routines except either SilcClientID,
+ *    SilcServerID or SilcChannelID as a void pointer.
+ *
+ * SOURCE
+ */
+typedef struct {
+  union {
+    SilcServerID server_id;
+    SilcChannelID channel_id;
+    SilcClientID client_id;
+  } u;
+  SilcIdType type;
+} SilcID;
+/***/
+
 /* Macros */
 
 /****d* silccore/SilcIDAPI/SILC_ID_COMPARE
@@ -413,8 +285,156 @@ typedef struct {
   (!memcmp((id1)->hash, (id2)->hash, CLIENTID_HASH_LEN))
 /***/
 
+/****s* silccore/SilcIDAPI/SilcIDPayload
+ *
+ * NAME
+ *
+ *    typedef struct SilcIDPayloadStruct *SilcIDPayload;
+ *
+ * DESCRIPTION
+ *
+ *    This context is the actual ID Payload and is allocated by
+ *    silc_id_payload_parse and given as argument usually to all
+ *    silc_id_payload_* functions.  It is freed by the function
+ *    silc_id_payload_free.
+ *
+ ***/
+typedef struct SilcIDPayloadStruct *SilcIDPayload;
+
 /* Prototypes */
 
+/****f* silccore/SilcIDAPI/silc_id_payload_parse
+ *
+ * SYNOPSIS
+ *
+ *    SilcIDPayload silc_id_payload_parse(const unsigned char *payload,
+ *                                        SilcUInt32 payload_len);
+ *
+ * DESCRIPTION
+ *
+ *    Parses buffer and return ID payload into payload structure. The
+ *    `buffer' is raw payload buffer.  The caller must free the returned
+ *    payload.
+ *
+ ***/
+SilcIDPayload silc_id_payload_parse(const unsigned char *payload,
+                                   SilcUInt32 payload_len);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_parse_id
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_id_payload_parse_id(const unsigned char *data,
+ *                                      SilcUInt32 len, SilcID *ret_id);
+ *
+ * DESCRIPTION
+ *
+ *    Return ID directly from the raw ID Payload data buffer.  This does
+ *    not allocate any memory.
+ *
+ ***/
+SilcBool silc_id_payload_parse_id(const unsigned char *data, SilcUInt32 len,
+                                 SilcID *ret_id);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_encode
+ *
+ * SYNOPSIS
+ *
+ *    SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type);
+ *
+ * DESCRIPTION
+ *
+ *    Encodes ID Payload. The `id' is the ID of the type `type' to put
+ *    into the payload. Returns the encoded payload buffer.
+ *
+ ***/
+SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_encode_data
+ *
+ * SYNOPSIS
+ *
+ *    SilcBuffer silc_id_payload_encode_data(const unsigned char *id,
+ *                                           uin32 id_len, SilcIdType type);
+ *
+ * DESCRIPTION
+ *
+ *    Encodes ID Payload. The `id' is raw ID data of the length of `id_len'
+ *    of type of `type'. Returns the encoded payload buffer.
+ *
+ ***/
+SilcBuffer silc_id_payload_encode_data(const unsigned char *id,
+                                      SilcUInt32 id_len, SilcIdType type);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_free
+ *
+ * SYNOPSIS
+ *
+ *    void silc_id_payload_free(SilcIDPayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Frees the ID Payload and all data in it.
+ *
+ ***/
+void silc_id_payload_free(SilcIDPayload payload);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_get_type
+ *
+ * SYNOPSIS
+ *
+ *    SilcIdType silc_id_payload_get_type(SilcIDPayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the ID type from the ID Payload. The type tells the
+ *    type of the ID in the payload.
+ *
+ ***/
+SilcIdType silc_id_payload_get_type(SilcIDPayload payload);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_get_id
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_id_payload_get_id(SilcIDPayload payload, void *ret_id,
+ *                                    SilcUInt32 ret_id_len);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the ID in the ID Payload. This does not allocate any memory.
+ *
+ ***/
+SilcBool silc_id_payload_get_id(SilcIDPayload payload, void *ret_id,
+                               SilcUInt32 ret_id_len);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_get_data
+ *
+ * SYNOPSIS
+ *
+ *    unsigned char *silc_id_payload_get_data(SilcIDPayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the raw ID data from the ID Payload. The data is duplicated
+ *    and the caller must free it.
+ *
+ ***/
+unsigned char *silc_id_payload_get_data(SilcIDPayload payload);
+
+/****f* silccore/SilcIDAPI/silc_id_payload_get_len
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the length of the ID in the ID Payload.
+ *
+ ***/
+SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload);
+
 /****f* silccore/SilcIDAPI/silc_id_id2str
  *
  * SYNOPSIS