Home | History | Annotate | Line # | Download | only in libldap
fetch.c revision 1.1
      1 /*	$NetBSD: fetch.c,v 1.1 2014/05/28 09:58:41 tron Exp $	*/
      2 
      3 /* fetch.c - routines for fetching data at URLs */
      4 /* $OpenLDAP$ */
      5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
      6  *
      7  * Copyright 1999-2014 The OpenLDAP Foundation.
      8  * Portions Copyright 1999-2003 Kurt D. Zeilenga.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted only as authorized by the OpenLDAP
     13  * Public License.
     14  *
     15  * A copy of this license is available in the file LICENSE in the
     16  * top-level directory of the distribution or, alternatively, at
     17  * <http://www.OpenLDAP.org/license.html>.
     18  */
     19 /* This work was initially developed by Kurt D. Zeilenga for
     20  * inclusion in OpenLDAP Software.
     21  */
     22 
     23 #include "portable.h"
     24 
     25 #include <stdio.h>
     26 
     27 #include <ac/stdlib.h>
     28 
     29 #include <ac/string.h>
     30 #include <ac/socket.h>
     31 #include <ac/time.h>
     32 
     33 #ifdef HAVE_FETCH
     34 #include <fetch.h>
     35 #endif
     36 
     37 #include "lber_pvt.h"
     38 #include "ldap_pvt.h"
     39 #include "ldap_config.h"
     40 #include "ldif.h"
     41 
     42 FILE *
     43 ldif_open_url(
     44 	LDAP_CONST char *urlstr )
     45 {
     46 	FILE *url;
     47 
     48 	if( strncasecmp( "file:", urlstr, sizeof("file:")-1 ) == 0 ) {
     49 		char *p;
     50 		urlstr += sizeof("file:")-1;
     51 
     52 		/* we don't check for LDAP_DIRSEP since URLs should contain '/' */
     53 		if ( urlstr[0] == '/' && urlstr[1] == '/' ) {
     54 			urlstr += 2;
     55 			/* path must be absolute if authority is present */
     56 			if ( urlstr[0] != '/' )
     57 				return NULL;
     58 		}
     59 
     60 		p = ber_strdup( urlstr );
     61 
     62 		/* But we should convert to LDAP_DIRSEP before use */
     63 		if ( LDAP_DIRSEP[0] != '/' ) {
     64 			char *s = p;
     65 			while (( s = strchr( s, '/' )))
     66 				*s++ = LDAP_DIRSEP[0];
     67 		}
     68 
     69 		ldap_pvt_hex_unescape( p );
     70 
     71 		url = fopen( p, "rb" );
     72 
     73 		ber_memfree( p );
     74 	} else {
     75 #ifdef HAVE_FETCH
     76 		url = fetchGetURL( (char*) urlstr, "" );
     77 #else
     78 		url = NULL;
     79 #endif
     80 	}
     81 	return url;
     82 }
     83 
     84 int
     85 ldif_fetch_url(
     86     LDAP_CONST char	*urlstr,
     87     char	**valuep,
     88     ber_len_t *vlenp )
     89 {
     90 	FILE *url;
     91 	char buffer[1024];
     92 	char *p = NULL;
     93 	size_t total;
     94 	size_t bytes;
     95 
     96 	*valuep = NULL;
     97 	*vlenp = 0;
     98 
     99 	url = ldif_open_url( urlstr );
    100 
    101 	if( url == NULL ) {
    102 		return -1;
    103 	}
    104 
    105 	total = 0;
    106 
    107 	while( (bytes = fread( buffer, 1, sizeof(buffer), url )) != 0 ) {
    108 		char *newp = ber_memrealloc( p, total + bytes + 1 );
    109 		if( newp == NULL ) {
    110 			ber_memfree( p );
    111 			fclose( url );
    112 			return -1;
    113 		}
    114 		p = newp;
    115 		AC_MEMCPY( &p[total], buffer, bytes );
    116 		total += bytes;
    117 	}
    118 
    119 	fclose( url );
    120 
    121 	if( total == 0 ) {
    122 		char *newp = ber_memrealloc( p, 1 );
    123 		if( newp == NULL ) {
    124 			ber_memfree( p );
    125 			return -1;
    126 		}
    127 		p = newp;
    128 	}
    129 
    130 	p[total] = '\0';
    131 	*valuep = p;
    132 	*vlenp = total;
    133 
    134 	return 0;
    135 }
    136