/* Copyright (C) 2005 Red Hat, Inc. */ struct semanage_seuser; struct semanage_seuser_key; typedef struct semanage_seuser record_t; typedef struct semanage_seuser_key record_key_t; #define DBASE_RECORD_DEFINED struct dbase_file; typedef struct dbase_file dbase_t; #define DBASE_DEFINED #include #include #include "seuser_internal.h" #include "database_file.h" #include "parse_utils.h" #include "debug.h" #include "handle.h" static int seuser_print(semanage_handle_t * handle, semanage_seuser_t * seuser, FILE * str) { const char *name = semanage_seuser_get_name(seuser); const char *sename = semanage_seuser_get_sename(seuser); const char *mls = semanage_seuser_get_mlsrange(seuser); if (fprintf(str, "%s:%s", name, sename) < 0) goto err; if (mls != NULL && fprintf(str, ":%s", mls) < 0) goto err; fprintf(str, "\n"); return STATUS_SUCCESS; err: ERR(handle, "could not print seuser %s to stream", name); return STATUS_ERR; } static int seuser_parse(semanage_handle_t * handle, parse_info_t * info, semanage_seuser_t * seuser) { char *str = NULL; if (parse_skip_space(handle, info) < 0) goto err; if (!info->ptr) goto last; /* Extract name */ if (parse_fetch_string(handle, info, &str, ':') < 0) goto err; if (semanage_seuser_set_name(handle, seuser, str) < 0) goto err; free(str); str = NULL; if (parse_skip_space(handle, info) < 0) goto err; if (parse_assert_ch(handle, info, ':') < 0) goto err; if (parse_skip_space(handle, info) < 0) goto err; /* Extract sename */ if (parse_fetch_string(handle, info, &str, ':') < 0) goto err; if (semanage_seuser_set_sename(handle, seuser, str) < 0) goto err; free(str); str = NULL; if (parse_skip_space(handle, info) < 0) goto err; if (parse_optional_ch(info, ':') == STATUS_NODATA) goto out; if (parse_skip_space(handle, info) < 0) goto err; /* NOTE: does not allow spaces/multiline */ if (parse_fetch_string(handle, info, &str, ' ') < 0) goto err; if (semanage_seuser_set_mlsrange(handle, seuser, str) < 0) goto err; free(str); str = NULL; if (parse_assert_space(handle, info) < 0) goto err; out: return STATUS_SUCCESS; last: parse_dispose_line(info); return STATUS_NODATA; err: ERR(handle, "could not parse seuser record"); free(str); parse_dispose_line(info); return STATUS_ERR; } /* SEUSER RECORD: FILE extension: method table */ record_file_table_t SEMANAGE_SEUSER_FILE_RTABLE = { .parse = seuser_parse, .print = seuser_print, }; int seuser_file_dbase_init(semanage_handle_t * handle, const char *path_ro, const char *path_rw, dbase_config_t * dconfig) { if (dbase_file_init(handle, path_ro, path_rw, &SEMANAGE_SEUSER_RTABLE, &SEMANAGE_SEUSER_FILE_RTABLE, &dconfig->dbase) < 0) return STATUS_ERR; dconfig->dtable = &SEMANAGE_FILE_DTABLE; return STATUS_SUCCESS; } void seuser_file_dbase_release(dbase_config_t * dconfig) { dbase_file_release(dconfig->dbase); }