tzh
2024-08-22 c7d0944258c7d0943aa7b2211498fd612971ce27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* 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);
}