1*2d543d20SAndroid Build Coastguard Worker /* Copyright (C) 2005 Red Hat, Inc. */
2*2d543d20SAndroid Build Coastguard Worker
3*2d543d20SAndroid Build Coastguard Worker struct semanage_user;
4*2d543d20SAndroid Build Coastguard Worker struct semanage_user_key;
5*2d543d20SAndroid Build Coastguard Worker typedef struct semanage_user_key record_key_t;
6*2d543d20SAndroid Build Coastguard Worker typedef struct semanage_user record_t;
7*2d543d20SAndroid Build Coastguard Worker #define DBASE_RECORD_DEFINED
8*2d543d20SAndroid Build Coastguard Worker
9*2d543d20SAndroid Build Coastguard Worker #include <string.h>
10*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
11*2d543d20SAndroid Build Coastguard Worker #include "user_internal.h"
12*2d543d20SAndroid Build Coastguard Worker #include "seuser_internal.h"
13*2d543d20SAndroid Build Coastguard Worker #include "handle.h"
14*2d543d20SAndroid Build Coastguard Worker #include "database.h"
15*2d543d20SAndroid Build Coastguard Worker #include "errno.h"
16*2d543d20SAndroid Build Coastguard Worker #include "debug.h"
17*2d543d20SAndroid Build Coastguard Worker
semanage_user_modify_local(semanage_handle_t * handle,const semanage_user_key_t * key,const semanage_user_t * data)18*2d543d20SAndroid Build Coastguard Worker int semanage_user_modify_local(semanage_handle_t * handle,
19*2d543d20SAndroid Build Coastguard Worker const semanage_user_key_t * key,
20*2d543d20SAndroid Build Coastguard Worker const semanage_user_t * data)
21*2d543d20SAndroid Build Coastguard Worker {
22*2d543d20SAndroid Build Coastguard Worker
23*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_user_dbase_local(handle);
24*2d543d20SAndroid Build Coastguard Worker return dbase_modify(handle, dconfig, key, data);
25*2d543d20SAndroid Build Coastguard Worker }
26*2d543d20SAndroid Build Coastguard Worker
lookup_seuser(semanage_handle_t * handle,const semanage_user_key_t * k)27*2d543d20SAndroid Build Coastguard Worker static int lookup_seuser(semanage_handle_t * handle, const semanage_user_key_t *k) {
28*2d543d20SAndroid Build Coastguard Worker semanage_user_t *user;
29*2d543d20SAndroid Build Coastguard Worker semanage_seuser_t **records;
30*2d543d20SAndroid Build Coastguard Worker const char *name;
31*2d543d20SAndroid Build Coastguard Worker const char *sename;
32*2d543d20SAndroid Build Coastguard Worker unsigned int count;
33*2d543d20SAndroid Build Coastguard Worker size_t i;
34*2d543d20SAndroid Build Coastguard Worker int rc = 0;
35*2d543d20SAndroid Build Coastguard Worker if (semanage_user_query(handle, k, &user) < 0)
36*2d543d20SAndroid Build Coastguard Worker return 0;
37*2d543d20SAndroid Build Coastguard Worker name = semanage_user_get_name(user);
38*2d543d20SAndroid Build Coastguard Worker semanage_seuser_list_local(handle,
39*2d543d20SAndroid Build Coastguard Worker &records,
40*2d543d20SAndroid Build Coastguard Worker &count);
41*2d543d20SAndroid Build Coastguard Worker for(i = 0; i < count; i++) {
42*2d543d20SAndroid Build Coastguard Worker sename = semanage_seuser_get_sename(records[i]);
43*2d543d20SAndroid Build Coastguard Worker if (strcmp(name, sename) == 0) {
44*2d543d20SAndroid Build Coastguard Worker errno = EINVAL;
45*2d543d20SAndroid Build Coastguard Worker ERR(handle, "%s is being used by %s login record",
46*2d543d20SAndroid Build Coastguard Worker sename, semanage_seuser_get_name(records[i]));
47*2d543d20SAndroid Build Coastguard Worker rc = -1;
48*2d543d20SAndroid Build Coastguard Worker }
49*2d543d20SAndroid Build Coastguard Worker }
50*2d543d20SAndroid Build Coastguard Worker for(i = 0; i < count; i++)
51*2d543d20SAndroid Build Coastguard Worker semanage_seuser_free(records[i]);
52*2d543d20SAndroid Build Coastguard Worker free(records);
53*2d543d20SAndroid Build Coastguard Worker semanage_user_free(user);
54*2d543d20SAndroid Build Coastguard Worker if (rc)
55*2d543d20SAndroid Build Coastguard Worker errno = EINVAL;
56*2d543d20SAndroid Build Coastguard Worker return rc;
57*2d543d20SAndroid Build Coastguard Worker }
58*2d543d20SAndroid Build Coastguard Worker
semanage_user_del_local(semanage_handle_t * handle,const semanage_user_key_t * key)59*2d543d20SAndroid Build Coastguard Worker int semanage_user_del_local(semanage_handle_t * handle,
60*2d543d20SAndroid Build Coastguard Worker const semanage_user_key_t * key)
61*2d543d20SAndroid Build Coastguard Worker {
62*2d543d20SAndroid Build Coastguard Worker if (lookup_seuser(handle, key))
63*2d543d20SAndroid Build Coastguard Worker return -1;
64*2d543d20SAndroid Build Coastguard Worker
65*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_user_dbase_local(handle);
66*2d543d20SAndroid Build Coastguard Worker return dbase_del(handle, dconfig, key);
67*2d543d20SAndroid Build Coastguard Worker }
68*2d543d20SAndroid Build Coastguard Worker
semanage_user_query_local(semanage_handle_t * handle,const semanage_user_key_t * key,semanage_user_t ** response)69*2d543d20SAndroid Build Coastguard Worker int semanage_user_query_local(semanage_handle_t * handle,
70*2d543d20SAndroid Build Coastguard Worker const semanage_user_key_t * key,
71*2d543d20SAndroid Build Coastguard Worker semanage_user_t ** response)
72*2d543d20SAndroid Build Coastguard Worker {
73*2d543d20SAndroid Build Coastguard Worker
74*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_user_dbase_local(handle);
75*2d543d20SAndroid Build Coastguard Worker return dbase_query(handle, dconfig, key, response);
76*2d543d20SAndroid Build Coastguard Worker }
77*2d543d20SAndroid Build Coastguard Worker
semanage_user_exists_local(semanage_handle_t * handle,const semanage_user_key_t * key,int * response)78*2d543d20SAndroid Build Coastguard Worker int semanage_user_exists_local(semanage_handle_t * handle,
79*2d543d20SAndroid Build Coastguard Worker const semanage_user_key_t * key, int *response)
80*2d543d20SAndroid Build Coastguard Worker {
81*2d543d20SAndroid Build Coastguard Worker
82*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_user_dbase_local(handle);
83*2d543d20SAndroid Build Coastguard Worker return dbase_exists(handle, dconfig, key, response);
84*2d543d20SAndroid Build Coastguard Worker }
85*2d543d20SAndroid Build Coastguard Worker
semanage_user_count_local(semanage_handle_t * handle,unsigned int * response)86*2d543d20SAndroid Build Coastguard Worker int semanage_user_count_local(semanage_handle_t * handle,
87*2d543d20SAndroid Build Coastguard Worker unsigned int *response)
88*2d543d20SAndroid Build Coastguard Worker {
89*2d543d20SAndroid Build Coastguard Worker
90*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_user_dbase_local(handle);
91*2d543d20SAndroid Build Coastguard Worker return dbase_count(handle, dconfig, response);
92*2d543d20SAndroid Build Coastguard Worker }
93*2d543d20SAndroid Build Coastguard Worker
semanage_user_iterate_local(semanage_handle_t * handle,int (* handler)(const semanage_user_t * record,void * varg),void * handler_arg)94*2d543d20SAndroid Build Coastguard Worker int semanage_user_iterate_local(semanage_handle_t * handle,
95*2d543d20SAndroid Build Coastguard Worker int (*handler) (const semanage_user_t * record,
96*2d543d20SAndroid Build Coastguard Worker void *varg), void *handler_arg)
97*2d543d20SAndroid Build Coastguard Worker {
98*2d543d20SAndroid Build Coastguard Worker
99*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_user_dbase_local(handle);
100*2d543d20SAndroid Build Coastguard Worker return dbase_iterate(handle, dconfig, handler, handler_arg);
101*2d543d20SAndroid Build Coastguard Worker }
102*2d543d20SAndroid Build Coastguard Worker
semanage_user_list_local(semanage_handle_t * handle,semanage_user_t *** records,unsigned int * count)103*2d543d20SAndroid Build Coastguard Worker int semanage_user_list_local(semanage_handle_t * handle,
104*2d543d20SAndroid Build Coastguard Worker semanage_user_t *** records, unsigned int *count)
105*2d543d20SAndroid Build Coastguard Worker {
106*2d543d20SAndroid Build Coastguard Worker
107*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_user_dbase_local(handle);
108*2d543d20SAndroid Build Coastguard Worker return dbase_list(handle, dconfig, records, count);
109*2d543d20SAndroid Build Coastguard Worker }
110