summaryrefslogtreecommitdiff
path: root/net/ser/files/patch-modules::nathelper::natping.c
diff options
context:
space:
mode:
authorAdam Weinberger <adamw@FreeBSD.org>2014-07-29 17:12:47 +0000
committerAdam Weinberger <adamw@FreeBSD.org>2014-07-29 17:12:47 +0000
commit08a006d08a4c35d2c3ecc9a3d10cf7fd14661a84 (patch)
tree0cfc4f0736babb895eb97a65c6defe632a0249c7 /net/ser/files/patch-modules::nathelper::natping.c
parenteditors/fte: update to 20110708 (diff)
Rename all patches that contain '::' as a path separator, and use
'__' instead.
Notes
Notes: svn path=/head/; revision=363362
Diffstat (limited to 'net/ser/files/patch-modules::nathelper::natping.c')
-rw-r--r--net/ser/files/patch-modules::nathelper::natping.c258
1 files changed, 0 insertions, 258 deletions
diff --git a/net/ser/files/patch-modules::nathelper::natping.c b/net/ser/files/patch-modules::nathelper::natping.c
deleted file mode 100644
index ecd5ec1b0f3a..000000000000
--- a/net/ser/files/patch-modules::nathelper::natping.c
+++ /dev/null
@@ -1,258 +0,0 @@
-
-$FreeBSD$
-
---- /dev/null
-+++ modules/nathelper/natping.c
-@@ -0,0 +1,252 @@
-+/* $Id: patch-modules::nathelper::natping.c,v 1.4 2005/04/27 13:35:34 sobomax Exp $
-+ *
-+ * Copyright (C) 2005 Porta Software Ltd
-+ *
-+ * This file is part of ser, a free SIP server.
-+ *
-+ * ser is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version
-+ *
-+ * For a license to use the ser software under conditions
-+ * other than those described here, or to purchase support for this
-+ * software, please contact iptel.org by e-mail at the following addresses:
-+ * info@iptel.org
-+ *
-+ * ser is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *
-+ */
-+
-+#include <unistd.h>
-+#include <signal.h>
-+#include "../usrloc/usrloc.h"
-+#include "../tm/tm_load.h"
-+#include "../../dprint.h"
-+#include "../../parser/parse_hostport.h"
-+#include "../../resolve.h"
-+#include "nathelper.h"
-+
-+int natping_interval = 0;
-+/*
-+ * If this parameter is set then the natpinger will ping only contacts
-+ * that have the NAT flag set in user location database
-+ */
-+int ping_nated_only = 0;
-+
-+/*
-+ * Ping method. Any word except NULL is treated as method name.
-+ */
-+char *natping_method = NULL;
-+
-+static pid_t aux_process = -1;
-+static usrloc_api_t ul;
-+/* TM bind */
-+static struct tm_binds tmb;
-+static int cblen = 0;
-+static const char sbuf[4] = {0, 0, 0, 0};
-+
-+static void natping(unsigned int ticks, void *param);
-+static void natping_cycle(void);
-+
-+int
-+natpinger_init(void)
-+{
-+ bind_usrloc_t bind_usrloc;
-+ load_tm_f load_tm;
-+ char *p;
-+
-+ if (natping_interval > 0) {
-+ bind_usrloc = (bind_usrloc_t)find_export("ul_bind_usrloc", 1, 0);
-+ if (!bind_usrloc) {
-+ LOG(L_ERR, "ERROR: nathelper: natpinger_init: Can't find usrloc module\n");
-+ return -1;
-+ }
-+
-+ if (bind_usrloc(&ul) < 0) {
-+ return -1;
-+ }
-+ if (natping_method != NULL) {
-+ for (p = natping_method; *p != '\0'; ++p)
-+ *p = toupper(*p);
-+ if (strcmp(natping_method, "NULL") == 0)
-+ natping_method = NULL;
-+ }
-+ if (natping_method != NULL) {
-+ /* import the TM auto-loading function */
-+ if (!(load_tm = (load_tm_f)find_export("load_tm", NO_SCRIPT, 0))) {
-+ LOG(L_ERR, "ERROR: nathelper: natpinger_init: can't import load_tm\n");
-+ return -1;
-+ }
-+ /* let the auto-loading function load all TM stuff */
-+ if (load_tm(&tmb) == -1)
-+ return -1;
-+ }
-+
-+ /*
-+ * Use timer only in single process. For forked SER,
-+ * use separate process (see natpinger_child_init())
-+ */
-+ if (dont_fork)
-+ register_timer(natping, NULL, natping_interval);
-+ }
-+
-+ return 0;
-+}
-+
-+int
-+natpinger_child_init(int rank)
-+{
-+
-+ /* If forking is prohibited, use only timer. */
-+ if (dont_fork)
-+ return 0;
-+
-+ /* don't do anything for main process and TCP manager process */
-+ if (rank == PROC_MAIN || rank == PROC_TCP_MAIN)
-+ return 0;
-+
-+ /* only child 1 will fork the aux process */
-+ if (rank != 1)
-+ return 0;
-+
-+ aux_process = fork();
-+ if (aux_process == -1) {
-+ LOG(L_ERR, "natping_child_init(): fork: %s\n", strerror(errno));
-+ return -1;
-+ }
-+ if (aux_process == 0) {
-+ natping_cycle();
-+ /*UNREACHED*/
-+ _exit(1);
-+ }
-+ return 0;
-+}
-+
-+int
-+natpinger_cleanup(void)
-+{
-+
-+ if (aux_process != -1)
-+ kill(aux_process, SIGTERM);
-+ return 0;
-+}
-+
-+static void
-+natping_cycle(void)
-+{
-+
-+ signal(SIGTERM, SIG_DFL); /* no special treat */
-+ for(;;) {
-+ sleep(natping_interval);
-+ natping(0, NULL);
-+ }
-+}
-+
-+static void
-+natping(unsigned int ticks, void *param)
-+{
-+ int rval, n;
-+ void *buf, *cp;
-+ str c;
-+ struct sip_uri curi;
-+ union sockaddr_union to;
-+ struct hostent* he;
-+ struct socket_info* send_sock;
-+ char t;
-+ str p_method, p_from;
-+
-+ buf = NULL;
-+ if (cblen > 0) {
-+ buf = pkg_malloc(cblen);
-+ if (buf == NULL) {
-+ LOG(L_ERR, "ERROR: nathelper::natping: out of memory\n");
-+ return;
-+ }
-+ }
-+ rval = ul.get_all_ucontacts(buf, cblen, (ping_nated_only ? FL_NAT : 0));
-+ if (rval > 0) {
-+ if (buf != NULL)
-+ pkg_free(buf);
-+ cblen = rval * 2;
-+ buf = pkg_malloc(cblen);
-+ if (buf == NULL) {
-+ LOG(L_ERR, "ERROR: nathelper::natping: out of memory\n");
-+ return;
-+ }
-+ rval = ul.get_all_ucontacts(buf, cblen, (ping_nated_only ? FL_NAT : 0));
-+ if (rval != 0) {
-+ pkg_free(buf);
-+ return;
-+ }
-+ }
-+
-+ if (buf == NULL)
-+ return;
-+
-+ cp = buf;
-+ n = 0;
-+ while (1) {
-+ memcpy(&(c.len), cp, sizeof(c.len));
-+ if (c.len == 0)
-+ break;
-+ c.s = (char*)cp + sizeof(c.len);
-+ cp = (char*)cp + sizeof(c.len) + c.len;
-+ if (parse_uri(c.s, c.len, &curi) < 0) {
-+ LOG(L_ERR, "ERROR: nathelper::natping: can't parse contact uri\n");
-+ continue;
-+ }
-+ if (curi.proto != PROTO_UDP && curi.proto != PROTO_NONE)
-+ continue;
-+
-+ if ((++n % 50) == 0)
-+ usleep(1);
-+
-+ if (natping_method != NULL) {
-+ p_method.s = natping_method;
-+ p_method.len = strlen(p_method.s);
-+ p_from.s = "sip:registrar"; /* XXX */
-+ p_from.len = strlen(p_from.s);
-+ if (tmb.t_request(&p_method, &c, &c, &p_from,
-+ NULL, NULL, NULL, NULL) == -1)
-+ {
-+ LOG(L_ERR, "nathelper::natping(): request() failed\n");
-+ }
-+ } else {
-+ if (curi.maddr_val.len != 0) {
-+ t = curi.maddr_val.s[curi.maddr_val.len];
-+ curi.maddr_val.s[curi.maddr_val.len] = '\0';
-+ parse_hostport(curi.maddr_val.s, &curi.host, &curi.port_no);
-+ curi.maddr_val.s[curi.maddr_val.len] = t;
-+ if (curi.host.len <= 0) {
-+ LOG(L_ERR, "ERROR: nathelper::natping: invalid maddr in contact uri\n");
-+ continue;
-+ }
-+ }
-+
-+ if (curi.port_no == 0)
-+ curi.port_no = SIP_PORT;
-+ he = sip_resolvehost(&curi.host, &curi.port_no, PROTO_UDP);
-+ if (he == NULL){
-+ LOG(L_ERR, "ERROR: nathelper::natping: can't resolve host\n");
-+ continue;
-+ }
-+ hostent2su(&to, he, 0, curi.port_no);
-+ send_sock=force_socket ? force_socket :
-+ get_send_socket(0, &to, PROTO_UDP);
-+ if (send_sock == NULL) {
-+ LOG(L_ERR, "ERROR: nathelper::natping: can't get sending socket\n");
-+ continue;
-+ }
-+ udp_send(send_sock, (char *)sbuf, sizeof(sbuf), &to);
-+ }
-+ }
-+ pkg_free(buf);
-+}