/*
- * $Id: dsi_tcp.c,v 1.21 2009-11-06 14:37:26 franklahm Exp $
+ * $Id: dsi_tcp.c,v 1.25 2009-12-08 22:34:37 didg Exp $
*
* Copyright (c) 1997, 1998 Adrian Sun (asun@zoology.washington.edu)
* All rights reserved. See COPYRIGHT.
* we have to test for EINTR
*/
if (setsockopt(dsi->socket, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) < 0) {
- LOG(log_error, logtype_default, "dsi_tcp_open: unable to set timeout %s", strerror(errno));
+ LOG(log_error, logtype_dsi, "dsi_tcp_open: unable to set timeout %s", strerror(errno));
exit(EXITERR_CLNT);
}
}
/* alarm handler for tcp_open */
static void timeout_handler(int sig _U_)
{
- LOG(log_error, logtype_default, "dsi_tcp_open: connection timed out");
+ LOG(log_error, logtype_dsi, "dsi_tcp_open: connection timed out");
exit(EXITERR_CLNT);
}
request_init(&req, RQ_DAEMON, dsi->program, RQ_FILE, dsi->socket, NULL);
fromhost(&req);
if (!hosts_access(&req)) {
- LOG(deny_severity, logtype_default, "refused connect from %s", eval_client(&req));
+ LOG(deny_severity, logtype_dsi, "refused connect from %s", eval_client(&req));
close(dsi->socket);
errno = ECONNREFUSED;
dsi->socket = -1;
if ((sigaction(SIGALRM, &newact, &oldact) < 0) ||
(setitimer(ITIMER_REAL, &timer, NULL) < 0)) {
- LOG(log_error, logtype_default, "dsi_tcp_open: %s", strerror(errno));
+ LOG(log_error, logtype_dsi, "dsi_tcp_open: %s", strerror(errno));
exit(EXITERR_SYS);
}
#endif
exit(EXITERR_CLNT);
}
if (len < 2 || (block[0] > DSIFL_MAX) || (block[1] > DSIFUNC_MAX)) {
- LOG(log_error, logtype_default, "dsi_tcp_open: invalid header");
+ LOG(log_error, logtype_dsi, "dsi_tcp_open: invalid header");
exit(EXITERR_CLNT);
}
if (len > 0)
stored += len;
else {
- LOG(log_error, logtype_default, "dsi_tcp_open: stream_read: %s", strerror(errno));
+ LOG(log_error, logtype_dsi, "dsi_tcp_open: stream_read: %s", strerror(errno));
exit(EXITERR_CLNT);
}
}
if (len > 0)
stored += len;
else {
- LOG(log_error, logtype_default, "dsi_tcp_open: stream_read: %s", strerror(errno));
+ LOG(log_error, logtype_dsi, "dsi_tcp_open: stream_read: %s", strerror(errno));
exit(EXITERR_CLNT);
}
}
dsi_tcp_timeout(dsi);
- LOG(log_info, logtype_default, "AFP/TCP session from %s:%u",
+ LOG(log_info, logtype_dsi, "AFP/TCP session from %s:%u",
getip_string((struct sockaddr *)&dsi->client),
getip_port((struct sockaddr *)&dsi->client));
}
return pid;
}
+/* get it from the interface list */
+#ifndef IFF_SLAVE
+#define IFF_SLAVE 0
+#endif
+
+static void guess_interface(DSI *dsi, const char *hostname, const char *port)
+{
+ int fd;
+ char **start, **list;
+ struct ifreq ifr;
+ struct sockaddr_in *sa = (struct sockaddr_in *)&dsi->server;
+
+ start = list = getifacelist();
+ if (!start)
+ return;
+
+ fd = socket(PF_INET, SOCK_STREAM, 0);
+
+ while (list && *list) {
+ strlcpy(ifr.ifr_name, *list, sizeof(ifr.ifr_name));
+ list++;
+
+
+ if (ioctl(dsi->serversock, SIOCGIFFLAGS, &ifr) < 0)
+ continue;
+
+ if (ifr.ifr_flags & (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_SLAVE))
+ continue;
+
+ if (!(ifr.ifr_flags & (IFF_UP | IFF_RUNNING)) )
+ continue;
+
+ if (ioctl(fd, SIOCGIFADDR, &ifr) < 0)
+ continue;
+
+ memset(&dsi->server, 0, sizeof(struct sockaddr_storage));
+ sa->sin_family = AF_INET;
+ sa->sin_port = htons(atoi(port));
+ sa->sin_addr = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr;
+
+ LOG(log_info, logtype_dsi, "dsi_tcp: '%s:%s' on interface '%s' will be used instead.",
+ getip_string((struct sockaddr *)&dsi->server), port, ifr.ifr_name);
+ goto iflist_done;
+ }
+ LOG(log_info, logtype_dsi, "dsi_tcp (Chooser will not select afp/tcp) "
+ "Check to make sure %s is in /etc/hosts and the correct domain is in "
+ "/etc/resolv.conf: %s", hostname, strerror(errno));
+
+iflist_done:
+ close(fd);
+ freeifacelist(start);
+}
+
+
+#ifndef AI_NUMERICSERV
+#define AI_NUMERICSERV 0
+#endif
+
/* this needs to accept passed in addresses */
int dsi_tcp_init(DSI *dsi, const char *hostname, const char *address,
const char *port, const int proxy)
hints.ai_flags |= AI_NUMERICHOST;
if ((ret = getaddrinfo(address ? address : NULL, port ? port : "548", &hints, &servinfo)) != 0) {
- LOG(log_error, logtype_default, "dsi_tcp_init: getaddrinfo: %s\n", gai_strerror(ret));
+ LOG(log_error, logtype_dsi, "dsi_tcp_init: getaddrinfo: %s\n", gai_strerror(ret));
return 0;
}
/* loop through all the results and bind to the first we can */
for (p = servinfo; p != NULL; p = p->ai_next) {
if ((dsi->serversock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
- LOG(log_info, logtype_default, "dsi_tcp_init: socket: %s", strerror(errno));
+ LOG(log_info, logtype_dsi, "dsi_tcp_init: socket: %s", strerror(errno));
continue;
}
if (bind(dsi->serversock, p->ai_addr, p->ai_addrlen) == -1) {
close(dsi->serversock);
- LOG(log_info, logtype_default, "dsi_tcp_init: bind: %s\n", strerror(errno));
+ LOG(log_info, logtype_dsi, "dsi_tcp_init: bind: %s\n", strerror(errno));
continue;
}
if (listen(dsi->serversock, DSI_TCPMAXPEND) < 0) {
close(dsi->serversock);
- LOG(log_info, logtype_default, "dsi_tcp_init: listen: %s\n", strerror(errno));
+ LOG(log_info, logtype_dsi, "dsi_tcp_init: listen: %s\n", strerror(errno));
continue;
}
}
if (p == NULL) {
- LOG(log_error, logtype_default, "dsi_tcp_init: no suitable network config for TCP socket");
+ LOG(log_error, logtype_dsi, "dsi_tcp_init: no suitable network config for TCP socket");
freeaddrinfo(servinfo);
return 0;
}
hints.ai_socktype = SOCK_STREAM;
if ((ret = getaddrinfo(hostname, port ? port : "548", &hints, &servinfo)) != 0) {
- LOG(log_debug, logtype_default, "dsi_tcp_init: getaddrinfo '%s': %s\n", hostname, gai_strerror(ret));
+ LOG(log_info, logtype_dsi, "dsi_tcp_init: getaddrinfo '%s': %s\n", hostname, gai_strerror(ret));
goto interfaces;
}
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
if ( (ipv4->sin_addr.s_addr & htonl(0x7f000000)) != htonl(0x7f000000) )
break;
- LOG(log_info, logtype_default, "dsi_tcp: hostname '%s' resolves to loopback address", hostname);
} else { // IPv6
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
unsigned char ipv6loopb[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
if ((memcmp(ipv6->sin6_addr.s6_addr, ipv6loopb, 16)) != 0)
break;
- LOG(log_info, logtype_default, "dsi_tcp: hostname '%s' resolves to loopback address", hostname);
}
}
freeaddrinfo(servinfo);
return 1;
}
+ LOG(log_info, logtype_dsi, "dsi_tcp: hostname '%s' resolves to loopback address", hostname);
freeaddrinfo(servinfo);
interfaces:
- LOG(log_warning, logtype_default, "dsi_tcp: cannot resolve hostname '%s'", hostname);
- /* get it from the interface list */
- int fd;
- char **start, **list;
- struct ifreq ifr;
-
- start = list = getifacelist();
- fd = socket(PF_INET, SOCK_STREAM, 0);
-
- while (list && *list) {
- strlcpy(ifr.ifr_name, *list, sizeof(ifr.ifr_name));
- list++;
-
-#ifndef IFF_SLAVE
-#define IFF_SLAVE 0
-#endif
-
- if (ioctl(dsi->serversock, SIOCGIFFLAGS, &ifr) < 0)
- continue;
-
- if (ifr.ifr_flags & (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_SLAVE))
- continue;
-
- if (!(ifr.ifr_flags & (IFF_UP | IFF_RUNNING)) )
- continue;
-
- if (ioctl(fd, SIOCGIFADDR, &ifr) < 0)
- continue;
-
- memcpy(&dsi->server, &ifr.ifr_addr, sizeof(struct sockaddr_storage));
- LOG(log_info, logtype_default, "dsi_tcp: '%s' on interface '%s' will be used instead.",
- getip_string((struct sockaddr *)&dsi->server), ifr.ifr_name);
- goto iflist_done;
- }
- LOG(log_info, logtype_default, "dsi_tcp (Chooser will not select afp/tcp) "
- "Check to make sure %s is in /etc/hosts and the correct domain is in "
- "/etc/resolv.conf: %s", hostname, strerror(errno));
-
-iflist_done:
- close(fd);
- if (start)
- freeifacelist(start);
+ guess_interface(dsi, hostname, port ? port : "548");
return 1;
}