17 |
|
|
18 |
extern void *xmalloc (size_t); |
extern void *xmalloc (size_t); |
19 |
|
|
20 |
|
static char * |
21 |
|
sql_expand_query (const char *query, const char *username) |
22 |
|
{ |
23 |
|
char *p, *q, *res; |
24 |
|
int len; |
25 |
|
|
26 |
|
if (!query) |
27 |
|
return NULL; |
28 |
|
|
29 |
|
/* Compute resulting query length */ |
30 |
|
for (len = 0, p = query; *p; ) |
31 |
|
{ |
32 |
|
if (*p == '%') |
33 |
|
{ |
34 |
|
if (p[1] == 'u') |
35 |
|
{ |
36 |
|
len += strlen (username); |
37 |
|
p += 2; |
38 |
|
} |
39 |
|
else if (p[1] == '%') |
40 |
|
{ |
41 |
|
len++; |
42 |
|
p += 2; |
43 |
|
} |
44 |
|
else |
45 |
|
{ |
46 |
|
len++; |
47 |
|
p++; |
48 |
|
} |
49 |
|
} |
50 |
|
else |
51 |
|
{ |
52 |
|
len++; |
53 |
|
p++; |
54 |
|
} |
55 |
|
} |
56 |
|
|
57 |
|
res = malloc (len + 1); |
58 |
|
if (!res) |
59 |
|
return res; |
60 |
|
|
61 |
|
for (p = query, q = res; *p; ) |
62 |
|
{ |
63 |
|
if (*p == '%') |
64 |
|
{ |
65 |
|
switch (*++p) |
66 |
|
{ |
67 |
|
case 'u': |
68 |
|
strcpy (q, username); |
69 |
|
q += strlen (q); |
70 |
|
p++; |
71 |
|
break; |
72 |
|
|
73 |
|
case '%': |
74 |
|
*q++ = *p++; |
75 |
|
break; |
76 |
|
|
77 |
|
default: |
78 |
|
*q++ = *p++; |
79 |
|
} |
80 |
|
} |
81 |
|
else |
82 |
|
*q++ = *p++; |
83 |
|
} |
84 |
|
*q = 0; |
85 |
|
return res; |
86 |
|
} |
87 |
|
|
88 |
struct passwd * |
struct passwd * |
89 |
getMpwnam (const char *username) |
getMpwnam (const char *username) |
90 |
{ |
{ |
108 |
if (!m) |
if (!m) |
109 |
return NULL; |
return NULL; |
110 |
|
|
111 |
if (!mysql_real_connect (m, MHOST, MUSER, MPASS, MDB, MPORT, |
if (!mysql_real_connect (m, sql_host, sql_user, sql_passwd, sql_db, sql_port, |
112 |
MSOCKET, MFLAGS)) |
sql_socket, MFLAGS)) |
113 |
{ |
{ |
114 |
mu_error ("MySQL: connect failed: %s", mysql_error (m)); |
mu_error ("MySQL: connect failed: %s", mysql_error (m)); |
115 |
mysql_close (m); |
mysql_close (m); |
116 |
return NULL; |
return NULL; |
117 |
} |
} |
118 |
|
|
119 |
asprintf (&QueryStr, |
QueryStr = sql_expand_query (sql_getpwnam_query, username); |
|
"select %s,%s,%s,%s,%s from %s where %s = '%s'", |
|
|
Mpassword, Muid, Mgid, Mhomedir, Mshell, Mtable, |
|
|
Musername, username); |
|
120 |
|
|
121 |
if (!QueryStr) |
if (!QueryStr) |
122 |
{ |
{ |
192 |
if (!m) |
if (!m) |
193 |
return NULL; |
return NULL; |
194 |
|
|
195 |
if (!mysql_real_connect (m, MHOST, MUSER, MPASS, MDB, MPORT, |
if (!mysql_real_connect (m, sql_host, sql_user, sql_passwd, sql_db, sql_port, |
196 |
MSOCKET, MFLAGS)) |
sql_socket, MFLAGS)) |
197 |
{ |
{ |
198 |
mu_error ("MySQL: connect failed: %s", mysql_error (m)); |
mu_error ("MySQL: connect failed: %s", mysql_error (m)); |
199 |
mysql_close (m); |
mysql_close (m); |
200 |
return NULL; |
return NULL; |
201 |
} |
} |
202 |
|
|
203 |
asprintf (&QueryStr, |
QueryStr = sql_expand_query (sql_getpass_query, username); |
204 |
"select %s from %s where %s = '%s'", |
|
205 |
Mpassword, Mtable, Musername, username); |
if (!QueryStr) |
206 |
|
{ |
207 |
|
mysql_close (m); |
208 |
|
return NULL; |
209 |
|
} |
210 |
|
|
211 |
if (mysql_query (m, QueryStr) != 0) |
if (mysql_query (m, QueryStr) != 0) |
212 |
{ |
{ |