/build/buildd/libnl-1.0~pre6/lib/data.c

00001 /*
00002  * lib/data.c           Abstract Data
00003  *
00004  *      This library is free software; you can redistribute it and/or
00005  *      modify it under the terms of the GNU Lesser General Public
00006  *      License as published by the Free Software Foundation version 2.1
00007  *      of the License.
00008  *
00009  * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
00010  */
00011 
00012 /**
00013  * @ingroup utils
00014  * @defgroup data Abstract Data
00015  * @{
00016  */
00017 
00018 #include <netlink-local.h>
00019 #include <netlink/netlink.h>
00020 #include <netlink/utils.h>
00021 #include <linux/socket.h>
00022 
00023 /**
00024  * @name General
00025  * @{
00026  */
00027 
00028 /**
00029  * Allocate a new abstract data object.
00030  * @arg buf             Data buffer containing the actual data.
00031  * @arg size            Size of data buffer.
00032  *
00033  * Allocates a new abstract data and copies the specified data
00034  * buffer into the new handle.
00035  * 
00036  * @return Newly allocated data handle or NULL
00037  */
00038 struct nl_data *nl_data_alloc(void *buf, size_t size)
00039 {
00040         struct nl_data *data;
00041 
00042         data = calloc(1, sizeof(*data));
00043         if (!data)
00044                 goto errout;
00045 
00046         data->d_data = calloc(1, size);
00047         if (!data->d_data) {
00048                 free(data);
00049                 goto errout;
00050         }
00051 
00052         data->d_size = size;
00053 
00054         if (buf)
00055                 memcpy(data->d_data, buf, size);
00056 
00057         return data;
00058 errout:
00059         nl_errno(ENOMEM);
00060         return NULL;
00061 }
00062 
00063 /**
00064  * Append data to an abstract data object.
00065  * @arg data            Abstract data object.
00066  * @arg buf             Data buffer containing the data to be appended.
00067  * @arg size            Size of data to be apppended.
00068  *
00069  * Reallocates an abstract data and copies the specified data
00070  * buffer into the new handle.
00071  * 
00072  * @return 0 on success or a negative error code
00073  */
00074 int nl_data_append(struct nl_data *data, void *buf, size_t size)
00075 {
00076         if (size < 0)
00077                 BUG();
00078 
00079         if (size > 0) {
00080                 data->d_data = realloc(data->d_data, data->d_size + size);
00081                 if (!data->d_data)
00082                         return nl_errno(ENOMEM);
00083 
00084                 if (buf)
00085                         memcpy(data->d_data + data->d_size, buf, size);
00086                 else
00087                         memset(data->d_data + data->d_size, 0, size);
00088 
00089                 data->d_size += size;
00090         }
00091 
00092         return 0;
00093 }
00094 
00095 
00096 /**
00097  * Free an abstract data object.
00098  * @arg data            Abstract data object.
00099  */
00100 void nl_data_free(struct nl_data *data)
00101 {
00102         if (data)
00103                 free(data->d_data);
00104 
00105         free(data);
00106 }
00107 
00108 /** @} */
00109 
00110 /**
00111  * @name Attribute Access
00112  * @{
00113  */
00114 
00115 /**
00116  * Get data buffer of abstract data object.
00117  * @arg data            Abstract data object.
00118  * @return Data buffer or NULL if empty.
00119  */
00120 void *nl_data_get(struct nl_data *data)
00121 {
00122         return data->d_size > 0 ? data->d_data : NULL;
00123 }
00124 
00125 /**
00126  * Get size of data buffer of abstract data object.
00127  * @arg data            Abstract data object.
00128  * @return Size of data buffer.
00129  */
00130 size_t nl_data_get_size(struct nl_data *data)
00131 {
00132         return data->d_size;
00133 }
00134 
00135 /** @} */
00136 
00137 /**
00138  * @name Misc
00139  * @{
00140  */
00141 
00142 /**
00143  * Compare two abstract data objects.
00144  * @arg a               Abstract data object.
00145  * @arg b               Another abstract data object.
00146  * @return An integer less than, equal to, or greater than zero if
00147  *         a is found, respectively, to be less than, to match, or
00148  *         be greater than b.
00149  */
00150 int nl_data_cmp(struct nl_data *a, struct nl_data *b)
00151 {
00152         void *a_ = nl_data_get(a);
00153         void *b_ = nl_data_get(b);
00154 
00155         if (a_ && b_)
00156                 return memcmp(a_, b_, nl_data_get_size(a));
00157         else
00158                 return -1;
00159 }
00160 
00161 /** @} */
00162 /** @} */

Generated on Fri Apr 27 14:14:07 2007 for libnl by  doxygen 1.5.1