static int dso_handle_lsmod(pr_ctrls_t *ctrl, int reqargc, char **reqargv) { module *m; /* Check the ACL. */ if (!pr_ctrls_check_acl(ctrl, dso_acttab, "lsmod")) { /* Access denied. */ pr_ctrls_add_response(ctrl, "access denied"); return -1; } if (reqargc != 0) { pr_ctrls_add_response(ctrl, "wrong number of parameters"); return -1; } /* We want to show the modules as `proftpd -l` shows them, in module * load order. So first we find the end of the loaded_modules list, * then walk it backwards. */ for (m = loaded_modules; m && m->next; m = m->next); pr_ctrls_add_response(ctrl, "Loaded Modules:"); for (; m; m = m->prev) pr_ctrls_add_response(ctrl, " mod_%s.c", m->name); return 0; }
static int dso_handle_insmod(pr_ctrls_t *ctrl, int reqargc, char **reqargv) { register unsigned int i; /* Check the ACL. */ if (!pr_ctrls_check_acl(ctrl, dso_acttab, "insmod")) { /* Access denied. */ pr_ctrls_add_response(ctrl, "access denied"); return -1; } /* Sanity check */ if (reqargc == 0 || reqargv == NULL) { pr_ctrls_add_response(ctrl, "missing required parameters"); return -1; } for (i = 0; i < reqargc; i++) { if (dso_load_module(reqargv[i]) < 0) { /* Make the error messages a little more relevant. */ switch (errno) { case EINVAL: pr_ctrls_add_response(ctrl, "error loading '%s': Bad module name", reqargv[i]); break; case EEXIST: pr_ctrls_add_response(ctrl, "error loading '%s': Already loaded", reqargv[i]); break; default: pr_ctrls_add_response(ctrl, "error loading '%s': %s", reqargv[i], strerror(errno)); break; } } else pr_ctrls_add_response(ctrl, "'%s' loaded", reqargv[i]); } return 0; }
static int dso_handle_rmmod(pr_ctrls_t *ctrl, int reqargc, char **reqargv) { register unsigned int i; /* Check the ACL. */ if (!pr_ctrls_check_acl(ctrl, dso_acttab, "rmmod")) { /* Access denied. */ pr_ctrls_add_response(ctrl, "access denied"); return -1; } /* Sanity check */ if (reqargc == 0 || reqargv == NULL) { pr_ctrls_add_response(ctrl, "missing required parameters"); return -1; } for (i = 0; i < reqargc; i++) { if (dso_unload_module_by_name(reqargv[i]) < 0) { switch (errno) { case EINVAL: pr_ctrls_add_response(ctrl, "error unloading '%s': Bad module name", reqargv[i]); break; case ENOENT: pr_ctrls_add_response(ctrl, "error unloading '%s': Module not loaded", reqargv[i]); break; default: pr_ctrls_add_response(ctrl, "error unloading '%s': %s", reqargv[i], strerror(errno)); break; } } else pr_ctrls_add_response(ctrl, "'%s' unloaded", reqargv[i]); } return 0; }
static int dynmasq_handle_dynmasq(pr_ctrls_t *ctrl, int reqargc, char **reqargv) { /* Sanity check */ if (reqargc == 0 || reqargv == NULL) { pr_ctrls_add_response(ctrl, "dynmasq: missing required parameters"); return -1; } if (strcmp(reqargv[0], "refresh") == 0) { /* Check the ACLs. */ if (!pr_ctrls_check_acl(ctrl, dynmasq_acttab, "refresh")) { pr_ctrls_add_response(ctrl, "access denied"); return -1; } return dynmasq_handle_refresh(ctrl, --reqargc, ++reqargv); } pr_ctrls_add_response(ctrl, "dynmasq: unknown dynmasq action: '%s'", reqargv[0]); return -1; }