curl_get_line.c (2527B)
1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at https://curl.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 * SPDX-License-Identifier: curl 22 * 23 ***************************************************************************/ 24 25 #include "curl_setup.h" 26 27 #if !defined(CURL_DISABLE_COOKIES) || !defined(CURL_DISABLE_ALTSVC) || \ 28 !defined(CURL_DISABLE_HSTS) || !defined(CURL_DISABLE_NETRC) 29 30 #include "curl_get_line.h" 31 #include "curl_memory.h" 32 /* The last #include file should be: */ 33 #include "memdebug.h" 34 35 static int appendnl(struct dynbuf *buf) 36 { 37 CURLcode result = curlx_dyn_addn(buf, "\n", 1); 38 if(result) 39 /* too long line or out of memory */ 40 return 0; /* error */ 41 return 1; /* all good */ 42 } 43 44 /* 45 * Curl_get_line() makes sure to only return complete whole lines that end 46 * newlines. 47 */ 48 int Curl_get_line(struct dynbuf *buf, FILE *input) 49 { 50 CURLcode result; 51 char buffer[128]; 52 curlx_dyn_reset(buf); 53 while(1) { 54 char *b = fgets(buffer, sizeof(buffer), input); 55 size_t rlen; 56 57 if(b) { 58 rlen = strlen(b); 59 60 if(!rlen) 61 break; 62 63 result = curlx_dyn_addn(buf, b, rlen); 64 if(result) 65 /* too long line or out of memory */ 66 return 0; /* error */ 67 68 else if(b[rlen-1] == '\n') 69 /* end of the line */ 70 return 1; /* all good */ 71 72 else if(feof(input)) 73 /* append a newline */ 74 return appendnl(buf); 75 } 76 else { 77 rlen = curlx_dyn_len(buf); 78 if(rlen) { 79 b = curlx_dyn_ptr(buf); 80 81 if(b[rlen-1] != '\n') 82 /* append a newline */ 83 return appendnl(buf); 84 85 return 1; /* all good */ 86 } 87 else 88 break; 89 } 90 } 91 return 0; 92 } 93 94 #endif /* if not disabled */