This diff removes all "extern struct snmpd *" lines from source files,
replaces all 'env' occurences with 'snmpd_env' and adds the extern
declaration for snmpd_env in the snmpd.h header.

With this diff we only need to guarantee that this variable is set,
we avoid shadowing other 'env' variables and we diminish the confusion
about this env variable thing.

We need this diff (or something with the same effect) to proceed with
fork+exec, because jca@ found out that traphandler child process do not
set env. We could alternatively just set env in traphandler p_init() and
remove snmpd_env, however it looks cleaner to me to not have all this
extern in all .c files and have a propper name for 'env'.

ok?


Index: kroute.c
===================================================================
RCS file: /home/obsdcvs/src/usr.sbin/snmpd/kroute.c,v
retrieving revision 1.33
diff -u -p -r1.33 kroute.c
--- kroute.c    3 Sep 2016 15:45:02 -0000       1.33
+++ kroute.c    22 Oct 2016 22:20:00 -0000
@@ -44,8 +44,6 @@
 
 #include "snmpd.h"
 
-extern struct snmpd    *env;
-
 struct ktable          **krt;
 u_int                    krt_size;
 
@@ -173,8 +171,9 @@ kr_init(void)
            &opt, sizeof(opt)) == -1)
                log_warn("%s: SO_USELOOPBACK", __func__);       /* not fatal */
 
-       if (env->sc_rtfilter && setsockopt(kr_state.ks_fd, PF_ROUTE,
-           ROUTE_MSGFILTER, &env->sc_rtfilter, sizeof(env->sc_rtfilter)) == -1)
+       if (snmpd_env->sc_rtfilter && setsockopt(kr_state.ks_fd, PF_ROUTE,
+           ROUTE_MSGFILTER, &snmpd_env->sc_rtfilter,
+           sizeof(snmpd_env->sc_rtfilter)) == -1)
                log_warn("%s: ROUTE_MSGFILTER", __func__);
 
        /* grow receive buffer, don't wanna miss messages */
Index: mib.c
===================================================================
RCS file: /home/obsdcvs/src/usr.sbin/snmpd/mib.c,v
retrieving revision 1.80
diff -u -p -r1.80 mib.c
--- mib.c       17 Nov 2015 12:30:23 -0000      1.80
+++ mib.c       22 Oct 2016 22:26:52 -0000
@@ -58,8 +58,6 @@
 #include "snmpd.h"
 #include "mib.h"
 
-extern struct snmpd    *env;
-
 /*
  * Defined in SNMPv2-MIB.txt (RFC 3418)
  */
