aboutsummaryrefslogtreecommitdiffstats
path: root/libsemanage/src/users_extra_file.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsemanage/src/users_extra_file.c')
-rw-r--r--libsemanage/src/users_extra_file.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/libsemanage/src/users_extra_file.c b/libsemanage/src/users_extra_file.c
new file mode 100644
index 00000000..5f7eb1a1
--- /dev/null
+++ b/libsemanage/src/users_extra_file.c
@@ -0,0 +1,127 @@
+/* Copyright (C) 2005 Red Hat, Inc. */
+
+struct semanage_user_extra;
+struct semanage_user_key;
+typedef struct semanage_user_extra record_t;
+typedef struct semanage_user_key record_key_t;
+#define DBASE_RECORD_DEFINED
+
+struct dbase_file;
+typedef struct dbase_file dbase_t;
+#define DBASE_DEFINED
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <strings.h>
+
+#include "user_internal.h"
+#include "database_file.h"
+#include "parse_utils.h"
+#include "debug.h"
+#include "handle.h"
+
+static int user_extra_print(semanage_handle_t * handle,
+ semanage_user_extra_t * user_extra, FILE * str)
+{
+
+ const char *name = semanage_user_extra_get_name(user_extra);
+ const char *prefix = semanage_user_extra_get_prefix(user_extra);
+
+ if (fprintf(str, "user %s prefix %s;\n", name, prefix) < 0)
+ goto err;
+
+ return STATUS_SUCCESS;
+
+ err:
+ ERR(handle, "could not print user extra data "
+ "for %s to stream", name);
+ return STATUS_ERR;
+}
+
+static int user_extra_parse(semanage_handle_t * handle,
+ parse_info_t * info,
+ semanage_user_extra_t * user_extra)
+{
+
+ char *str = NULL;
+
+ if (parse_skip_space(handle, info) < 0)
+ goto err;
+ if (!info->ptr)
+ goto last;
+
+ /* User string */
+ if (parse_assert_str(handle, info, "user") < 0)
+ goto err;
+ if (parse_assert_space(handle, info) < 0)
+ goto err;
+
+ /* Extract name */
+ if (parse_fetch_string(handle, info, &str, ' ') < 0)
+ goto err;
+ if (semanage_user_extra_set_name(handle, user_extra, str) < 0)
+ goto err;
+ free(str);
+ str = NULL;
+
+ /* Prefix string */
+ if (parse_assert_space(handle, info) < 0)
+ goto err;
+ if (parse_assert_str(handle, info, "prefix") < 0)
+ goto err;
+ if (parse_assert_space(handle, info) < 0)
+ goto err;
+
+ /* Extract prefix */
+ if (parse_fetch_string(handle, info, &str, ';') < 0)
+ goto err;
+ if (semanage_user_extra_set_prefix(handle, user_extra, str) < 0)
+ goto err;
+ free(str);
+ str = NULL;
+
+ /* Semicolon */
+ if (parse_skip_space(handle, info) < 0)
+ goto err;
+ if (parse_assert_ch(handle, info, ';') < 0)
+ goto err;
+
+ return STATUS_SUCCESS;
+
+ last:
+ parse_dispose_line(info);
+ return STATUS_NODATA;
+
+ err:
+ ERR(handle, "could not parse user extra data");
+ free(str);
+ parse_dispose_line(info);
+ return STATUS_ERR;
+}
+
+/* USER EXTRA RECORD: FILE extension: method table */
+record_file_table_t SEMANAGE_USER_EXTRA_FILE_RTABLE = {
+ .parse = user_extra_parse,
+ .print = user_extra_print,
+};
+
+int user_extra_file_dbase_init(semanage_handle_t * handle,
+ const char *fname, dbase_config_t * dconfig)
+{
+
+ if (dbase_file_init(handle,
+ fname,
+ &SEMANAGE_USER_EXTRA_RTABLE,
+ &SEMANAGE_USER_EXTRA_FILE_RTABLE,
+ &dconfig->dbase) < 0)
+ return STATUS_ERR;
+
+ dconfig->dtable = &SEMANAGE_FILE_DTABLE;
+ return STATUS_SUCCESS;
+}
+
+void user_extra_file_dbase_release(dbase_config_t * dconfig)
+{
+
+ dbase_file_release(dconfig->dbase);
+}