Deleted Added
full compact
common.c (40975) common.c (41862)
1/*-
2 * Copyright (c) 1998 Dag-Erling Co�dan Sm�rgrav
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
1/*-
2 * Copyright (c) 1998 Dag-Erling Co�dan Sm�rgrav
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $Id: common.c,v 1.1 1998/11/05 19:48:16 des Exp $
28 * $Id: common.c,v 1.2 1998/11/06 22:14:08 des Exp $
29 */
30
29 */
30
31#include <sys/types.h>
31#include <sys/param.h>
32#include <sys/socket.h>
33#include <netinet/in.h>
34
35#include <com_err.h>
36#include <errno.h>
37#include <netdb.h>
32#include <sys/socket.h>
33#include <netinet/in.h>
34
35#include <com_err.h>
36#include <errno.h>
37#include <netdb.h>
38#include <stdlib.h>
39#include <stdio.h>
38#include <string.h>
39#include <unistd.h>
40
41#include "fetch.h"
42#include "common.h"
43
44
45/*** Local data **************************************************************/
46
47/*
48 * Error messages for resolver errors
49 */
50static struct fetcherr _netdb_errlist[] = {
51 { HOST_NOT_FOUND, FETCH_RESOLV, "Host not found" },
40#include <string.h>
41#include <unistd.h>
42
43#include "fetch.h"
44#include "common.h"
45
46
47/*** Local data **************************************************************/
48
49/*
50 * Error messages for resolver errors
51 */
52static struct fetcherr _netdb_errlist[] = {
53 { HOST_NOT_FOUND, FETCH_RESOLV, "Host not found" },
52 { TRY_AGAIN, FETCH_RESOLV, "Transient resolver failure" },
54 { TRY_AGAIN, FETCH_TEMP, "Transient resolver failure" },
53 { NO_RECOVERY, FETCH_RESOLV, "Non-recoverable resolver failure" },
54 { NO_DATA, FETCH_RESOLV, "No address record" },
55 { -1, FETCH_UNKNOWN, "Unknown resolver error" }
56};
57
58static int com_err_initialized;
59
60/*** Error-reporting functions ***********************************************/

--- 28 unchanged lines hidden (view full) ---

89_fetch_seterr(struct fetcherr *p, int e)
90{
91 int n;
92
93 if (!com_err_initialized)
94 _fetch_init_com_err();
95
96 n = _fetch_finderr(p, e);
55 { NO_RECOVERY, FETCH_RESOLV, "Non-recoverable resolver failure" },
56 { NO_DATA, FETCH_RESOLV, "No address record" },
57 { -1, FETCH_UNKNOWN, "Unknown resolver error" }
58};
59
60static int com_err_initialized;
61
62/*** Error-reporting functions ***********************************************/

--- 28 unchanged lines hidden (view full) ---

91_fetch_seterr(struct fetcherr *p, int e)
92{
93 int n;
94
95 if (!com_err_initialized)
96 _fetch_init_com_err();
97
98 n = _fetch_finderr(p, e);
97 com_err("libfetch", p[n].cat, "(%d %s)", e, p[n].string);
99 fetchLastErrCode = p[n].cat;
100 com_err("libfetch", fetchLastErrCode, "(%03d %s)", e, p[n].string);
98}
99
100/*
101 * Set error code according to errno
102 */
103void
104_fetch_syserr(void)
105{
101}
102
103/*
104 * Set error code according to errno
105 */
106void
107_fetch_syserr(void)
108{
106 int cat;
109 int e;
110 e = errno;
107
108 if (!com_err_initialized)
109 _fetch_init_com_err();
110
111 switch (errno) {
112 case 0:
111
112 if (!com_err_initialized)
113 _fetch_init_com_err();
114
115 switch (errno) {
116 case 0:
113 cat = FETCH_OK;
117 fetchLastErrCode = FETCH_OK;
114 break;
115 case EPERM:
116 case EACCES:
117 case EROFS:
118 case EAUTH:
119 case ENEEDAUTH:
118 break;
119 case EPERM:
120 case EACCES:
121 case EROFS:
122 case EAUTH:
123 case ENEEDAUTH:
120 cat = FETCH_AUTH;
124 fetchLastErrCode = FETCH_AUTH;
121 break;
122 case ENOENT:
123 case EISDIR: /* XXX */
125 break;
126 case ENOENT:
127 case EISDIR: /* XXX */
124 cat = FETCH_UNAVAIL;
128 fetchLastErrCode = FETCH_UNAVAIL;
125 break;
126 case ENOMEM:
129 break;
130 case ENOMEM:
127 cat = FETCH_MEMORY;
131 fetchLastErrCode = FETCH_MEMORY;
128 break;
129 case EBUSY:
130 case EAGAIN:
132 break;
133 case EBUSY:
134 case EAGAIN:
131 cat = FETCH_TEMP;
135 fetchLastErrCode = FETCH_TEMP;
132 break;
133 case EEXIST:
136 break;
137 case EEXIST:
134 cat = FETCH_EXISTS;
138 fetchLastErrCode = FETCH_EXISTS;
135 break;
136 case ENOSPC:
139 break;
140 case ENOSPC:
137 cat = FETCH_FULL;
141 fetchLastErrCode = FETCH_FULL;
138 break;
139 case EADDRINUSE:
140 case EADDRNOTAVAIL:
141 case ENETDOWN:
142 case ENETUNREACH:
143 case ENETRESET:
144 case EHOSTUNREACH:
142 break;
143 case EADDRINUSE:
144 case EADDRNOTAVAIL:
145 case ENETDOWN:
146 case ENETUNREACH:
147 case ENETRESET:
148 case EHOSTUNREACH:
145 cat = FETCH_NETWORK;
149 fetchLastErrCode = FETCH_NETWORK;
146 break;
147 case ECONNABORTED:
148 case ECONNRESET:
150 break;
151 case ECONNABORTED:
152 case ECONNRESET:
149 cat = FETCH_ABORT;
153 fetchLastErrCode = FETCH_ABORT;
150 break;
151 case ETIMEDOUT:
154 break;
155 case ETIMEDOUT:
152 cat = FETCH_TIMEOUT;
156 fetchLastErrCode = FETCH_TIMEOUT;
153 break;
154 case ECONNREFUSED:
155 case EHOSTDOWN:
157 break;
158 case ECONNREFUSED:
159 case EHOSTDOWN:
156 cat = FETCH_DOWN;
160 fetchLastErrCode = FETCH_DOWN;
157 break;
158 default:
161 break;
162 default:
159 cat = FETCH_UNKNOWN;
163 fetchLastErrCode = FETCH_UNKNOWN;
160 }
164 }
161 com_err("libfetch", cat, "(%02d %s)", errno, strerror(errno));
165 com_err("libfetch", fetchLastErrCode, "(%03d %s)", e, strerror(e));
162}
163
164
166}
167
168
169/*
170 * Emit status message
171 */
172int
173_fetch_info(char *fmt, ...)
174{
175 va_list ap;
176 char *s;
177
178 if (!com_err_initialized)
179 _fetch_init_com_err();
180
181 va_start(ap, fmt);
182 vasprintf(&s, fmt, ap);
183 va_end(ap);
184
185 if (s == NULL) {
186 com_err("libfetch", FETCH_MEMORY, "");
187 return -1;
188 } else {
189 com_err("libfetch", FETCH_VERBOSE, "%s", s);
190 free(s);
191 return 0;
192 }
193}
194
195
165/*** Network-related utility functions ***************************************/
166
167/*
168 * Establish a TCP connection to the specified port on the specified host.
169 */
170int
196/*** Network-related utility functions ***************************************/
197
198/*
199 * Establish a TCP connection to the specified port on the specified host.
200 */
201int
171fetchConnect(char *host, int port)
202fetchConnect(char *host, int port, int verbose)
172{
173 struct sockaddr_in sin;
174 struct hostent *he;
175 int sd;
176
177#ifndef NDEBUG
178 fprintf(stderr, "\033[1m---> %s:%d\033[m\n", host, port);
179#endif
203{
204 struct sockaddr_in sin;
205 struct hostent *he;
206 int sd;
207
208#ifndef NDEBUG
209 fprintf(stderr, "\033[1m---> %s:%d\033[m\n", host, port);
210#endif
211
212 if (verbose)
213 _fetch_info("looking up %s", host);
180
181 /* look up host name */
182 if ((he = gethostbyname(host)) == NULL) {
183 _netdb_seterr(h_errno);
184 return -1;
185 }
186
214
215 /* look up host name */
216 if ((he = gethostbyname(host)) == NULL) {
217 _netdb_seterr(h_errno);
218 return -1;
219 }
220
221 if (verbose)
222 _fetch_info("connecting to %s:%d", host, port);
223
187 /* set up socket address structure */
188 bzero(&sin, sizeof(sin));
189 bcopy(he->h_addr, (char *)&sin.sin_addr, he->h_length);
190 sin.sin_family = he->h_addrtype;
191 sin.sin_port = htons(port);
192
193 /* try to connect */
194 if ((sd = socket(sin.sin_family, SOCK_STREAM, IPPROTO_TCP)) == -1) {
195 _fetch_syserr();
196 return -1;
197 }
198 if (connect(sd, (struct sockaddr *)&sin, sizeof sin) == -1) {
199 _fetch_syserr();
200 close(sd);
201 return -1;
202 }
203
204 return sd;
205}
224 /* set up socket address structure */
225 bzero(&sin, sizeof(sin));
226 bcopy(he->h_addr, (char *)&sin.sin_addr, he->h_length);
227 sin.sin_family = he->h_addrtype;
228 sin.sin_port = htons(port);
229
230 /* try to connect */
231 if ((sd = socket(sin.sin_family, SOCK_STREAM, IPPROTO_TCP)) == -1) {
232 _fetch_syserr();
233 return -1;
234 }
235 if (connect(sd, (struct sockaddr *)&sin, sizeof sin) == -1) {
236 _fetch_syserr();
237 close(sd);
238 return -1;
239 }
240
241 return sd;
242}