static mrb_value mrb_ipvs_service_del_dest(mrb_state *mrb, mrb_value self){ struct mrb_ipvs_entry *ie; mrb_value arg; mrb_get_args(mrb, "o", &arg); if(!(DATA_TYPE(arg) == &mrb_ipvs_dest_type)) mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument"); ie = DATA_PTR(arg); ipvs_del_dest(DATA_PTR(self), &ie->dest); return mrb_nil_value(); }
/* Send user rules to IPVS module */ static void ipvs_talk(int cmd) { int result = -1; switch (cmd) { case IP_VS_SO_SET_STARTDAEMON: result = ipvs_start_daemon(daemonrule); break; case IP_VS_SO_SET_STOPDAEMON: result = ipvs_stop_daemon(daemonrule); break; case IP_VS_SO_SET_ADD: result = ipvs_add_service(srule); break; case IP_VS_SO_SET_DEL: result = ipvs_del_service(srule); break; case IP_VS_SO_SET_EDIT: result = ipvs_update_service(srule); break; case IP_VS_SO_SET_ZERO: result = ipvs_zero_service(srule); break; case IP_VS_SO_SET_ADDLADDR: result = ipvs_add_laddr(srule, laddr_rule); break; case IP_VS_SO_SET_DELLADDR: result = ipvs_del_laddr(srule, laddr_rule); break; case IP_VS_SO_SET_ADDDEST: result = ipvs_add_dest(srule, drule); break; case IP_VS_SO_SET_DELDEST: result = ipvs_del_dest(srule, drule); break; case IP_VS_SO_SET_EDITDEST: if ((result = ipvs_update_dest(srule, drule)) && (errno == ENOENT)) result = ipvs_add_dest(srule, drule); break; } if (result) log_message(LOG_INFO, "IPVS: %s", ipvs_strerror(errno)); }
/* ------------------------------------------------------------ */ int ipvsfuncs_del_dest(ipvs_service_t *svc, ipvs_dest_t *dest) { int ret; gchar *s1 = g_strdup_printf("%s:%d proto=%d fwmark=%d", INETTXTADDR(svc->addr.ip), ntohs(svc->port), svc->protocol, svc->fwmark); gchar *s2 = g_strdup_printf("%s:%d proto=%d fwmark=%d", INETTXTADDR(dest->addr.ip), ntohs(dest->port), svc->protocol, svc->fwmark); LOGDEBUG(" * del_dest: [%s :: %s]", s1, s2); ret = ipvs_del_dest(svc, dest); if (ret) { LOGDEBUG(" * ERROR del_dest: [%s :: %s] [%s]", s1, s2, ipvs_strerror(errno)); free(s1); free(s2); return -1; } free(s1); free(s2); return 0; }