As we parse the interface list, ignore sockaddr_dl's that

don't have an interface index that's the same as the if_msghdr
interface index.

This prevents the occasional perror("SIOCGIFFLAGS") from appearing
at boot time.

While I'm there:
  Make a couple of error messages more useful.
  Add a missing include.
  Add some braces to silence gccs dumb complaints.
  Add some consts
  Ansify decls
  Add copyright to pmap_check.h (well, you could say it's been rewritten)
This commit is contained in:
Brian Somers 2000-01-12 21:53:46 +00:00
parent 2b00168c1f
commit ae2a77e2bf
6 changed files with 108 additions and 103 deletions

View File

@ -54,7 +54,10 @@ static const char rcsid[] =
#include <sys/time.h> #include <sys/time.h>
#include <netdb.h> #include <netdb.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <syslog.h> #include <syslog.h>
#include <unistd.h> #include <unistd.h>
@ -62,6 +65,8 @@ static const char rcsid[] =
#include <net/if_dl.h> #include <net/if_dl.h>
#include <netinet/in.h> #include <netinet/in.h>
#include "pmap_check.h"
#ifndef TRUE #ifndef TRUE
#define TRUE 1 #define TRUE 1
#define FALSE 0 #define FALSE 0
@ -75,8 +80,8 @@ static struct in_addr *addrs;
/* find_local - find all IP addresses for this host */ /* find_local - find all IP addresses for this host */
int static int
find_local() find_local(void)
{ {
int mib[6], n, s, alloced; int mib[6], n, s, alloced;
size_t needed; size_t needed;
@ -122,19 +127,25 @@ find_local()
for (ptr = buf; ptr < end; ptr += ifm->ifm_msglen) { for (ptr = buf; ptr < end; ptr += ifm->ifm_msglen) {
ifm = (struct if_msghdr *)ptr; ifm = (struct if_msghdr *)ptr;
dl = (struct sockaddr_dl *)(ifm + 1); dl = (struct sockaddr_dl *)(ifm + 1);
if (ifm->ifm_index != dl->sdl_index || dl->sdl_nlen == 0)
/* We only want to see each interface once */
continue;
n = dl->sdl_nlen > sizeof ifr.ifr_name ? n = dl->sdl_nlen > sizeof ifr.ifr_name ?
sizeof ifr.ifr_name : dl->sdl_nlen; sizeof ifr.ifr_name : dl->sdl_nlen;
if (n == 0)
continue;
strncpy(ifr.ifr_name, dl->sdl_data, n); strncpy(ifr.ifr_name, dl->sdl_data, n);
if (n < sizeof ifr.ifr_name) if (n < sizeof ifr.ifr_name)
ifr.ifr_name[n] = '\0'; ifr.ifr_name[n] = '\0';
/* we only want the first address from each interface */ /* we only want the first address from each interface */
if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0)
perror("SIOCGIFFLAGS"); fprintf(stderr, "%.*s: SIOCGIFFLAGS: %s\n", n, ifr.ifr_name,
else if (ifr.ifr_flags & IFF_UP) /* active interface */ strerror(errno));
else if (ifr.ifr_flags & IFF_UP) { /* active interface */
if (ioctl(s, SIOCGIFADDR, &ifr) < 0) if (ioctl(s, SIOCGIFADDR, &ifr) < 0)
perror("SIOCGIFADDR"); fprintf(stderr, "%.*s: SIOCGIFADDR: %s\n", n, ifr.ifr_name,
strerror(errno));
else { else {
if (alloced < num_local + 1) { if (alloced < num_local + 1) {
alloced += ESTIMATED_LOCAL; alloced += ESTIMATED_LOCAL;
@ -150,6 +161,7 @@ find_local()
} }
addrs[num_local++] = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; addrs[num_local++] = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
} }
}
} }
free(buf); free(buf);
close(s); close(s);
@ -160,8 +172,7 @@ find_local()
/* from_local - determine whether request comes from the local system */ /* from_local - determine whether request comes from the local system */
int int
from_local(addr) from_local(struct sockaddr_in *addr)
struct sockaddr_in *addr;
{ {
int i; int i;
@ -178,7 +189,8 @@ struct sockaddr_in *addr;
#ifdef TEST #ifdef TEST
main() int
main(int argc, char **argv)
{ {
char *inet_ntoa(); char *inet_ntoa();
int i; int i;
@ -186,6 +198,8 @@ main()
find_local(); find_local();
for (i = 0; i < num_local; i++) for (i = 0; i < num_local; i++)
printf("%s\n", inet_ntoa(addrs[i])); printf("%s\n", inet_ntoa(addrs[i]));
return 0;
} }
#endif #endif

View File

@ -63,8 +63,9 @@ static const char rcsid[] =
#define YPPROC_DOMAIN_NONACK ((u_long) 2) #define YPPROC_DOMAIN_NONACK ((u_long) 2)
#define MOUNTPROC_MNT ((u_long) 1) #define MOUNTPROC_MNT ((u_long) 1)
static void logit(); static void logit(int, struct sockaddr_in *, u_long, u_long, const char *);
static void toggle_verboselog(); static void toggle_verboselog(int);
int verboselog = 0; int verboselog = 0;
int allow_severity = LOG_INFO; int allow_severity = LOG_INFO;
int deny_severity = LOG_WARNING; int deny_severity = LOG_WARNING;
@ -93,7 +94,8 @@ int deny_severity = LOG_WARNING;
/* check_startup - additional startup code */ /* check_startup - additional startup code */
void check_startup() void
check_startup()
{ {
/* /*
@ -110,10 +112,7 @@ void check_startup()
/* check_default - additional checks for NULL, DUMP, GETPORT and unknown */ /* check_default - additional checks for NULL, DUMP, GETPORT and unknown */
int int
check_default(addr, proc, prog) check_default(struct sockaddr_in *addr, u_long proc, u_long prog)
struct sockaddr_in *addr;
u_long proc;
u_long prog;
{ {
#ifdef HOSTS_ACCESS #ifdef HOSTS_ACCESS
if (!(from_local(addr) || good_client(addr))) { if (!(from_local(addr) || good_client(addr))) {
@ -129,11 +128,8 @@ u_long prog;
/* check_privileged_port - additional checks for privileged-port updates */ /* check_privileged_port - additional checks for privileged-port updates */
int int
check_privileged_port(addr, proc, prog, port) check_privileged_port(struct sockaddr_in *addr, u_long proc, u_long prog,
struct sockaddr_in *addr; u_long port)
u_long proc;
u_long prog;
u_long port;
{ {
#ifdef CHECK_PORT #ifdef CHECK_PORT
if (!legal_port(addr, port)) { if (!legal_port(addr, port)) {
@ -147,11 +143,7 @@ u_long port;
/* check_setunset - additional checks for update requests */ /* check_setunset - additional checks for update requests */
int int
check_setunset(addr, proc, prog, port) check_setunset(struct sockaddr_in *addr, u_long proc, u_long prog, u_long port)
struct sockaddr_in *addr;
u_long proc;
u_long prog;
u_long port;
{ {
if (!from_local(addr)) { if (!from_local(addr)) {
#ifdef HOSTS_ACCESS #ifdef HOSTS_ACCESS
@ -170,11 +162,7 @@ u_long port;
/* check_callit - additional checks for forwarded requests */ /* check_callit - additional checks for forwarded requests */
int int
check_callit(addr, proc, prog, aproc) check_callit(struct sockaddr_in *addr, u_long proc, u_long prog, u_long aproc)
struct sockaddr_in *addr;
u_long proc;
u_long prog;
u_long aproc;
{ {
#ifdef HOSTS_ACCESS #ifdef HOSTS_ACCESS
if (!(from_local(addr) || good_client(addr))) { if (!(from_local(addr) || good_client(addr))) {
@ -195,8 +183,8 @@ u_long aproc;
/* toggle_verboselog - toggle verbose logging flag */ /* toggle_verboselog - toggle verbose logging flag */
static void toggle_verboselog(sig) static void
int sig; toggle_verboselog(int sig)
{ {
(void) signal(sig, toggle_verboselog); (void) signal(sig, toggle_verboselog);
verboselog = !verboselog; verboselog = !verboselog;
@ -204,21 +192,18 @@ int sig;
/* logit - report events of interest via the syslog daemon */ /* logit - report events of interest via the syslog daemon */
static void logit(severity, addr, procnum, prognum, text) static void
int severity; logit(int severity, struct sockaddr_in *addr, u_long procnum, u_long prognum,
struct sockaddr_in *addr; const char *text)
u_long procnum;
u_long prognum;
char *text;
{ {
char *procname; const char *procname;
char procbuf[4 * sizeof(u_long)]; char procbuf[4 * sizeof(u_long)];
char *progname; const char *progname;
char progbuf[4 * sizeof(u_long)]; char progbuf[4 * sizeof(u_long)];
struct rpcent *rpc; struct rpcent *rpc;
struct proc_map { struct proc_map {
u_long code; u_long code;
char *proc; const char *proc;
}; };
struct proc_map *procp; struct proc_map *procp;
static struct proc_map procmap[] = { static struct proc_map procmap[] = {
@ -245,15 +230,18 @@ char *text;
} else if ((rpc = getrpcbynumber((int) prognum))) { } else if ((rpc = getrpcbynumber((int) prognum))) {
progname = rpc->r_name; progname = rpc->r_name;
} else { } else {
sprintf(progname = progbuf, "%lu", prognum); sprintf(progbuf, "%lu", prognum);
progname = progbuf;
} }
/* Try to map procedure number to name. */ /* Try to map procedure number to name. */
for (procp = procmap; procp->proc && procp->code != procnum; procp++) for (procp = procmap; procp->proc && procp->code != procnum; procp++)
/* void */ ; /* void */ ;
if ((procname = procp->proc) == 0) if ((procname = procp->proc) == 0) {
sprintf(procname = procbuf, "%lu", (u_long) procnum); sprintf(procbuf, "%lu", (u_long) procnum);
procname = procbuf;
}
/* Write syslog record. */ /* Write syslog record. */

View File

@ -1,11 +1,40 @@
/* @(#) pmap_check.h 1.3 93/11/21 16:18:53 */ /*-
* Copyright (c) 2000 Brian Somers <brian@Awfulhak.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#) pmap_check.h 1.3 93/11/21 16:18:53
*
* $FreeBSD$
*/
extern int from_local(struct sockaddr_in *);
extern void check_startup(void);
extern int check_default(struct sockaddr_in *, u_long, u_long);
extern int check_setunset(struct sockaddr_in *, u_long, u_long, u_long);
extern int check_privileged_port(struct sockaddr_in *, u_long, u_long, u_long);
extern int check_callit(struct sockaddr_in *, u_long, u_long, u_long);
extern int from_local();
extern void check_startup();
extern int check_default();
extern int check_setunset();
extern int check_privileged_port();
extern int check_callit();
extern int verboselog; extern int verboselog;
extern int allow_severity; extern int allow_severity;
extern int deny_severity; extern int deny_severity;

View File

@ -25,12 +25,10 @@ static const char rcsid[] =
#include <rpc/pmap_clnt.h> #include <rpc/pmap_clnt.h>
#include <rpc/pmap_prot.h> #include <rpc/pmap_prot.h>
static char *protoname(); static const char *protoname(u_long);
int int
main(argc, argv) main(int argc, char **argv)
int argc;
char **argv;
{ {
struct sockaddr_in addr; struct sockaddr_in addr;
register struct pmaplist *list; register struct pmaplist *list;
@ -51,8 +49,8 @@ char **argv;
return (fclose(stdout) ? (perror(argv[0]), 1) : 0); return (fclose(stdout) ? (perror(argv[0]), 1) : 0);
} }
static char *protoname(proto) static const char *
u_long proto; protoname(u_long proto)
{ {
static char buf[BUFSIZ]; static char buf[BUFSIZ];

View File

@ -22,12 +22,10 @@ static const char rcsid[] =
#include <rpc/rpc.h> #include <rpc/rpc.h>
#include <rpc/pmap_clnt.h> #include <rpc/pmap_clnt.h>
int parse_line __P((char *, u_long *, u_long *, int *, unsigned *)); static int parse_line (char *, u_long *, u_long *, int *, unsigned *);
int int
main(argc, argv) main(int argc, char **argv)
int argc;
char **argv;
{ {
struct sockaddr_in addr; struct sockaddr_in addr;
char buf[BUFSIZ]; char buf[BUFSIZ];
@ -51,13 +49,8 @@ char **argv;
/* parse_line - convert line to numbers */ /* parse_line - convert line to numbers */
int static int
parse_line(buf, prog, vers, prot, port) parse_line(char *buf, u_long *prog, u_long *vers, int *prot, unsigned *port)
char *buf;
u_long *prog;
u_long *vers;
int *prot;
unsigned *port;
{ {
char proto_name[BUFSIZ]; char proto_name[BUFSIZ];

View File

@ -102,18 +102,16 @@ static char sccsid[] = "@(#)portmap.c 1.32 87/08/06 Copyr 1984 Sun Micro";
#include "pmap_check.h" #include "pmap_check.h"
void reg_service(); static void reg_service(struct svc_req *, SVCXPRT *);
void reap(); static void reap(int);
static void callit(); static void callit(struct svc_req *, SVCXPRT *);
static void usage __P((void)); static void usage(void);
struct pmaplist *pmaplist; struct pmaplist *pmaplist;
int debugging = 0; int debugging = 0;
int int
main(argc, argv) main(int argc, char **argv)
int argc;
char **argv;
{ {
SVCXPRT *xprt; SVCXPRT *xprt;
int sock, c; int sock, c;
@ -220,8 +218,7 @@ perror(what)
#endif #endif
static struct pmaplist * static struct pmaplist *
find_service(prog, vers, prot) find_service(u_long prog, u_long vers, u_long prot)
u_long prog, vers, prot;
{ {
register struct pmaplist *hit = NULL; register struct pmaplist *hit = NULL;
register struct pmaplist *pml; register struct pmaplist *pml;
@ -240,10 +237,8 @@ find_service(prog, vers, prot)
/* /*
* 1 OK, 0 not * 1 OK, 0 not
*/ */
void static void
reg_service(rqstp, xprt) reg_service(struct svc_req *rqstp, SVCXPRT *xprt)
struct svc_req *rqstp;
SVCXPRT *xprt;
{ {
struct pmap reg; struct pmap reg;
struct pmaplist *pml, *prevpml, *fnd; struct pmaplist *pml, *prevpml, *fnd;
@ -453,9 +448,7 @@ struct encap_parms {
}; };
static bool_t static bool_t
xdr_encap_parms(xdrs, epp) xdr_encap_parms(XDR *xdrs, struct encap_parms *epp)
XDR *xdrs;
struct encap_parms *epp;
{ {
return (xdr_bytes(xdrs, &(epp->args), &(epp->arglen), ARGSIZE)); return (xdr_bytes(xdrs, &(epp->args), &(epp->arglen), ARGSIZE));
@ -470,9 +463,7 @@ struct rmtcallargs {
}; };
static bool_t static bool_t
xdr_rmtcall_args(xdrs, cap) xdr_rmtcall_args(XDR *xdrs, struct rmtcallargs *cap)
register XDR *xdrs;
register struct rmtcallargs *cap;
{ {
/* does not get a port number */ /* does not get a port number */
@ -485,9 +476,7 @@ xdr_rmtcall_args(xdrs, cap)
} }
static bool_t static bool_t
xdr_rmtcall_result(xdrs, cap) xdr_rmtcall_result(XDR *xdrs, struct rmtcallargs *cap)
register XDR *xdrs;
register struct rmtcallargs *cap;
{ {
if (xdr_u_long(xdrs, &(cap->rmt_port))) if (xdr_u_long(xdrs, &(cap->rmt_port)))
return (xdr_encap_parms(xdrs, &(cap->rmt_args))); return (xdr_encap_parms(xdrs, &(cap->rmt_args)));
@ -499,9 +488,7 @@ xdr_rmtcall_result(xdrs, cap)
* The arglen must already be set!! * The arglen must already be set!!
*/ */
static bool_t static bool_t
xdr_opaque_parms(xdrs, cap) xdr_opaque_parms(XDR *xdrs, struct rmtcallargs *cap)
XDR *xdrs;
struct rmtcallargs *cap;
{ {
return (xdr_opaque(xdrs, cap->rmt_args.args, cap->rmt_args.arglen)); return (xdr_opaque(xdrs, cap->rmt_args.args, cap->rmt_args.arglen));
@ -512,9 +499,7 @@ xdr_opaque_parms(xdrs, cap)
* and then calls xdr_opaque_parms. * and then calls xdr_opaque_parms.
*/ */
static bool_t static bool_t
xdr_len_opaque_parms(xdrs, cap) xdr_len_opaque_parms(XDR *xdrs, struct rmtcallargs *cap)
register XDR *xdrs;
struct rmtcallargs *cap;
{ {
register u_int beginpos, lowpos, highpos, currpos, pos; register u_int beginpos, lowpos, highpos, currpos, pos;
@ -545,9 +530,7 @@ xdr_len_opaque_parms(xdrs, cap)
* back to the portmapper. * back to the portmapper.
*/ */
static void static void
callit(rqstp, xprt) callit(struct svc_req *rqstp, SVCXPRT *xprt)
struct svc_req *rqstp;
SVCXPRT *xprt;
{ {
struct rmtcallargs a; struct rmtcallargs a;
struct pmaplist *pml; struct pmaplist *pml;
@ -602,8 +585,8 @@ callit(rqstp, xprt)
exit(0); exit(0);
} }
void static void
reap() reap(int sig)
{ {
int save_errno; int save_errno;