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:
parent
2b00168c1f
commit
ae2a77e2bf
@ -54,7 +54,10 @@ static const char rcsid[] =
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <netdb.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <syslog.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@ -62,6 +65,8 @@ static const char rcsid[] =
|
||||
#include <net/if_dl.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "pmap_check.h"
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
@ -75,8 +80,8 @@ static struct in_addr *addrs;
|
||||
|
||||
/* find_local - find all IP addresses for this host */
|
||||
|
||||
int
|
||||
find_local()
|
||||
static int
|
||||
find_local(void)
|
||||
{
|
||||
int mib[6], n, s, alloced;
|
||||
size_t needed;
|
||||
@ -122,19 +127,25 @@ find_local()
|
||||
for (ptr = buf; ptr < end; ptr += ifm->ifm_msglen) {
|
||||
ifm = (struct if_msghdr *)ptr;
|
||||
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 ?
|
||||
sizeof ifr.ifr_name : dl->sdl_nlen;
|
||||
if (n == 0)
|
||||
continue;
|
||||
strncpy(ifr.ifr_name, dl->sdl_data, n);
|
||||
if (n < sizeof ifr.ifr_name)
|
||||
ifr.ifr_name[n] = '\0';
|
||||
|
||||
/* we only want the first address from each interface */
|
||||
if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0)
|
||||
perror("SIOCGIFFLAGS");
|
||||
else if (ifr.ifr_flags & IFF_UP) /* active interface */
|
||||
fprintf(stderr, "%.*s: SIOCGIFFLAGS: %s\n", n, ifr.ifr_name,
|
||||
strerror(errno));
|
||||
else if (ifr.ifr_flags & IFF_UP) { /* active interface */
|
||||
if (ioctl(s, SIOCGIFADDR, &ifr) < 0)
|
||||
perror("SIOCGIFADDR");
|
||||
fprintf(stderr, "%.*s: SIOCGIFADDR: %s\n", n, ifr.ifr_name,
|
||||
strerror(errno));
|
||||
else {
|
||||
if (alloced < num_local + 1) {
|
||||
alloced += ESTIMATED_LOCAL;
|
||||
@ -150,6 +161,7 @@ find_local()
|
||||
}
|
||||
addrs[num_local++] = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
|
||||
}
|
||||
}
|
||||
}
|
||||
free(buf);
|
||||
close(s);
|
||||
@ -160,8 +172,7 @@ find_local()
|
||||
/* from_local - determine whether request comes from the local system */
|
||||
|
||||
int
|
||||
from_local(addr)
|
||||
struct sockaddr_in *addr;
|
||||
from_local(struct sockaddr_in *addr)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -178,7 +189,8 @@ struct sockaddr_in *addr;
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
main()
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
char *inet_ntoa();
|
||||
int i;
|
||||
@ -186,6 +198,8 @@ main()
|
||||
find_local();
|
||||
for (i = 0; i < num_local; i++)
|
||||
printf("%s\n", inet_ntoa(addrs[i]));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -63,8 +63,9 @@ static const char rcsid[] =
|
||||
#define YPPROC_DOMAIN_NONACK ((u_long) 2)
|
||||
#define MOUNTPROC_MNT ((u_long) 1)
|
||||
|
||||
static void logit();
|
||||
static void toggle_verboselog();
|
||||
static void logit(int, struct sockaddr_in *, u_long, u_long, const char *);
|
||||
static void toggle_verboselog(int);
|
||||
|
||||
int verboselog = 0;
|
||||
int allow_severity = LOG_INFO;
|
||||
int deny_severity = LOG_WARNING;
|
||||
@ -93,7 +94,8 @@ int deny_severity = LOG_WARNING;
|
||||
|
||||
/* 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 */
|
||||
|
||||
int
|
||||
check_default(addr, proc, prog)
|
||||
struct sockaddr_in *addr;
|
||||
u_long proc;
|
||||
u_long prog;
|
||||
check_default(struct sockaddr_in *addr, u_long proc, u_long prog)
|
||||
{
|
||||
#ifdef HOSTS_ACCESS
|
||||
if (!(from_local(addr) || good_client(addr))) {
|
||||
@ -129,11 +128,8 @@ u_long prog;
|
||||
/* check_privileged_port - additional checks for privileged-port updates */
|
||||
|
||||
int
|
||||
check_privileged_port(addr, proc, prog, port)
|
||||
struct sockaddr_in *addr;
|
||||
u_long proc;
|
||||
u_long prog;
|
||||
u_long port;
|
||||
check_privileged_port(struct sockaddr_in *addr, u_long proc, u_long prog,
|
||||
u_long port)
|
||||
{
|
||||
#ifdef CHECK_PORT
|
||||
if (!legal_port(addr, port)) {
|
||||
@ -147,11 +143,7 @@ u_long port;
|
||||
/* check_setunset - additional checks for update requests */
|
||||
|
||||
int
|
||||
check_setunset(addr, proc, prog, port)
|
||||
struct sockaddr_in *addr;
|
||||
u_long proc;
|
||||
u_long prog;
|
||||
u_long port;
|
||||
check_setunset(struct sockaddr_in *addr, u_long proc, u_long prog, u_long port)
|
||||
{
|
||||
if (!from_local(addr)) {
|
||||
#ifdef HOSTS_ACCESS
|
||||
@ -170,11 +162,7 @@ u_long port;
|
||||
/* check_callit - additional checks for forwarded requests */
|
||||
|
||||
int
|
||||
check_callit(addr, proc, prog, aproc)
|
||||
struct sockaddr_in *addr;
|
||||
u_long proc;
|
||||
u_long prog;
|
||||
u_long aproc;
|
||||
check_callit(struct sockaddr_in *addr, u_long proc, u_long prog, u_long aproc)
|
||||
{
|
||||
#ifdef HOSTS_ACCESS
|
||||
if (!(from_local(addr) || good_client(addr))) {
|
||||
@ -195,8 +183,8 @@ u_long aproc;
|
||||
|
||||
/* toggle_verboselog - toggle verbose logging flag */
|
||||
|
||||
static void toggle_verboselog(sig)
|
||||
int sig;
|
||||
static void
|
||||
toggle_verboselog(int sig)
|
||||
{
|
||||
(void) signal(sig, toggle_verboselog);
|
||||
verboselog = !verboselog;
|
||||
@ -204,21 +192,18 @@ int sig;
|
||||
|
||||
/* logit - report events of interest via the syslog daemon */
|
||||
|
||||
static void logit(severity, addr, procnum, prognum, text)
|
||||
int severity;
|
||||
struct sockaddr_in *addr;
|
||||
u_long procnum;
|
||||
u_long prognum;
|
||||
char *text;
|
||||
static void
|
||||
logit(int severity, struct sockaddr_in *addr, u_long procnum, u_long prognum,
|
||||
const char *text)
|
||||
{
|
||||
char *procname;
|
||||
const char *procname;
|
||||
char procbuf[4 * sizeof(u_long)];
|
||||
char *progname;
|
||||
const char *progname;
|
||||
char progbuf[4 * sizeof(u_long)];
|
||||
struct rpcent *rpc;
|
||||
struct proc_map {
|
||||
u_long code;
|
||||
char *proc;
|
||||
const char *proc;
|
||||
};
|
||||
struct proc_map *procp;
|
||||
static struct proc_map procmap[] = {
|
||||
@ -245,15 +230,18 @@ char *text;
|
||||
} else if ((rpc = getrpcbynumber((int) prognum))) {
|
||||
progname = rpc->r_name;
|
||||
} else {
|
||||
sprintf(progname = progbuf, "%lu", prognum);
|
||||
sprintf(progbuf, "%lu", prognum);
|
||||
progname = progbuf;
|
||||
}
|
||||
|
||||
/* Try to map procedure number to name. */
|
||||
|
||||
for (procp = procmap; procp->proc && procp->code != procnum; procp++)
|
||||
/* void */ ;
|
||||
if ((procname = procp->proc) == 0)
|
||||
sprintf(procname = procbuf, "%lu", (u_long) procnum);
|
||||
if ((procname = procp->proc) == 0) {
|
||||
sprintf(procbuf, "%lu", (u_long) procnum);
|
||||
procname = procbuf;
|
||||
}
|
||||
|
||||
/* Write syslog record. */
|
||||
|
||||
|
@ -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 allow_severity;
|
||||
extern int deny_severity;
|
||||
|
@ -25,12 +25,10 @@ static const char rcsid[] =
|
||||
#include <rpc/pmap_clnt.h>
|
||||
#include <rpc/pmap_prot.h>
|
||||
|
||||
static char *protoname();
|
||||
static const char *protoname(u_long);
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_in addr;
|
||||
register struct pmaplist *list;
|
||||
@ -51,8 +49,8 @@ char **argv;
|
||||
return (fclose(stdout) ? (perror(argv[0]), 1) : 0);
|
||||
}
|
||||
|
||||
static char *protoname(proto)
|
||||
u_long proto;
|
||||
static const char *
|
||||
protoname(u_long proto)
|
||||
{
|
||||
static char buf[BUFSIZ];
|
||||
|
||||
|
@ -22,12 +22,10 @@ static const char rcsid[] =
|
||||
#include <rpc/rpc.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
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_in addr;
|
||||
char buf[BUFSIZ];
|
||||
@ -51,13 +49,8 @@ char **argv;
|
||||
|
||||
/* parse_line - convert line to numbers */
|
||||
|
||||
int
|
||||
parse_line(buf, prog, vers, prot, port)
|
||||
char *buf;
|
||||
u_long *prog;
|
||||
u_long *vers;
|
||||
int *prot;
|
||||
unsigned *port;
|
||||
static int
|
||||
parse_line(char *buf, u_long *prog, u_long *vers, int *prot, unsigned *port)
|
||||
{
|
||||
char proto_name[BUFSIZ];
|
||||
|
||||
|
@ -102,18 +102,16 @@ static char sccsid[] = "@(#)portmap.c 1.32 87/08/06 Copyr 1984 Sun Micro";
|
||||
|
||||
#include "pmap_check.h"
|
||||
|
||||
void reg_service();
|
||||
void reap();
|
||||
static void callit();
|
||||
static void usage __P((void));
|
||||
static void reg_service(struct svc_req *, SVCXPRT *);
|
||||
static void reap(int);
|
||||
static void callit(struct svc_req *, SVCXPRT *);
|
||||
static void usage(void);
|
||||
|
||||
struct pmaplist *pmaplist;
|
||||
int debugging = 0;
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
SVCXPRT *xprt;
|
||||
int sock, c;
|
||||
@ -220,8 +218,7 @@ perror(what)
|
||||
#endif
|
||||
|
||||
static struct pmaplist *
|
||||
find_service(prog, vers, prot)
|
||||
u_long prog, vers, prot;
|
||||
find_service(u_long prog, u_long vers, u_long prot)
|
||||
{
|
||||
register struct pmaplist *hit = NULL;
|
||||
register struct pmaplist *pml;
|
||||
@ -240,10 +237,8 @@ find_service(prog, vers, prot)
|
||||
/*
|
||||
* 1 OK, 0 not
|
||||
*/
|
||||
void
|
||||
reg_service(rqstp, xprt)
|
||||
struct svc_req *rqstp;
|
||||
SVCXPRT *xprt;
|
||||
static void
|
||||
reg_service(struct svc_req *rqstp, SVCXPRT *xprt)
|
||||
{
|
||||
struct pmap reg;
|
||||
struct pmaplist *pml, *prevpml, *fnd;
|
||||
@ -453,9 +448,7 @@ struct encap_parms {
|
||||
};
|
||||
|
||||
static bool_t
|
||||
xdr_encap_parms(xdrs, epp)
|
||||
XDR *xdrs;
|
||||
struct encap_parms *epp;
|
||||
xdr_encap_parms(XDR *xdrs, struct encap_parms *epp)
|
||||
{
|
||||
|
||||
return (xdr_bytes(xdrs, &(epp->args), &(epp->arglen), ARGSIZE));
|
||||
@ -470,9 +463,7 @@ struct rmtcallargs {
|
||||
};
|
||||
|
||||
static bool_t
|
||||
xdr_rmtcall_args(xdrs, cap)
|
||||
register XDR *xdrs;
|
||||
register struct rmtcallargs *cap;
|
||||
xdr_rmtcall_args(XDR *xdrs, struct rmtcallargs *cap)
|
||||
{
|
||||
|
||||
/* does not get a port number */
|
||||
@ -485,9 +476,7 @@ xdr_rmtcall_args(xdrs, cap)
|
||||
}
|
||||
|
||||
static bool_t
|
||||
xdr_rmtcall_result(xdrs, cap)
|
||||
register XDR *xdrs;
|
||||
register struct rmtcallargs *cap;
|
||||
xdr_rmtcall_result(XDR *xdrs, struct rmtcallargs *cap)
|
||||
{
|
||||
if (xdr_u_long(xdrs, &(cap->rmt_port)))
|
||||
return (xdr_encap_parms(xdrs, &(cap->rmt_args)));
|
||||
@ -499,9 +488,7 @@ xdr_rmtcall_result(xdrs, cap)
|
||||
* The arglen must already be set!!
|
||||
*/
|
||||
static bool_t
|
||||
xdr_opaque_parms(xdrs, cap)
|
||||
XDR *xdrs;
|
||||
struct rmtcallargs *cap;
|
||||
xdr_opaque_parms(XDR *xdrs, struct rmtcallargs *cap)
|
||||
{
|
||||
|
||||
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.
|
||||
*/
|
||||
static bool_t
|
||||
xdr_len_opaque_parms(xdrs, cap)
|
||||
register XDR *xdrs;
|
||||
struct rmtcallargs *cap;
|
||||
xdr_len_opaque_parms(XDR *xdrs, struct rmtcallargs *cap)
|
||||
{
|
||||
register u_int beginpos, lowpos, highpos, currpos, pos;
|
||||
|
||||
@ -545,9 +530,7 @@ xdr_len_opaque_parms(xdrs, cap)
|
||||
* back to the portmapper.
|
||||
*/
|
||||
static void
|
||||
callit(rqstp, xprt)
|
||||
struct svc_req *rqstp;
|
||||
SVCXPRT *xprt;
|
||||
callit(struct svc_req *rqstp, SVCXPRT *xprt)
|
||||
{
|
||||
struct rmtcallargs a;
|
||||
struct pmaplist *pml;
|
||||
@ -602,8 +585,8 @@ callit(rqstp, xprt)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void
|
||||
reap()
|
||||
static void
|
||||
reap(int sig)
|
||||
{
|
||||
int save_errno;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user