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
110
111
112
113
|
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <pwd.h>
#include <port/port.h>
#include "data.h"
#include "db.h"
#include "error.h"
void numlist_add(struct numlist **list, long num) {
struct numlist *tmp = (struct numlist *)malloc(sizeof(*tmp));
if(!tmp)
rl_fatal(EX_SOFTWARE, _("ABORT - Can't allocate memory"));
tmp->next = *list;
tmp->num = num;
*list = tmp;
}
void numlist_copy(struct numlist **to, struct numlist *from) {
while(from) {
numlist_add(to, from->num);
from = from->next;
}
}
void numlist_free(struct numlist *n) {
struct numlist *p;
while(n) {
p = n->next;
free(n);
n = p;
}
}
void stringlist_add(struct stringlist **list, char *str) {
struct stringlist *tmp = (struct stringlist *)malloc(sizeof(*tmp));
if(!tmp)
rl_fatal(EX_SOFTWARE, _("ABORT - Can't allocate memory"));
tmp->next = *list;
tmp->str = str;
*list = tmp;
}
void stringlist_copy(struct stringlist **to, struct stringlist *from) {
while(from) {
stringlist_add(to, strdup(from->str));
from = from->next;
}
}
void stringlist_free(struct stringlist *n) {
struct stringlist *p;
while(n) {
p = n->next;
if(n->str)
free(n->str);
free(n);
n = p;
}
}
void builduserdata(struct userdata **dest, char *name) {
struct passwd pw;
struct passwd *pp;
pp = &pw;
pp = getpwnam(name);
endpwent();
if(!pp)
return;
clearuserdata(dest);
(*dest)->name = name;
(*dest)->uid = pp->pw_uid;
(*dest)->gid = pp->pw_gid;
}
void clearuserdata(struct userdata **dest) {
if(!*dest)
return;
if((*dest)->name)
free((*dest)->name);
memset(*dest, 0, sizeof(**dest));
(*dest)->uid = -1;
(*dest)->gid = -1;
}
void newuserdata(struct userdata **dest) {
if(!*dest)
*dest = (struct userdata *)malloc(sizeof(**dest));
if(!*dest)
rl_fatal(EX_SOFTWARE, _("ABORT - Can't allocate memory"));
memset(*dest, 0, sizeof(**dest));
(*dest)->uid = -1;
(*dest)->gid = -1;
}
void userdata_copy(struct userdata **to, struct userdata *from) {
if(!from)
return;
newuserdata(to);
memcpy(*to, from, sizeof(**to));
(*to)->name = from->name ? strdup(from->name) : NULL;
}
/* vim: set ts=2: */
|