xref: /freebsd/contrib/tcp_wrappers/misc.c (revision ae2f0b2611f112b400177db951f9bd992de72b4d)
1   /*
2    * Misc routines that are used by tcpd and by tcpdchk.
3    *
4    * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
5    *
6    * $FreeBSD$
7    */
8  
9  #ifndef lint
10  static char sccsic[] = "@(#) misc.c 1.2 96/02/11 17:01:29";
11  #endif
12  
13  #include <sys/types.h>
14  #include <sys/param.h>
15  #include <netinet/in.h>
16  #include <arpa/inet.h>
17  #include <stdio.h>
18  #include <string.h>
19  
20  #include "tcpd.h"
21  
22  #ifndef	INADDR_NONE
23  #define	INADDR_NONE	(-1)		/* XXX should be 0xffffffff */
24  #endif
25  
26  /* xgets - fgets() with backslash-newline stripping */
27  
28  char   *xgets(char *ptr, int len, FILE *fp)
29  {
30      int     got;
31      char   *start = ptr;
32  
33      while (fgets(ptr, len, fp)) {
34  	got = strlen(ptr);
35  	if (got >= 1 && ptr[got - 1] == '\n') {
36  	    tcpd_context.line++;
37  	    if (got >= 2 && ptr[got - 2] == '\\') {
38  		got -= 2;
39  	    } else {
40  		return (start);
41  	    }
42  	}
43  	ptr += got;
44  	len -= got;
45  	ptr[0] = 0;
46      }
47      return (ptr > start ? start : 0);
48  }
49  
50  /* split_at - break string at delimiter or return NULL */
51  
52  char   *split_at(char *string, int delimiter)
53  {
54      char   *cp;
55  
56  #ifdef INET6
57      int bracket = 0;
58  
59      for (cp = string; cp && *cp; cp++) {
60  	switch (*cp) {
61  	case '[':
62  	    bracket++;
63  	    break;
64  	case ']':
65  	    bracket--;
66  	    break;
67  	default:
68  	    if (bracket == 0 && *cp == delimiter) {
69  		*cp++ = 0;
70  		return cp;
71  	    }
72  	    break;
73  	}
74      }
75      return (NULL);
76  #else
77      if ((cp = strchr(string, delimiter)) != 0)
78  	*cp++ = 0;
79      return (cp);
80  #endif
81  }
82  
83  /* dot_quad_addr - convert dotted quad to internal form */
84  
85  unsigned long dot_quad_addr(char *str)
86  {
87      int     in_run = 0;
88      int     runs = 0;
89      char   *cp = str;
90  
91      /* Count the number of runs of non-dot characters. */
92  
93      while (*cp) {
94  	if (*cp == '.') {
95  	    in_run = 0;
96  	} else if (in_run == 0) {
97  	    in_run = 1;
98  	    runs++;
99  	}
100  	cp++;
101      }
102      return (runs == 4 ? inet_addr(str) : INADDR_NONE);
103  }
104