xref: /freebsd-src/contrib/tcp_wrappers/misc.c (revision 14f102eacc8434a5a1f96466752578a4167140c9)
12aef6930SMark Murray  /*
22aef6930SMark Murray   * Misc routines that are used by tcpd and by tcpdchk.
32aef6930SMark Murray   *
42aef6930SMark Murray   * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
58053080cSYoshinobu Inoue   *
68053080cSYoshinobu Inoue   * $FreeBSD$
72aef6930SMark Murray   */
82aef6930SMark Murray 
92aef6930SMark Murray #ifndef lint
102aef6930SMark Murray static char sccsic[] = "@(#) misc.c 1.2 96/02/11 17:01:29";
112aef6930SMark Murray #endif
122aef6930SMark Murray 
132aef6930SMark Murray #include <sys/types.h>
142aef6930SMark Murray #include <sys/param.h>
152aef6930SMark Murray #include <netinet/in.h>
162aef6930SMark Murray #include <arpa/inet.h>
172aef6930SMark Murray #include <stdio.h>
182aef6930SMark Murray #include <string.h>
192aef6930SMark Murray 
202aef6930SMark Murray #include "tcpd.h"
212aef6930SMark Murray 
222aef6930SMark Murray #ifndef	INADDR_NONE
232aef6930SMark Murray #define	INADDR_NONE	(-1)		/* XXX should be 0xffffffff */
242aef6930SMark Murray #endif
252aef6930SMark Murray 
262aef6930SMark Murray /* xgets - fgets() with backslash-newline stripping */
272aef6930SMark Murray 
xgets(char * ptr,int len,FILE * fp)28*14f102eaSEd Maste char   *xgets(char *ptr, int len, FILE *fp)
292aef6930SMark Murray {
302aef6930SMark Murray     int     got;
312aef6930SMark Murray     char   *start = ptr;
322aef6930SMark Murray 
332aef6930SMark Murray     while (fgets(ptr, len, fp)) {
342aef6930SMark Murray 	got = strlen(ptr);
352aef6930SMark Murray 	if (got >= 1 && ptr[got - 1] == '\n') {
362aef6930SMark Murray 	    tcpd_context.line++;
372aef6930SMark Murray 	    if (got >= 2 && ptr[got - 2] == '\\') {
382aef6930SMark Murray 		got -= 2;
392aef6930SMark Murray 	    } else {
402aef6930SMark Murray 		return (start);
412aef6930SMark Murray 	    }
422aef6930SMark Murray 	}
432aef6930SMark Murray 	ptr += got;
442aef6930SMark Murray 	len -= got;
452aef6930SMark Murray 	ptr[0] = 0;
462aef6930SMark Murray     }
472aef6930SMark Murray     return (ptr > start ? start : 0);
482aef6930SMark Murray }
492aef6930SMark Murray 
502aef6930SMark Murray /* split_at - break string at delimiter or return NULL */
512aef6930SMark Murray 
split_at(char * string,int delimiter)52*14f102eaSEd Maste char   *split_at(char *string, int delimiter)
532aef6930SMark Murray {
542aef6930SMark Murray     char   *cp;
552aef6930SMark Murray 
568053080cSYoshinobu Inoue #ifdef INET6
578053080cSYoshinobu Inoue     int bracket = 0;
588053080cSYoshinobu Inoue 
598053080cSYoshinobu Inoue     for (cp = string; cp && *cp; cp++) {
608053080cSYoshinobu Inoue 	switch (*cp) {
618053080cSYoshinobu Inoue 	case '[':
628053080cSYoshinobu Inoue 	    bracket++;
638053080cSYoshinobu Inoue 	    break;
648053080cSYoshinobu Inoue 	case ']':
658053080cSYoshinobu Inoue 	    bracket--;
668053080cSYoshinobu Inoue 	    break;
678053080cSYoshinobu Inoue 	default:
688053080cSYoshinobu Inoue 	    if (bracket == 0 && *cp == delimiter) {
698053080cSYoshinobu Inoue 		*cp++ = 0;
708053080cSYoshinobu Inoue 		return cp;
718053080cSYoshinobu Inoue 	    }
728053080cSYoshinobu Inoue 	    break;
738053080cSYoshinobu Inoue 	}
748053080cSYoshinobu Inoue     }
758053080cSYoshinobu Inoue     return (NULL);
768053080cSYoshinobu Inoue #else
772aef6930SMark Murray     if ((cp = strchr(string, delimiter)) != 0)
782aef6930SMark Murray 	*cp++ = 0;
792aef6930SMark Murray     return (cp);
808053080cSYoshinobu Inoue #endif
812aef6930SMark Murray }
822aef6930SMark Murray 
832aef6930SMark Murray /* dot_quad_addr - convert dotted quad to internal form */
842aef6930SMark Murray 
dot_quad_addr(char * str)85*14f102eaSEd Maste unsigned long dot_quad_addr(char *str)
862aef6930SMark Murray {
872aef6930SMark Murray     int     in_run = 0;
882aef6930SMark Murray     int     runs = 0;
892aef6930SMark Murray     char   *cp = str;
902aef6930SMark Murray 
912aef6930SMark Murray     /* Count the number of runs of non-dot characters. */
922aef6930SMark Murray 
932aef6930SMark Murray     while (*cp) {
942aef6930SMark Murray 	if (*cp == '.') {
952aef6930SMark Murray 	    in_run = 0;
962aef6930SMark Murray 	} else if (in_run == 0) {
972aef6930SMark Murray 	    in_run = 1;
982aef6930SMark Murray 	    runs++;
992aef6930SMark Murray 	}
1002aef6930SMark Murray 	cp++;
1012aef6930SMark Murray     }
1022aef6930SMark Murray     return (runs == 4 ? inet_addr(str) : INADDR_NONE);
1032aef6930SMark Murray }
104