/* Copyright (C) 2005 Red Hat, Inc. */ /* Object: semanage_user_extra_t (SELinux User/Class Extra Data) * Object: semanage_user_extra_key_t (SELinux User/Class Key) * Implements: record_t (Database Record) * Implements: record_key_t (Database Record Key) */ #include <sepol/user_record.h> typedef sepol_user_key_t semanage_user_key_t; #define _SEMANAGE_USER_KEY_DEFINED_ struct semanage_user_extra; typedef struct semanage_user_extra record_t; typedef semanage_user_key_t record_key_t; #define DBASE_RECORD_DEFINED #include <semanage/handle.h> #include <stdlib.h> #include <string.h> #include "user_internal.h" #include "debug.h" #include "database.h" struct semanage_user_extra { /* This user's name */ char *name; /* Labeling prefix */ char *prefix; }; static int semanage_user_extra_key_extract(semanage_handle_t * handle, const semanage_user_extra_t * user_extra, semanage_user_key_t ** key_ptr) { if (semanage_user_key_create(handle, user_extra->name, key_ptr) < 0) goto err; return STATUS_SUCCESS; err: ERR(handle, "could not extract key from user extra record"); return STATUS_ERR; } static int semanage_user_extra_compare(const semanage_user_extra_t * user_extra, const semanage_user_key_t * key) { const char *name; semanage_user_key_unpack(key, &name); return strcmp(user_extra->name, name); } static int semanage_user_extra_compare2(const semanage_user_extra_t * user_extra, const semanage_user_extra_t * user_extra2) { return strcmp(user_extra->name, user_extra2->name); } static int semanage_user_extra_compare2_qsort(const semanage_user_extra_t ** user_extra, const semanage_user_extra_t ** user_extra2) { return strcmp((*user_extra)->name, (*user_extra2)->name); } /* Name */ hidden const char *semanage_user_extra_get_name(const semanage_user_extra_t * user_extra) { return user_extra->name; } hidden int semanage_user_extra_set_name(semanage_handle_t * handle, semanage_user_extra_t * user_extra, const char *name) { char *tmp_name = strdup(name); if (!tmp_name) { ERR(handle, "out of memory, could not set name %s " "for user extra data", name); return STATUS_ERR; } free(user_extra->name); user_extra->name = tmp_name; return STATUS_SUCCESS; } /* Labeling prefix */ hidden const char *semanage_user_extra_get_prefix(const semanage_user_extra_t * user_extra) { return user_extra->prefix; } hidden int semanage_user_extra_set_prefix(semanage_handle_t * handle, semanage_user_extra_t * user_extra, const char *prefix) { char *tmp_prefix = strdup(prefix); if (!tmp_prefix) { ERR(handle, "out of memory, could not set prefix %s " "for user %s", prefix, user_extra->name); return STATUS_ERR; } free(user_extra->prefix); user_extra->prefix = tmp_prefix; return STATUS_SUCCESS; } /* Create */ hidden int semanage_user_extra_create(semanage_handle_t * handle, semanage_user_extra_t ** user_extra_ptr) { semanage_user_extra_t *user_extra = (semanage_user_extra_t *) malloc(sizeof(semanage_user_extra_t)); if (!user_extra) { ERR(handle, "out of memory, could not " "create user extra data record"); return STATUS_ERR; } user_extra->name = NULL; user_extra->prefix = NULL; *user_extra_ptr = user_extra; return STATUS_SUCCESS; } /* Destroy */ hidden void semanage_user_extra_free(semanage_user_extra_t * user_extra) { if (!user_extra) return; free(user_extra->name); free(user_extra->prefix); free(user_extra); } /* Deep copy clone */ hidden int semanage_user_extra_clone(semanage_handle_t * handle, const semanage_user_extra_t * user_extra, semanage_user_extra_t ** user_extra_ptr) { semanage_user_extra_t *new_user_extra = NULL; if (semanage_user_extra_create(handle, &new_user_extra) < 0) goto err; if (semanage_user_extra_set_name (handle, new_user_extra, user_extra->name) < 0) goto err; if (semanage_user_extra_set_prefix (handle, new_user_extra, user_extra->prefix) < 0) goto err; *user_extra_ptr = new_user_extra; return STATUS_SUCCESS; err: ERR(handle, "could not clone extra data for user %s", user_extra->name); semanage_user_extra_free(new_user_extra); return STATUS_ERR; } /* Record base functions */ record_table_t SEMANAGE_USER_EXTRA_RTABLE = { .create = semanage_user_extra_create, .key_extract = semanage_user_extra_key_extract, .key_free = semanage_user_key_free, .clone = semanage_user_extra_clone, .compare = semanage_user_extra_compare, .compare2 = semanage_user_extra_compare2, .compare2_qsort = semanage_user_extra_compare2_qsort, .free = semanage_user_extra_free, };