| /* Copyright (C) 2005 Red Hat, Inc. */ |
| |
| struct semanage_user; |
| struct semanage_user_key; |
| typedef struct semanage_user_key record_key_t; |
| typedef struct semanage_user record_t; |
| #define DBASE_RECORD_DEFINED |
| |
| #include <string.h> |
| #include <stdlib.h> |
| #include "user_internal.h" |
| #include "seuser_internal.h" |
| #include "handle.h" |
| #include "database.h" |
| #include "errno.h" |
| #include "debug.h" |
| |
| int semanage_user_modify_local(semanage_handle_t * handle, |
| const semanage_user_key_t * key, |
| const semanage_user_t * data) |
| { |
| |
| dbase_config_t *dconfig = semanage_user_dbase_local(handle); |
| return dbase_modify(handle, dconfig, key, data); |
| } |
| |
| static int lookup_seuser(semanage_handle_t * handle, const semanage_user_key_t *k) { |
| semanage_user_t *user; |
| semanage_seuser_t **records; |
| const char *name; |
| const char *sename; |
| unsigned int count; |
| size_t i; |
| int rc = 0; |
| if (semanage_user_query(handle, k, &user) < 0) |
| return 0; |
| name = semanage_user_get_name(user); |
| semanage_seuser_list_local(handle, |
| &records, |
| &count); |
| for(i = 0; i < count; i++) { |
| sename = semanage_seuser_get_sename(records[i]); |
| if (strcmp(name, sename) == 0) { |
| errno = EINVAL; |
| ERR(handle, "%s is being used by %s login record", |
| sename, semanage_seuser_get_name(records[i])); |
| rc = -1; |
| } |
| } |
| for(i = 0; i < count; i++) |
| semanage_seuser_free(records[i]); |
| free(records); |
| semanage_user_free(user); |
| if (rc) |
| errno = EINVAL; |
| return rc; |
| } |
| |
| int semanage_user_del_local(semanage_handle_t * handle, |
| const semanage_user_key_t * key) |
| { |
| if (lookup_seuser(handle, key)) |
| return -1; |
| |
| dbase_config_t *dconfig = semanage_user_dbase_local(handle); |
| return dbase_del(handle, dconfig, key); |
| } |
| |
| int semanage_user_query_local(semanage_handle_t * handle, |
| const semanage_user_key_t * key, |
| semanage_user_t ** response) |
| { |
| |
| dbase_config_t *dconfig = semanage_user_dbase_local(handle); |
| return dbase_query(handle, dconfig, key, response); |
| } |
| |
| int semanage_user_exists_local(semanage_handle_t * handle, |
| const semanage_user_key_t * key, int *response) |
| { |
| |
| dbase_config_t *dconfig = semanage_user_dbase_local(handle); |
| return dbase_exists(handle, dconfig, key, response); |
| } |
| |
| int semanage_user_count_local(semanage_handle_t * handle, |
| unsigned int *response) |
| { |
| |
| dbase_config_t *dconfig = semanage_user_dbase_local(handle); |
| return dbase_count(handle, dconfig, response); |
| } |
| |
| int semanage_user_iterate_local(semanage_handle_t * handle, |
| int (*handler) (const semanage_user_t * record, |
| void *varg), void *handler_arg) |
| { |
| |
| dbase_config_t *dconfig = semanage_user_dbase_local(handle); |
| return dbase_iterate(handle, dconfig, handler, handler_arg); |
| } |
| |
| int semanage_user_list_local(semanage_handle_t * handle, |
| semanage_user_t *** records, unsigned int *count) |
| { |
| |
| dbase_config_t *dconfig = semanage_user_dbase_local(handle); |
| return dbase_list(handle, dconfig, records, count); |
| } |