2 title: ext/vpopmail? no thanks...
8 If you ever thought about administering vpopmail through PHP, you most
9 probably already stumbled across the [vpopmail](http://pecl.php.net/vpopmail)
10 extension living in [PECL](http://pecl.php.net/), and know that making use of
11 it is rather kludgy...
13 In need of such a solution I've written a simple XML-RPC CGI service in C with
14 help of the [xmlrpc-c](http://xmlrpc-c.sourceforge.net/) library. I really
15 didn't think that it would be that easy, but it definitely was, considering
16 that I'm a C novice ;)
18 The following source will show that it's quite as simple as writing this XML-
19 RPC backend in PHP, and it's really fast.
22 There's now a source tarball available at: <http://dev.iworks.at/vpop-xmlrpc/>
24 #include <sys/types.h>
30 #include <xmlrpc_cgi.h>
32 static xmlrpc_value *vpop_adduser(xmlrpc_env *env, xmlrpc_value *param, void *data)
34 char *user, *domain, *password, *fullname;
37 xmlrpc_parse_value(env, param, "({s:s,s:s,s:s,s:s,*})",
40 "password", &password,
44 if (env->fault_occurred) {
48 rs = vadduser(user, domain, password, fullname, 0) == 0 ? 1 : 0;
50 return xmlrpc_build_value(env, "b", rs);
53 static xmlrpc_value *vpop_deluser(xmlrpc_env *env, xmlrpc_value *param, void *data)
58 xmlrpc_parse_value(env, param, "({s:s,s:s,*})",
63 if (env->fault_occurred) {
67 rs = vdeluser(user, domain) == 0 ? 1 : 0;
69 return xmlrpc_build_value(env, "b", rs);
72 static xmlrpc_value *vpop_passwd(xmlrpc_env *env, xmlrpc_value *param, void *data)
74 char *user, *domain, *password;
77 xmlrpc_parse_value(env, param, "({s:s,s:s,s:s,*})",
83 if (env->fault_occurred) {
87 rs = vpasswd(user, domain, password, 0) == 0 ? 1 : 0;
89 return xmlrpc_build_value(env, "b", rs);
92 static xmlrpc_value *vpop_setquota(xmlrpc_env *env, xmlrpc_value *param, void *data)
94 char *user, *domain, *quota;
97 xmlrpc_parse_value(env, param, "({s:s,s:s,s:s,*})",
103 if (env->fault_occurred) {
107 rs = vsetuserquota(user, domain, quota) == 0 ? 1 : 0;
109 return xmlrpc_build_value(env, "b", rs);
112 int main(int argc, char **argv)
114 xmlrpc_cgi_init(XMLRPC_CGI_NO_FLAGS);
116 xmlrpc_cgi_add_method_w_doc("vpop.adduser", &vpop_adduser, NULL,
117 "b:S", "Add a vpopmail user to a domain with password, fullname and quota.");
118 xmlrpc_cgi_add_method_w_doc("vpop.deluser", &vpop_deluser, NULL,
119 "b:S", "Delete a user from a domain.");
120 xmlrpc_cgi_add_method_w_doc("vpop.passwd", &vpop_passwd, NULL,
121 "b:S", "Change the password of a user in a domain.");
122 xmlrpc_cgi_add_method_w_doc("vpop.setquota", &vpop_setquota, NULL,
123 "b:S", "Set the quota of a user in a domain.");
125 xmlrpc_cgi_process_call();
127 xmlrpc_cgi_cleanup();