mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +00:00 
			
		
		
		
	
		
			
	
	
		
			89 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*	$NetBSD: fgetln.c,v 1.1.1.1 1999/04/12 07:43:21 crooksa Exp $	*/ | ||
|  | 
 | ||
|  | /*-
 | ||
|  |  * Copyright (c) 1998 The NetBSD Foundation, Inc. | ||
|  |  * All rights reserved. | ||
|  |  * | ||
|  |  * This code is derived from software contributed to The NetBSD Foundation | ||
|  |  * by Christos Zoulas. | ||
|  |  * | ||
|  |  * Redistribution and use in source and binary forms, with or without | ||
|  |  * modification, are permitted provided that the following conditions | ||
|  |  * are met: | ||
|  |  * 1. Redistributions of source code must retain the above copyright | ||
|  |  *    notice, this list of conditions and the following disclaimer. | ||
|  |  * 2. Redistributions in binary form must reproduce the above copyright | ||
|  |  *    notice, this list of conditions and the following disclaimer in the | ||
|  |  *    documentation and/or other materials provided with the distribution. | ||
|  |  * 3. All advertising materials mentioning features or use of this software | ||
|  |  *    must display the following acknowledgement: | ||
|  |  *        This product includes software developed by the NetBSD | ||
|  |  *        Foundation, Inc. and its contributors. | ||
|  |  * 4. Neither the name of The NetBSD Foundation nor the names of its | ||
|  |  *    contributors may be used to endorse or promote products derived | ||
|  |  *    from this software without specific prior written permission. | ||
|  |  * | ||
|  |  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | ||
|  |  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | ||
|  |  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
|  |  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | ||
|  |  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
|  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
|  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
|  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||
|  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
|  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
|  |  * POSSIBILITY OF SUCH DAMAGE. | ||
|  |  */ | ||
|  | 
 | ||
|  | #include "config.h"
 | ||
|  | #include <stdio.h>
 | ||
|  | #include <stdlib.h>
 | ||
|  | #include <unistd.h>
 | ||
|  | #include <errno.h>
 | ||
|  | #include <string.h>
 | ||
|  | 
 | ||
|  | char * | ||
|  | fgetln(fp, len) | ||
|  | 	FILE *fp; | ||
|  | 	size_t *len; | ||
|  | { | ||
|  | 	static char *buf = NULL; | ||
|  | 	static size_t bufsiz = 0; | ||
|  | 	char *ptr; | ||
|  | 
 | ||
|  | 
 | ||
|  | 	if (buf == NULL) { | ||
|  | 		bufsiz = BUFSIZ; | ||
|  | 		if ((buf = malloc(bufsiz)) == NULL) | ||
|  | 			return NULL; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if (fgets(buf, bufsiz, fp) == NULL) | ||
|  | 		return NULL; | ||
|  | 	*len = 0; | ||
|  | 
 | ||
|  | 	while ((ptr = strchr(&buf[*len], '\n')) == NULL) { | ||
|  | 		size_t nbufsiz = bufsiz + BUFSIZ; | ||
|  | 		char *nbuf = realloc(buf, nbufsiz); | ||
|  | 
 | ||
|  | 		if (nbuf == NULL) { | ||
|  | 			int oerrno = errno; | ||
|  | 			free(buf); | ||
|  | 			errno = oerrno; | ||
|  | 			buf = NULL; | ||
|  | 			return NULL; | ||
|  | 		} else | ||
|  | 			buf = nbuf; | ||
|  | 
 | ||
|  | 		*len = bufsiz; | ||
|  | 		if (fgets(&buf[bufsiz], BUFSIZ, fp) == NULL) | ||
|  | 			return buf; | ||
|  | 
 | ||
|  | 		bufsiz = nbufsiz; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	*len = (ptr - buf) + 1; | ||
|  | 	return buf; | ||
|  | } |