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