Home | History | Annotate | Line # | Download | only in libwrap
misc.c revision 1.9.56.1
      1  1.9.56.1       riz /*	$NetBSD: misc.c,v 1.9.56.1 2012/04/23 16:48:53 riz Exp $	*/
      2       1.2  christos 
      3       1.1       mrg  /*
      4       1.1       mrg   * Misc routines that are used by tcpd and by tcpdchk.
      5       1.6    simonb   *
      6       1.1       mrg   * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
      7       1.1       mrg   */
      8       1.1       mrg 
      9       1.2  christos #include <sys/cdefs.h>
     10       1.1       mrg #ifndef lint
     11       1.2  christos #if 0
     12       1.1       mrg static char sccsic[] = "@(#) misc.c 1.2 96/02/11 17:01:29";
     13       1.2  christos #else
     14  1.9.56.1       riz __RCSID("$NetBSD: misc.c,v 1.9.56.1 2012/04/23 16:48:53 riz Exp $");
     15       1.2  christos #endif
     16       1.1       mrg #endif
     17       1.1       mrg 
     18       1.1       mrg #include <sys/types.h>
     19       1.1       mrg #include <sys/param.h>
     20       1.1       mrg #include <netinet/in.h>
     21       1.1       mrg #include <arpa/inet.h>
     22       1.1       mrg #include <stdio.h>
     23       1.1       mrg #include <string.h>
     24       1.1       mrg 
     25       1.1       mrg #include "tcpd.h"
     26       1.1       mrg 
     27       1.1       mrg /* xgets - fgets() with backslash-newline stripping */
     28       1.1       mrg 
     29  1.9.56.1       riz char *
     30  1.9.56.1       riz xgets(char *ptr, int len, FILE   *fp)
     31       1.1       mrg {
     32       1.1       mrg     int     got;
     33       1.1       mrg     char   *start = ptr;
     34       1.1       mrg 
     35       1.9  jdolecek     while (len > 1 && fgets(ptr, len, fp)) {
     36       1.1       mrg 	got = strlen(ptr);
     37       1.1       mrg 	if (got >= 1 && ptr[got - 1] == '\n') {
     38       1.1       mrg 	    tcpd_context.line++;
     39       1.1       mrg 	    if (got >= 2 && ptr[got - 2] == '\\') {
     40       1.1       mrg 		got -= 2;
     41       1.1       mrg 	    } else {
     42       1.1       mrg 		return (start);
     43       1.1       mrg 	    }
     44       1.1       mrg 	}
     45       1.1       mrg 	ptr += got;
     46       1.1       mrg 	len -= got;
     47       1.1       mrg 	ptr[0] = 0;
     48       1.1       mrg     }
     49       1.1       mrg     return (ptr > start ? start : 0);
     50       1.1       mrg }
     51       1.1       mrg 
     52       1.1       mrg /* split_at - break string at delimiter or return NULL */
     53       1.1       mrg 
     54  1.9.56.1       riz char *
     55  1.9.56.1       riz split_at(char *string, int delimiter)
     56       1.1       mrg {
     57       1.7    itojun     char *cp;
     58       1.7    itojun     int bracket;
     59       1.7    itojun 
     60       1.7    itojun     bracket = 0;
     61       1.7    itojun     for (cp = string; cp && *cp; cp++) {
     62       1.7    itojun 	switch (*cp) {
     63       1.7    itojun 	case '[':
     64       1.7    itojun 	    bracket++;
     65       1.7    itojun 	    break;
     66       1.7    itojun 	case ']':
     67       1.7    itojun 	    bracket--;
     68       1.7    itojun 	    break;
     69       1.7    itojun 	default:
     70       1.7    itojun 	    if (bracket == 0 && *cp == delimiter) {
     71       1.7    itojun 		*cp++ = 0;
     72       1.7    itojun 		return cp;
     73       1.7    itojun 	    }
     74       1.7    itojun 	    break;
     75       1.7    itojun 	}
     76       1.7    itojun     }
     77       1.7    itojun     return NULL;
     78       1.1       mrg }
     79       1.1       mrg 
     80       1.1       mrg /* dot_quad_addr - convert dotted quad to internal form */
     81       1.1       mrg 
     82  1.9.56.1       riz int
     83  1.9.56.1       riz dot_quad_addr(char *str, unsigned long *addr)
     84       1.1       mrg {
     85       1.3  christos     struct in_addr a;
     86       1.3  christos 
     87       1.3  christos     if (!inet_aton(str, &a))
     88       1.3  christos 	return -1;
     89       1.4  christos     if (addr)
     90       1.4  christos 	*addr = a.s_addr;
     91       1.3  christos     return 0;
     92       1.1       mrg }
     93