typedef struct _SmackRuleSet *SmackRuleSet;
/*!
- * Handle to a in-memory representation for long label to
- * short label mapping.
+ * Handle to a in-memory representation for label repository that contains
+ * mapping between long and short names for labels. Short names are essentially
+ * standard Smack labels.
*/
typedef struct _SmackLabelSet *SmackLabelSet;
* Add new label to a label set.
*
* @param handle handle to a label set
- * @param long_name long label
- * @return 0 on success
+ * @param long_name long name for the label as input
+ *
+ * @return pointer to the short name is returned when the operation is
+ * succesful. Otherwise, NULL is returned.
*/
-extern int smack_label_set_add(SmackLabelSet handle, const char *long_name);
+extern const char *smack_label_set_add(SmackLabelSet handle, const char *long_name);
/*!
* Remove a label from a label set.
extern int smack_label_set_remove(SmackLabelSet handle, const char *long_name);
/*!
- * Get pointer to the instance of a given long label inside label set.
- *
- * @param handle handle to a label set
- * @param long_name long name of the label
- */
-extern const char *smack_label_set_get(SmackLabelSet handle, const char *long_name);
-
-/*!
* Get short label.
*
* @param handle handle to a label set
struct smack_label *label_by_short_name;
};
-static int add_label(struct smack_label **label_by_long_name,
- struct smack_label **label_by_short_name,
- const char *long_name,
- const char *short_name);
+static struct smack_label *add_label(struct smack_label **label_by_long_name,
+ struct smack_label **label_by_short_name,
+ const char *long_name,
+ const char *short_name);
SmackLabelSet smack_label_set_new(void)
{
char *buf = NULL;
const char *ll, *sl;
size_t size;
+ struct smack_label *l;
int ret = 0;
file = fopen(path, "r");
ll = strtok(buf, " \t\n");
sl = strtok(NULL, " \t\n");
- if (ll == NULL || sl == NULL || strtok(NULL, " \t\n") != NULL) {
+ if (ll == NULL || sl == NULL ||
+ strtok(NULL, " \t\n") != NULL ||
+ strlen(sl) > SMACK64_LEN) {
+ ret = -1;
+ break;
+ }
+
+ l = add_label(&labels->label_by_long_name,
+ &labels->label_by_short_name,
+ ll, sl);
+ if (l == NULL) {
ret = -1;
- } else {
- ret = add_label(&labels->label_by_long_name, &labels->label_by_short_name,
- ll, sl);
+ break;
}
free(buf);
return 0;
}
-int smack_label_set_add(SmackLabelSet handle, const char *long_name)
+const char *smack_label_set_add(SmackLabelSet handle, const char *long_name)
{
char sl[SMACK64_LEN + 1];
int pos, len ,ret;
+ struct smack_label *l;
if (strlen(long_name) == 0 ||
get_known_label(long_name) != NULL)
- return -EINVAL;
+ return NULL;
len = strlen(long_name);
pos = (len > SMACK64_LEN) ? len - SMACK64_LEN : 0;
strcpy(sl, &long_name[pos]);
- ret = add_label(&handle->label_by_long_name, &handle->label_by_short_name,
- long_name, sl);
+ l = add_label(&handle->label_by_long_name, &handle->label_by_short_name,
+ long_name, sl);
- return ret;
+ return l->short_name;
}
int smack_label_set_remove(SmackLabelSet handle, const char *long_name)
return 0;
}
-const char *smack_label_set_get(SmackLabelSet handle, const char *long_name)
-{
- struct smack_label *l;
- const char *res;
-
- res = get_known_label(long_name);
- if (res != NULL)
- return res;
-
- HASH_FIND(long_name_hh, handle->label_by_long_name, long_name, strlen(long_name), l);
-
- if (l == NULL)
- return NULL;
-
- return l->long_name;
-}
-
const char *smack_label_set_to_short_name(SmackLabelSet handle,
const char *long_name)
{
return l->long_name;
}
-static int add_label(struct smack_label **label_by_long_name,
- struct smack_label **label_by_short_name,
- const char *long_name,
- const char *short_name)
+static struct smack_label *add_label(struct smack_label **label_by_long_name,
+ struct smack_label **label_by_short_name,
+ const char *long_name,
+ const char *short_name)
{
struct smack_label *l;
- if (strlen(short_name) > SMACK64_LEN)
- return -ERANGE;
-
HASH_FIND(long_name_hh, *label_by_long_name, long_name,
strlen(long_name), l);
if (l != NULL)
- return -EEXIST;
+ return NULL;
HASH_FIND(short_name_hh, *label_by_short_name, short_name,
strlen(short_name), l);
if (l != NULL)
- return -EEXIST;
+ return NULL;
l = calloc(1, sizeof(struct smack_label));
if (l == NULL)
- return -ENOMEM;
+ return NULL;
l->long_name = strdup(long_name);
l->short_name = strdup(short_name);
free(l->long_name);
free(l->short_name);
free(l);
- return -ENOMEM;
+ return NULL;
}
HASH_ADD_KEYPTR(long_name_hh, *label_by_long_name, l->long_name, strlen(l->long_name), l);
HASH_ADD_KEYPTR(short_name_hh, *label_by_short_name, l->short_name, strlen(l->short_name), l);
- return 0;
+ return l;
}
SmackLabelSet labels = smack_label_set_new();
fail_unless(labels != NULL, "Creating labels failed");
rc = smack_label_set_add(labels, "ThisIsReallyReallyReallyLongLabelName");
- fail_unless(rc == 0, "Adding label failed");
+ fail_unless(rc != 0, "Adding label failed");
short_name = smack_label_set_to_short_name(labels, "ThisIsReallyReallyReallyLongLabelName");
fail_unless(short_name != NULL, "No short name");
long_name = smack_label_set_to_long_name(labels, short_name);
SmackLabelSet labels = smack_label_set_new();
fail_unless(labels != NULL, "Creating labels failed");
rc = smack_label_set_add(labels, "ThisIsReallyReallyReallyLongLabelName");
- fail_unless(rc == 0, "Adding label failed");
+ fail_unless(rc != 0, "Adding label failed");
rc = smack_label_set_save_to_file(labels, "add_label-result.txt");
fail_unless(rc == 0, "Failed to write labelset");
rc = files_equal("add_label-result.txt", "data/add_label-excepted.txt");
smack_rule_set_attach_label_set(rules, labels);
rc = smack_label_set_add(labels, LONG_LABEL_1);
- fail_unless(rc == 0, "Adding label was not succesful");
+ fail_unless(rc != 0, "Adding label was not succesful");
rc = smack_label_set_add(labels, LONG_LABEL_2);
- fail_unless(rc == 0, "Adding label was not succesful");
+ fail_unless(rc != 0, "Adding label was not succesful");
rc = smack_rule_set_add(rules, LONG_LABEL_1, LONG_LABEL_2, "rx");
fail_unless(rc == 0, "Adding rule was not succesful");
smack_rule_set_attach_label_set(rules, labels);
rc = smack_label_set_add(labels, LONG_LABEL_1);
- fail_unless(rc == 0, "Adding label was not succesful");
+ fail_unless(rc != 0, "Adding label was not succesful");
rc = smack_label_set_add(labels, LONG_LABEL_2);
- fail_unless(rc == 0, "Adding label was not succesful");
+ fail_unless(rc != 0, "Adding label was not succesful");
rc = smack_rule_set_add(rules, LONG_LABEL_1, LONG_LABEL_2, "rx");
fail_unless(rc == 0, "Adding rule was not succesful");