-static MODCMD_FUNC(cmd_addhost) {
- struct handle_info *hi;
- if (!(hi = user->handle_info)) {
- reply("NSMSG_MUST_AUTH");
- return 0;
- }
- char *slfh_name = argv[1];
- char *tlfh_name = strchr(argv[1], '.');
- if(!tlfh_name) {
- reply("HSMSG_TOPLEVEL_INVALID", slfh_name);
- return 0;
- }
- *tlfh_name = '\0';
- tlfh_name++;
- if(strchr(tlfh_name, '.')) {
- reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
- return 0;
- }
- if(!irccasecmp(slfh_name, "*")) {
- if(hi->opserv_level >= hostserv_conf.toplevel_access) {
- struct hs_toplevel *tlfh;
- for(tlfh = toplevels; tlfh; tlfh = tlfh->next) {
- if(!irccasecmp(tlfh->fakehost, tlfh_name)) break;
- }
- if(tlfh) {
- reply("HSMSG_FAKEHOST_TOPLEVEL_ALREADY_EXISTS", slfh_name, tlfh_name);
- return 0;
- }
- hs_add_toplevel(tlfh_name);
- reply("HSMSG_FAKEHOST_TOPLEVEL_ADDED", tlfh_name);
- return 1;
- }
- reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
- return 0;
- } else {
- struct hs_secondlevel *slfh;
- struct hs_toplevel *tlfh;
- for(tlfh = toplevels; tlfh; tlfh = tlfh->next) {
- if(!irccasecmp(tlfh->fakehost, tlfh_name)) break;
- }
- if(!tlfh) {
- reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
- return 0;
- }
- for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
- if(!irccasecmp(slfh->fakehost, slfh_name)) break;
- }
- if(slfh) {
- reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
- return 0;
- }
- if(!check_management_access(hi, tlfh, NULL)) {
- reply("HSMSG_FAKEHOST_SECONDLEVEL_ALREADY_EXISTS", slfh_name, tlfh_name);
- return 0;
- }
- hs_add_secondlevel(tlfh, slfh_name);
- reply("HSMSG_FAKEHOST_SECONDLEVEL_ADDED", slfh_name, tlfh_name);
- }
- return 0;
-}
-
-static MODCMD_FUNC(cmd_delhost) {
- struct handle_info *hi;
- if (!(hi = user->handle_info)) {
- reply("NSMSG_MUST_AUTH");
- return 0;
- }
- char *slfh_name = argv[1];
- char *tlfh_name = strchr(argv[1], '.');
- *tlfh_name = '\0';
- tlfh_name++;
- if(strchr(tlfh_name, '.')) {
- reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
- return 0;
- }
- struct hs_toplevel *tlfh;
- for(tlfh = toplevels; tlfh; tlfh = tlfh->next) {
- if(!irccasecmp(tlfh->fakehost, tlfh_name)) break;
- }
- if(!tlfh) {
- reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
- return 0;
- }
- if(!irccasecmp(slfh_name, "*")) {
- if(hi->opserv_level < hostserv_conf.toplevel_access) {
- reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
- return 0;
- }
- hs_del_toplevel(tlfh);
- reply("HSMSG_FAKEHOST_TOPLEVEL_DELETED", tlfh_name);
- return 1;
- } else {
- struct hs_secondlevel *slfh;
- for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
- if(!irccasecmp(slfh->fakehost, slfh_name)) break;
- }
- if(!slfh || !check_management_access(hi, tlfh, NULL)) {
- reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
- return 0;
- }
- hs_del_secondlevel(slfh, 1);
- reply("HSMSG_FAKEHOST_SECONDLEVEL_DELETED", slfh_name, tlfh_name);
- }
- return 0;
-}
-