1310901Sngie/* 2133211Sharti * Copyright (C) 2004 3133211Sharti * Hartmut Brandt. 4133211Sharti * All rights reserved. 5310901Sngie * 6133211Sharti * Author: Harti Brandt <harti@freebsd.org> 7310901Sngie * 8133211Sharti * Redistribution and use in source and binary forms, with or without 9133211Sharti * modification, are permitted provided that the following conditions 10133211Sharti * are met: 11133211Sharti * 1. Redistributions of source code must retain the above copyright 12133211Sharti * notice, this list of conditions and the following disclaimer. 13133211Sharti * 2. Redistributions in binary form must reproduce the above copyright 14133211Sharti * notice, this list of conditions and the following disclaimer in the 15133211Sharti * documentation and/or other materials provided with the distribution. 16310901Sngie * 17133211Sharti * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18133211Sharti * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19133211Sharti * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20133211Sharti * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 21133211Sharti * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22133211Sharti * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23133211Sharti * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24133211Sharti * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25133211Sharti * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26133211Sharti * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27133211Sharti * SUCH DAMAGE. 28133211Sharti * 29133211Sharti * $Begemot: bsnmp/lib/support.c,v 1.1 2004/08/06 08:47:58 brandt Exp $ 30133211Sharti * 31133211Sharti * Functions that are missing on certain systems. 32133211Sharti */ 33133211Sharti#include <stdio.h> 34133211Sharti#include <stdlib.h> 35133211Sharti#include <stdarg.h> 36133211Sharti#include <errno.h> 37133211Sharti#include <string.h> 38133211Sharti#include "support.h" 39133211Sharti 40133211Sharti#ifndef HAVE_ERR_H 41133211Sharti 42133211Shartivoid 43133211Shartiwarnx(const char *fmt, ...) 44133211Sharti{ 45133211Sharti va_list ap; 46133211Sharti 47133211Sharti va_start(ap, fmt); 48133211Sharti fprintf(stderr, "warning: "); 49133211Sharti vfprintf(stderr, fmt, ap); 50133211Sharti fprintf(stderr, "\n"); 51133211Sharti va_end(ap); 52133211Sharti} 53133211Sharti 54133211Shartivoid 55133211Shartiwarn(const char *fmt, ...) 56133211Sharti{ 57133211Sharti va_list ap; 58133211Sharti int e = errno; 59133211Sharti 60133211Sharti va_start(ap, fmt); 61133211Sharti fprintf(stderr, "warning: "); 62133211Sharti vfprintf(stderr, fmt, ap); 63133211Sharti fprintf(stderr, ": %s\n", strerror(e)); 64133211Sharti va_end(ap); 65133211Sharti} 66133211Sharti 67133211Shartivoid 68133211Shartierrx(int code, const char *fmt, ...) 69133211Sharti{ 70133211Sharti va_list ap; 71133211Sharti 72133211Sharti va_start(ap, fmt); 73133211Sharti fprintf(stderr, "error: "); 74133211Sharti vfprintf(stderr, fmt, ap); 75133211Sharti fprintf(stderr, "\n"); 76133211Sharti va_end(ap); 77133211Sharti exit(code); 78133211Sharti} 79133211Sharti 80133211Shartivoid 81133211Shartierr(int code, const char *fmt, ...) 82133211Sharti{ 83133211Sharti va_list ap; 84133211Sharti int e = errno; 85133211Sharti 86133211Sharti va_start(ap, fmt); 87133211Sharti fprintf(stderr, "error: "); 88133211Sharti vfprintf(stderr, fmt, ap); 89133211Sharti fprintf(stderr, ": %s\n", strerror(e)); 90133211Sharti va_end(ap); 91133211Sharti exit(code); 92133211Sharti} 93133211Sharti 94133211Sharti#endif 95133211Sharti 96133211Sharti#ifndef HAVE_STRLCPY 97133211Sharti 98133211Shartisize_t 99133211Shartistrlcpy(char *dst, const char *src, size_t len) 100133211Sharti{ 101133211Sharti size_t ret = strlen(dst); 102133211Sharti 103133211Sharti while (len > 1) { 104133211Sharti *dst++ = *src++; 105133211Sharti len--; 106133211Sharti } 107133211Sharti if (len > 0) 108133211Sharti *dst = '\0'; 109133211Sharti return (ret); 110133211Sharti} 111133211Sharti 112133211Sharti#endif 113133211Sharti 114133211Sharti#ifndef HAVE_GETADDRINFO 115133211Sharti 116133211Sharti#include <sys/types.h> 117133211Sharti#include <sys/socket.h> 118133211Sharti#include <netinet/in.h> 119133211Sharti#include <netdb.h> 120133211Sharti 121133211Shartiextern int h_nerr; 122133211Shartiextern int h_errno; 123133211Shartiextern const char *h_errlist[]; 124133211Sharti 125133211Sharti/* 126133211Sharti * VERY poor man's implementation 127133211Sharti */ 128133211Shartiint 129133211Shartigetaddrinfo(const char *host, const char *port, const struct addrinfo *hints, 130133211Sharti struct addrinfo **res) 131133211Sharti{ 132133211Sharti struct hostent *hent; 133133211Sharti struct sockaddr_in *s; 134133211Sharti struct servent *sent; 135133211Sharti 136133211Sharti if ((hent = gethostbyname(host)) == NULL) 137133211Sharti return (h_errno); 138133211Sharti if (hent->h_addrtype != hints->ai_family) 139133211Sharti return (HOST_NOT_FOUND); 140133211Sharti if (hent->h_addrtype != AF_INET) 141133211Sharti return (HOST_NOT_FOUND); 142133211Sharti 143133211Sharti if ((*res = malloc(sizeof(**res))) == NULL) 144133211Sharti return (HOST_NOT_FOUND); 145133211Sharti 146133211Sharti (*res)->ai_flags = hints->ai_flags; 147133211Sharti (*res)->ai_family = hints->ai_family; 148133211Sharti (*res)->ai_socktype = hints->ai_socktype; 149133211Sharti (*res)->ai_protocol = hints->ai_protocol; 150133211Sharti (*res)->ai_next = NULL; 151133211Sharti 152133211Sharti if (((*res)->ai_addr = malloc(sizeof(struct sockaddr_in))) == NULL) { 153133211Sharti freeaddrinfo(*res); 154133211Sharti return (HOST_NOT_FOUND); 155133211Sharti } 156133211Sharti (*res)->ai_addrlen = sizeof(struct sockaddr_in); 157133211Sharti s = (struct sockaddr_in *)(*res)->ai_addr; 158133211Sharti s->sin_family = hints->ai_family; 159133211Sharti s->sin_len = sizeof(*s); 160133211Sharti memcpy(&s->sin_addr, hent->h_addr, 4); 161133211Sharti 162133211Sharti if ((sent = getservbyname(port, NULL)) == NULL) { 163133211Sharti freeaddrinfo(*res); 164133211Sharti return (HOST_NOT_FOUND); 165133211Sharti } 166133211Sharti s->sin_port = sent->s_port; 167133211Sharti 168133211Sharti return (0); 169133211Sharti} 170133211Sharti 171133211Sharticonst char * 172133211Shartigai_strerror(int e) 173133211Sharti{ 174133211Sharti 175133211Sharti if (e < 0 || e >= h_nerr) 176133211Sharti return ("unknown error"); 177133211Sharti return (h_errlist[e]); 178133211Sharti} 179133211Sharti 180133211Shartivoid 181133211Shartifreeaddrinfo(struct addrinfo *p) 182133211Sharti{ 183133211Sharti struct addrinfo *next; 184133211Sharti 185133211Sharti while (p != NULL) { 186133211Sharti next = p->ai_next; 187133211Sharti if (p->ai_addr != NULL) 188133211Sharti free(p->ai_addr); 189133211Sharti free(p); 190133211Sharti p = next; 191133211Sharti } 192133211Sharti} 193133211Sharti 194133211Sharti#endif 195