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