@@ -255,7 +253,7 @@ mib_sysor(struct oid *oid, struct ber_oi
 int
 mib_getsnmp(struct oid *oid, struct ber_oid *o, struct ber_element **elm)
 {
-       struct snmp_stats       *stats = &env->sc_stats;
+       struct snmp_stats       *stats = &snmpd_env->sc_stats;
        long long                i;
        struct statsmap {
                u_int8_t         m_id;
@@ -316,7 +314,7 @@ mib_getsnmp(struct oid *oid, struct ber_
 int
 mib_setsnmp(struct oid *oid, struct ber_oid *o, struct ber_element **elm)
 {
-       struct snmp_stats       *stats = &env->sc_stats;
+       struct snmp_stats       *stats = &snmpd_env->sc_stats;
        long long                i;
 
        if (ber_get_integer(*elm, &i) == -1)
@@ -354,11 +352,11 @@ mib_engine(struct oid *oid, struct ber_o
 {
        switch (oid->o_oid[OIDIDX_snmpEngine]) {
        case 1:
-               *elm = ber_add_nstring(*elm, env->sc_engineid,
-                   env->sc_engineid_len);
+               *elm = ber_add_nstring(*elm, snmpd_env->sc_engineid,
+                   snmpd_env->sc_engineid_len);
                break;
        case 2:
-               *elm = ber_add_integer(*elm, env->sc_engine_boots);
+               *elm = ber_add_integer(*elm, snmpd_env->sc_engine_boots);
                break;
        case 3:
                *elm = ber_add_integer(*elm, snmpd_engine_time());
@@ -375,7 +373,7 @@ mib_engine(struct oid *oid, struct ber_o
 int
 mib_usmstats(struct oid *oid, struct ber_oid *o, struct ber_element **elm)
 {
-       struct snmp_stats       *stats = &env->sc_stats;
+       struct snmp_stats       *stats = &snmpd_env->sc_stats;
        long long                i;
        struct statsmap {
                u_int8_t         m_id;
@@ -697,7 +695,7 @@ mib_hrdevice(struct oid *oid, struct ber
 
        /* Get and verify the current row index */
        idx = o->bo_id[OIDIDX_hrDeviceEntry];
-       if (idx > (u_int)env->sc_ncpu)
+       if (idx > (u_int)snmpd_env->sc_ncpu)
                return (1);
 
        /* Tables need to prepend the OID on their own */
@@ -748,7 +746,7 @@ mib_hrprocessor(struct oid *oid, struct 
 
        /* Get and verify the current row index */
        idx = o->bo_id[OIDIDX_hrDeviceEntry];
-       if (idx > (u_int)env->sc_ncpu)
+       if (idx > (u_int)snmpd_env->sc_ncpu)
                return (1);
        else if (idx < 1)
                idx = 1;
@@ -766,9 +764,9 @@ mib_hrprocessor(struct oid *oid, struct 
                 * The percentage of time that the system was not
                 * idle during the last minute.
                 */
-               if (env->sc_cpustates == NULL)
+               if (snmpd_env->sc_cpustates == NULL)
                        return (-1);
-               cptime2 = env->sc_cpustates + (CPUSTATES * (idx - 1));
+               cptime2 = snmpd_env->sc_cpustates + (CPUSTATES * (idx - 1));
                val = 100 -
                    (cptime2[CP_IDLE] > 1000 ? 1000 : (cptime2[CP_IDLE] / 10));
                ber = ber_add_integer(ber, val);
Index: mps.c
===================================================================
RCS file: /home/obsdcvs/src/usr.sbin/snmpd/mps.c,v
retrieving revision 1.23
diff -u -p -r1.23 mps.c
--- mps.c       5 Dec 2015 06:42:18 -0000       1.23
+++ mps.c       22 Oct 2016 22:21:16 -0000
@@ -45,8 +45,6 @@
 #include "snmpd.h"
 #include "mib.h"
 
-extern struct snmpd *env;
-
 struct ber_oid *
         mps_table(struct oid *, struct ber_oid *, struct ber_oid *);
 
Index: smi.c
===================================================================
RCS file: /home/obsdcvs/src/usr.sbin/snmpd/smi.c,v
retrieving revision 1.19
diff -u -p -r1.19 smi.c
--- smi.c       5 Dec 2015 06:42:18 -0000       1.19
+++ smi.c       22 Oct 2016 22:19:28 -0000
@@ -49,8 +49,6 @@
 
 #define MINIMUM(a, b)  (((a) < (b)) ? (a) : (b))
 
-extern struct snmpd *env;
-
 RB_HEAD(oidtree, oid);
 RB_PROTOTYPE(oidtree, oid, o_element, smi_oid_cmp);
 struct oidtree smi_oidtree;
@@ -66,9 +64,9 @@ smi_getticks(void)
        u_long           ticks;
 
        gettimeofday(&now, NULL);
-       if (timercmp(&now, &env->sc_starttime, <=))
+       if (timercmp(&now, &snmpd_env->sc_starttime, <=))
                return (0);
-       timersub(&now, &env->sc_starttime, &run);
+       timersub(&now, &snmpd_env->sc_starttime, &run);
        ticks = run.tv_sec * 100;
        if (run.tv_usec)
                ticks += run.tv_usec / 10000;
@@ -108,7 +106,7 @@ smi_oid2string(struct ber_oid *o, char *
        bcopy(o, &key.o_id, sizeof(struct ber_oid));
        key.o_flags |= OID_KEY;         /* do not match wildcards */
 
-       if (env->sc_flags & SNMPD_F_NONAMES)
+       if (snmpd_env->sc_flags & SNMPD_F_NONAMES)
                lookup = 0;
 
        for (i = 0; i < o->bo_n; i++) {
Index: snmpd.h
===================================================================
RCS file: /home/obsdcvs/src/usr.sbin/snmpd/snmpd.h,v
retrieving revision 1.69
diff -u -p -r1.69 snmpd.h
--- snmpd.h     3 Oct 2016 12:16:41 -0000       1.69
+++ snmpd.h     22 Oct 2016 22:26:19 -0000
@@ -580,6 +580,8 @@ struct trapcmd {
 RB_HEAD(trapcmd_tree, trapcmd);
 extern struct trapcmd_tree trapcmd_tree;
 
+extern struct snmpd *snmpd_env;
+
 /* control.c */
 int             control_init(struct privsep *, struct control_sock *);
 int             control_listen(struct control_sock *);
Index: snmpe.c
===================================================================
RCS file: /home/obsdcvs/src/usr.sbin/snmpd/snmpe.c,v
retrieving revision 1.42
diff -u -p -r1.42 snmpe.c
--- snmpe.c     16 Aug 2016 18:41:57 -0000      1.42
+++ snmpe.c     23 Oct 2016 11:37:58 -0000
@@ -52,8 +52,6 @@ void   snmpe_recvmsg(int fd, short, void 
 int     snmpe_encode(struct snmp_message *);
 void    snmp_msgfree(struct snmp_message *);
 
-struct snmpd   *env = NULL;
-
 struct imsgev  *iev_parent;
 
 static struct privsep_proc procs[] = {
@@ -63,13 +61,12 @@ static struct privsep_proc procs[] = {
 pid_t
 snmpe(struct privsep *ps, struct privsep_proc *p)
 {
+       struct snmpd    *env = ps->ps_env;
 #ifdef DEBUG
        char             buf[BUFSIZ];
        struct oid      *oid;
 #endif
 
-       env = ps->ps_env;
-
 #ifdef DEBUG
        for (oid = NULL; (oid = smi_foreach(oid, 0)) != NULL;) {
                smi_oid2string(&oid->o_id, buf, sizeof(buf), 0);
@@ -88,6 +85,8 @@ snmpe(struct privsep *ps, struct privsep
 void
 snmpe_init(struct privsep *ps, struct privsep_proc *p, void *arg)
 {
+       struct snmpd    *env = ps->ps_env;
+
        kr_init();
        trap_init();
        timer_init();
@@ -149,6 +148,7 @@ snmpe_bind(struct address *addr)
 int
 snmpe_parse(struct snmp_message *msg)
 {
+       struct snmpd            *env = snmpd_env;
        struct snmp_stats       *stats = &env->sc_stats;
        struct ber_element      *a;
        long long                ver, req;
@@ -331,7 +331,7 @@ snmpe_parse(struct snmp_message *msg)
 int
 snmpe_parsevarbinds(struct snmp_message *msg)
 {
-       struct snmp_stats       *stats = &env->sc_stats;
+       struct snmp_stats       *stats = &snmpd_env->sc_stats;
        char                     buf[BUFSIZ];
        struct ber_oid           o;
        int                      ret = 0;
@@ -398,7 +398,7 @@ snmpe_parsevarbinds(struct snmp_message 
                                        goto varfail;
 
                                case SNMP_C_SETREQ:
-                                       if (env->sc_readonly == 0) {
+                                       if (snmpd_env->sc_readonly == 0) {
                                                ret = mps_setreq(msg,
                                                    msg->sm_b, &o);
                                                if (ret == 0)
@@ -452,6 +452,7 @@ snmpe_parsevarbinds(struct snmp_message 
 void
 snmpe_recvmsg(int fd, short sig, void *arg)
 {
+       struct snmpd            *env = arg;
        struct snmp_stats       *stats = &env->sc_stats;
        ssize_t                  len;
        struct snmp_message     *msg;
@@ -508,13 +509,13 @@ snmpe_dispatchmsg(struct snmp_message *m
 
        /* not dispatched to subagent; respond directly */
        msg->sm_context = SNMP_C_GETRESP;
-       snmpe_response(env->sc_sock, msg);
+       snmpe_response(snmpd_env->sc_sock, msg);
 }
 
 void
 snmpe_response(int fd, struct snmp_message *msg)
 {
-       struct snmp_stats       *stats = &env->sc_stats;
+       struct snmp_stats       *stats = &snmpd_env->sc_stats;
        u_int8_t                *ptr = NULL;
        ssize_t                  len;
 
@@ -596,8 +597,9 @@ snmpe_encode(struct snmp_message *msg)
 
        pdu = epdu = ber_add_sequence(NULL);
        if (msg->sm_version == SNMP_V3) {
-               if ((epdu = ber_printf_elements(epdu, "xs{", env->sc_engineid,
-                   env->sc_engineid_len, msg->sm_ctxname)) == NULL) {
+               if ((epdu = ber_printf_elements(epdu, "xs{",
+                   snmpd_env->sc_engineid, snmpd_env->sc_engineid_len,
+                   msg->sm_ctxname)) == NULL) {
                        ber_free_elements(pdu);
                        return -1;
                }
Index: timer.c
===================================================================
RCS file: /home/obsdcvs/src/usr.sbin/snmpd/timer.c,v
retrieving revision 1.6
diff -u -p -r1.6 timer.c
--- timer.c     26 Sep 2016 14:00:05 -0000      1.6
+++ timer.c     22 Oct 2016 22:22:25 -0000
@@ -42,8 +42,6 @@
 #include "snmpd.h"
 #include "mib.h"
 
-extern struct snmpd    *env;
-
 void    timer_cpu(int, short, void *);
 int     percentages(int, int64_t *, int64_t *, int64_t *, int64_t *);
 
@@ -62,9 +60,9 @@ timer_cpu(int fd, short event, void *arg
        int64_t         *cptime2;
 
        len = CPUSTATES * sizeof(int64_t);
-       for (n = 0; n < env->sc_ncpu; n++) {
+       for (n = 0; n < snmpd_env->sc_ncpu; n++) {
                mib[2] = n;
-               cptime2 = env->sc_cpustates + (CPUSTATES * n);
+               cptime2 = snmpd_env->sc_cpustates + (CPUSTATES * n);
                if (sysctl(mib, 3, cp_time[n], &len, NULL, 0) == -1)
                        continue;
                (void)percentages(CPUSTATES, cptime2, cp_time[n],
@@ -85,18 +83,19 @@ timer_init(void)
        int      mib[] = { CTL_HW, HW_NCPU }, i;
        size_t   len;
 
-       len = sizeof(env->sc_ncpu);
-       if (sysctl(mib, 2, &env->sc_ncpu, &len, NULL, 0) == -1)
+       len = sizeof(snmpd_env->sc_ncpu);
+       if (sysctl(mib, 2, &snmpd_env->sc_ncpu, &len, NULL, 0) == -1)
                fatal("sysctl");
 
-       env->sc_cpustates = calloc(env->sc_ncpu, CPUSTATES * sizeof(int64_t));
-       cp_time = calloc(env->sc_ncpu, sizeof(int64_t *));
-       cp_old = calloc(env->sc_ncpu, sizeof(int64_t *));
-       cp_diff = calloc(env->sc_ncpu, sizeof(int64_t *));
-       if (env->sc_cpustates == NULL ||
+       snmpd_env->sc_cpustates = calloc(snmpd_env->sc_ncpu,
+           CPUSTATES * sizeof(int64_t));
+       cp_time = calloc(snmpd_env->sc_ncpu, sizeof(int64_t *));
+       cp_old = calloc(snmpd_env->sc_ncpu, sizeof(int64_t *));
+       cp_diff = calloc(snmpd_env->sc_ncpu, sizeof(int64_t *));
+       if (snmpd_env->sc_cpustates == NULL ||
            cp_time == NULL || cp_old == NULL || cp_diff == NULL)
                fatal("calloc");
-       for (i = 0; i < env->sc_ncpu; i++) {
+       for (i = 0; i < snmpd_env->sc_ncpu; i++) {
                cp_time[i] = calloc(CPUSTATES, sizeof(int64_t));
                cp_old[i] = calloc(CPUSTATES, sizeof(int64_t));
                cp_diff[i] = calloc(CPUSTATES, sizeof(int64_t));
Index: trap.c
===================================================================
RCS file: /home/obsdcvs/src/usr.sbin/snmpd/trap.c,v
retrieving revision 1.26
diff -u -p -r1.26 trap.c
--- trap.c      5 Dec 2015 06:42:18 -0000       1.26
+++ trap.c      22 Oct 2016 22:22:57 -0000
@@ -39,8 +39,6 @@
 #include "snmpd.h"
 #include "mib.h"
 
-extern struct snmpd    *env;
-
 void
 trap_init(void)
 {
@@ -158,7 +156,7 @@ trap_send(struct ber_oid *oid, struct be
        char                     ostr[SNMP_MAX_OID_STRLEN];
        struct oid               oa, ob;
 
-       if (TAILQ_EMPTY(&env->sc_trapreceivers))
+       if (TAILQ_EMPTY(&snmpd_env->sc_trapreceivers))
                return (0);
 
        smi_scalar_oidlen(&uptime);
@@ -187,7 +185,7 @@ trap_send(struct ber_oid *oid, struct be
        bzero(&ber, sizeof(ber));
        ber.fd = -1;
 
-       TAILQ_FOREACH(tr, &env->sc_trapreceivers, entry) {
+       TAILQ_FOREACH(tr, &snmpd_env->sc_trapreceivers, entry) {
                if (tr->sa_oid != NULL && tr->sa_oid->bo_n) {
                        /* The trap receiver may want only a specified MIB */
                        bcopy(&tr->sa_oid->bo_id, &ob.o_oid,
@@ -203,7 +201,7 @@ trap_send(struct ber_oid *oid, struct be
                }
 
                cmn = tr->sa_community != NULL ?
-                   tr->sa_community : env->sc_trcommunity;
+                   tr->sa_community : snmpd_env->sc_trcommunity;
 
                /* SNMP header */
                root = ber_add_sequence(NULL);
@@ -219,7 +217,7 @@ trap_send(struct ber_oid *oid, struct be
                if (ber_get_writebuf(&ber, (void *)&ptr) > 0 &&
                    sendto(s, ptr, len, 0, (struct sockaddr *)&tr->ss,
                    tr->ss.ss_len) != -1) {
-                       env->sc_stats.snmp_outpkts++;
+                       snmpd_env->sc_stats.snmp_outpkts++;
                        ret++;
                }
 
Index: usm.c
===================================================================
RCS file: /home/obsdcvs/src/usr.sbin/snmpd/usm.c,v
retrieving revision 1.10
diff -u -p -r1.10 usm.c
--- usm.c       3 Oct 2016 12:19:59 -0000       1.10
+++ usm.c       22 Oct 2016 22:25:11 -0000
@@ -42,8 +42,6 @@
 #include "snmpd.h"
 #include "mib.h"
 
-extern struct snmpd    *env;
-
 SLIST_HEAD(, usmuser)  usmuserlist;
 
 const EVP_MD           *usm_get_md(enum usmauth);
@@ -210,7 +208,7 @@ fail:
 struct ber_element *
 usm_decode(struct snmp_message *msg, struct ber_element *elm, const char 
**errp)
 {
-       struct snmp_stats       *stats = &env->sc_stats;
+       struct snmp_stats       *stats = &snmpd_env->sc_stats;
        off_t                    offs, offs2;
        char                    *usmparams;
        size_t                   len;
@@ -263,8 +261,8 @@ usm_decode(struct snmp_message *msg, str
                goto done;
        }
 
-       if (enginelen != env->sc_engineid_len ||
-           memcmp(engineid, env->sc_engineid, enginelen) != 0) {
+       if (enginelen != snmpd_env->sc_engineid_len ||
+           memcmp(engineid, snmpd_env->sc_engineid, enginelen) != 0) {
                *errp = "unknown engine id";
                msg->sm_usmerr = OIDVAL_usmErrEngineId;
                stats->snmp_usmnosuchengine++;
@@ -273,7 +271,7 @@ usm_decode(struct snmp_message *msg, str
 
        if (engine_boots != 0LL && engine_time != 0LL) {
                now = snmpd_engine_time();
-               if (engine_boots != env->sc_engine_boots ||
+               if (engine_boots != snmpd_env->sc_engine_boots ||
                    engine_time < (long long)(now - SNMP_MAX_TIMEWINDOW) ||
                    engine_time > (long long)(now + SNMP_MAX_TIMEWINDOW)) {
                        *errp = "out of time window";
@@ -372,11 +370,12 @@ usm_encode(struct snmp_message *msg, str
        } else
                saltlen = 0;
 
-       msg->sm_engine_boots = (u_int32_t)env->sc_engine_boots;
+       msg->sm_engine_boots = (u_int32_t)snmpd_env->sc_engine_boots;
        msg->sm_engine_time = (u_int32_t)snmpd_engine_time();
        if ((a = ber_printf_elements(usm, "xdds",
-           env->sc_engineid, env->sc_engineid_len, msg->sm_engine_boots,
-           msg->sm_engine_time, msg->sm_username)) == NULL)
+           snmpd_env->sc_engineid, snmpd_env->sc_engineid_len,
+           msg->sm_engine_boots, msg->sm_engine_time,
+           msg->sm_username)) == NULL)
                goto done;
 
        if ((a = ber_add_nstring(a, digest, digestlen)) == NULL)
@@ -644,14 +643,15 @@ usm_passwd2key(const EVP_MD *md, char *p
 
        /* Localize the key */
 #ifdef DEBUG
-       assert(env->sc_engineid_len <= SNMPD_MAXENGINEIDLEN);
+       assert(snmpd_env->sc_engineid_len <= SNMPD_MAXENGINEIDLEN);
 #endif
        memcpy(pwbuf, keybuf, dlen);
-       memcpy(pwbuf + dlen, env->sc_engineid, env->sc_engineid_len);
-       memcpy(pwbuf + dlen + env->sc_engineid_len, keybuf, dlen);
+       memcpy(pwbuf + dlen, snmpd_env->sc_engineid,
+           snmpd_env->sc_engineid_len);
+       memcpy(pwbuf + dlen + snmpd_env->sc_engineid_len, keybuf, dlen);
 
        EVP_DigestInit(&ctx, md);
-       EVP_DigestUpdate(&ctx, pwbuf, 2 * dlen + env->sc_engineid_len);
+       EVP_DigestUpdate(&ctx, pwbuf, 2 * dlen + snmpd_env->sc_engineid_len);
        EVP_DigestFinal(&ctx, keybuf, &dlen);
        EVP_MD_CTX_cleanup(&ctx);
 

Reply via email to