/* polypath
* send/receive module for secnet
* for multi-route setups */
+/*
+ * This file is part of secnet.
+ * See README for full list of copyright holders.
+ *
+ * secnet 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 d of the License, or
+ * (at your option) any later version.
+ *
+ * secnet 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
+ * version 3 along with secnet; if not, see
+ * https://www.gnu.org/licenses/gpl.html.
+ */
#include "secnet.h"
#include "util.h"
}
static bool_t ifname_search_pats(struct polypath *st, struct cloc loc,
- const char *ifname, bool_t *want_io,
+ const char *ifname, char *want_io,
const char *const *pats) {
/* Returns True iff we found a list entry, in which case *want_io
* is set to the sense of that entry. Otherwise *want_io is set
const char *const *pati;
for (pati=pats; *pati; pati++) {
const char *pat=*pati;
- if (*pat=='!') { *want_io=False; pat++; }
- else if (*pat=='+') { *want_io=True; pat++; }
- else if (*pat=='*' || isalnum((unsigned char)*pat)) { *want_io=True; }
+ if (*pat=='!' || *pat=='+') { *want_io=*pat; pat++; }
+ else if (*pat=='*' || isalnum((unsigned char)*pat)) { *want_io='+'; }
else cfgfatal(loc,"polypath","invalid interface name pattern `%s'",pat);
int match=fnmatch(pat,ifname,0);
if (match==0) return True;
return False;
}
-static bool_t ifname_wanted(struct polypath *st, struct cloc loc,
- const char *ifname) {
- bool_t want=False; /* pretend an empty cfg ends with !<doesn'tmatch> */
+static char ifname_wanted(struct polypath *st, struct cloc loc,
+ const char *ifname) {
+ char want='!'; /* pretend an empty cfg ends with !<doesn'tmatch> */
if (ifname_search_pats(st,loc,ifname,&want, st->ifname_pats))
return want;
- if (want) /* last pattern was positive, do not search default */
- return False;
+ if (want!='!') /* last pattern was positive, do not search default */
+ return '!';
if (!st->permit_loopback &&
ifname_search_pats(st,loc,ifname,&want, default_loopback_ifname_pats))
return want;
* and
* out:
*/
-#define BAD(m) do{ bad(st,badctx,m,0); goto out; }while(0)
-#define BADE(m,ev) do{ bad(st,badctx,m,ev); goto out; }while(0)
+#define BAD(m) do{ bad(st,badctx,M_WARNING,m,0); goto out; }while(0)
+#define BADE(m,ev) do{ bad(st,badctx,M_WARNING,m,ev); goto out; }while(0)
typedef void bad_fn_type(struct polypath *st, void *badctx,
- const char* m, int ev);
+ int mclass, const char* m, int ev);
typedef void polypath_ppml_callback_type(struct polypath *st,
bad_fn_type *bad, void *badctx,
char *undospace;
};
-static void ppml_bad(struct polypath *st, void *badctx, const char *m, int ev)
+static void ppml_bad(struct polypath *st, void *badctx,
+ int mclass, const char *m, int ev)
{
struct ppml_bad_ctx *bc=badctx;
if (bc->undospace)
*(bc->undospace)=' ';
- lg_perror(LG,M_WARNING,ev,
+ lg_perror(LG,mclass,ev,
"error processing polypath state change: %s"
" (while processing `%s')",
m,bc->orgl);
goto out; \
}while(0)
- if (!ifname_wanted(st,st->uc.cc.loc,ifname))
- DONT("unwanted interface name");
+ char want=ifname_wanted(st,st->uc.cc.loc,ifname);
+ if (want=='!') DONT("unwanted interface name");
+ assert(want=='+');
switch (ia.sa.sa_family) {
case AF_INET6: {
for (i=0; i<interf->socks.n_socks; i++)
if (iaddr_equal(&interf->socks.socks[i].addr,ia,True))
goto address_remove_found;
- BAD("address to remove not found");
+ bad(st,badctx,M_DEBUG,"address to remove not found",0);
+ goto out;
address_remove_found:
lg_perror(LG,M_INFO,0,"removed %s %s",ifname,
iaddr_to_string(&interf->socks.socks[i].addr));
/* Actual udp packet sending work */
static bool_t polypath_sendmsg(void *commst, struct buffer_if *buf,
- const struct comm_addr *dest)
+ const struct comm_addr *dest,
+ struct comm_clientinfo *clientinfo)
{
struct polypath *st=commst;
struct interf *interf;
union iaddr ia;
};
-static void papp_bad(struct polypath *st, void *badctx, const char *m, int ev)
+static void papp_bad(struct polypath *st, void *badctx,
+ int mclass, const char *m, int ev)
{
const struct privsep_mdata *mdata=(const void*)st->lbuf.start;
const char *addr_str=badctx;
- lg_perror(LG,M_WARNING,ev,
+ lg_perror(LG,mclass,ev,
"error processing polypath address change %s %s [%s]: %s",
mdata->add ? "+" : "-",
mdata->ifname, addr_str, m);