X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=secnet.git;a=blobdiff_plain;f=polypath.c;h=ac6a18b7e95d5972a6cdabbe45509df741edcaf4;hp=273849a141d1cd3280b5639b71a4a17596a17726;hb=7b7135490b166cefca495e6fcfc4bd4f9158a9de;hpb=b073e347cce9f17f137cbd961a36c75b30a22148 diff --git a/polypath.c b/polypath.c index 273849a..ac6a18b 100644 --- a/polypath.c +++ b/polypath.c @@ -1,6 +1,24 @@ /* 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" @@ -65,7 +83,7 @@ static const char *polypath_addr_to_string(void *commst, } 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 @@ -75,9 +93,8 @@ static bool_t ifname_search_pats(struct polypath *st, struct cloc loc, 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; @@ -87,13 +104,13 @@ static bool_t ifname_search_pats(struct polypath *st, struct cloc loc, 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 ! */ +static char ifname_wanted(struct polypath *st, struct cloc loc, + const char *ifname) { + char want='!'; /* pretend an empty cfg ends with ! */ 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; @@ -127,10 +144,10 @@ static inline bool_t matches32(uint32_t word, uint32_t prefix, int prefixlen) * 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, @@ -142,12 +159,13 @@ struct ppml_bad_ctx { 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); @@ -202,8 +220,9 @@ static void polypath_process_monitor_line(struct polypath *st, char *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: { @@ -350,7 +369,8 @@ static void polypath_record_ifaddr(struct polypath *st, for (i=0; isocks.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)); @@ -423,7 +443,8 @@ static void polypath_afterpoll_monitor(void *state, struct pollfd *fds, /* 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; @@ -546,12 +567,13 @@ struct privsep_mdata { 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);