1/* Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com> 2 * 3 * Redistribution and use in source and binary forms, 4 * with or without modification, are permitted provided 5 * that the following conditions are met: 6 * 7 * Redistributions of source code must retain the above 8 * copyright notice, this list of conditions and the 9 * following disclaimer. 10 * 11 * Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following 13 * disclaimer in the documentation and/or other materials 14 * provided with the distribution. 15 * 16 * Neither the name of the copyright holder nor the names 17 * of any other contributors may be used to endorse or 18 * promote products derived from this software without 19 * specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 22 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 23 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 26 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 29 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 31 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 33 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 34 * OF SUCH DAMAGE. 35 */ 36 37/* Headers */ 38#cmakedefine HAVE_UNISTD_H 39#cmakedefine HAVE_INTTYPES_H 40#cmakedefine HAVE_SYS_PARAM_H 41#cmakedefine HAVE_SYS_SOCKET_H 42#cmakedefine HAVE_ARPA_INET_H 43#cmakedefine HAVE_NETINET_IN_H 44#cmakedefine HAVE_WINDOWS_H 45#cmakedefine HAVE_WINSOCK2_H 46#cmakedefine HAVE_SNPRINTF 47 48/* snprintf not in Visual Studio CRT and _snprintf dangerously incompatible. 49 We provide a safe wrapper if snprintf not found */ 50#ifndef HAVE_SNPRINTF 51#include <stdio.h> 52#include <stdarg.h> 53/* Want safe, 'n += snprintf(b + n ...)' like function. If cp_max_len is 1 54* then assume cp is pointing to a null char and do nothing. Returns number 55* number of chars placed in cp excluding the trailing null char. So for 56* cp_max_len > 0 the return value is always < cp_max_len; for cp_max_len 57* <= 0 the return value is 0 (and no chars are written to cp). */ 58static int snprintf(char *cp, int cp_max_len, const char *fmt, ...) 59{ 60 va_list args; 61 int n; 62 63 if (cp_max_len < 2) 64 return 0; 65 va_start(args, fmt); 66 n = vsnprintf(cp, cp_max_len, fmt, args); 67 va_end(args); 68 return (n < cp_max_len) ? n : (cp_max_len - 1); 69} 70 71#define HAVE_SNPRINTF 72#endif 73