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