afpfs-ng-mac/patches/13_add_ipv6_support.patch

399 lines
12 KiB
Diff

diff -Naur afpfs-ng-0.8.1/cmdline/getstatus.c afpfs-ng-0.8.1-v6/cmdline/getstatus.c
--- afpfs-ng-0.8.1/cmdline/getstatus.c 2013-03-08 17:35:33.000000000 -0800
+++ afpfs-ng-0.8.1-v6/cmdline/getstatus.c 2013-03-08 18:09:05.000000000 -0800
@@ -8,25 +8,26 @@
static int getstatus(char * address_string, unsigned int port)
{
- struct afp_server *server;
- struct hostent *h;
- int ret;
- struct sockaddr_in address;
+ struct afp_server *server;
+ struct hostent *h;
+ int ret;
+ struct addrinfo * address;
int j, firsttime=0;
char signature_string[AFP_SIGNATURE_LEN*2+1];
struct afp_versions * tmpversion;
- if (afp_get_address(NULL,address_string, port, &address)>0) return -1;
+ if ((address = afp_get_address(NULL,address_string, port)) == NULL) return -1;
- server=afp_server_init(&address);
+ server=afp_server_init(address);
- ret=afp_server_connect(server,1);
- if (ret<0) {
+ ret=afp_server_connect(server,1);
+
+ if (ret<0) {
perror("Connecting to server");
return -1;
}
- printf("Server name: %s\n",server->server_name_printable);
+ printf("Server name: %s\n",server->server_name_printable);
printf("Machine type: %s\n",server->machine_type);
printf("AFP versions: \n");
diff -Naur afpfs-ng-0.8.1/include/afpfs-ng/afp.h afpfs-ng-0.8.1-v6/include/afpfs-ng/afp.h
--- afpfs-ng-0.8.1/include/afpfs-ng/afp.h 2013-03-08 17:35:56.000000000 -0800
+++ afpfs-ng-0.8.1-v6/include/afpfs-ng/afp.h 2013-03-08 18:06:10.000000000 -0800
@@ -165,7 +165,10 @@
unsigned int tx_delay;
/* Connection information */
- struct sockaddr_in address;
+ //the linked list returned by getaddrinfo
+ struct addrinfo *address;
+ //the address we successfully connected to
+ struct addrinfo *used_address;
int fd;
/* Some stats, for information only */
@@ -225,7 +228,6 @@
char loginmesg[200];
- char servermesg[200];
char path_encoding;
/* This is the data for the incoming buffer */
@@ -327,9 +329,8 @@
void afp_free_server(struct afp_server **server);
-struct afp_server * afp_server_init(struct sockaddr_in * address);
-int afp_get_address(void * priv, const char * hostname, unsigned int port,
- struct sockaddr_in * address);
+struct afp_server * afp_server_init(struct addrinfo * address);
+struct addrinfo * afp_get_address(void * priv, const char * hostname, unsigned int port);
int afp_main_loop(int command_fd);
@@ -343,7 +344,7 @@
struct afp_server * afp_server_complete_connection(
void * priv,
struct afp_server * server,
- struct sockaddr_in * address, unsigned char * versions,
+ struct addrinfo * address, unsigned char * versions,
unsigned int uams, char * username, char * password,
unsigned int requested_version, unsigned int uam_mask);
@@ -353,7 +354,7 @@
int add_cache_entry(struct afp_file_info * file) ;
struct afp_file_info * get_cache_by_name(char * name);
-struct afp_server * find_server_by_address(struct sockaddr_in * address);
+struct afp_server * find_server_by_address(struct addrinfo * address);
struct afp_server * find_server_by_signature(char * signature);
struct afp_server * find_server_by_name(char * name);
int server_still_valid(struct afp_server * server);
diff -Naur afpfs-ng-0.8.1/lib/afp.c afpfs-ng-0.8.1-v6/lib/afp.c
--- afpfs-ng-0.8.1/lib/afp.c 2013-03-08 17:35:51.000000000 -0800
+++ afpfs-ng-0.8.1-v6/lib/afp.c 2013-03-09 15:47:36.000000000 -0800
@@ -201,14 +201,19 @@
return NULL;
}
-struct afp_server * find_server_by_address(struct sockaddr_in * address)
+struct afp_server * find_server_by_address(struct addrinfo *address)
{
- struct afp_server *s;
+ struct afp_server *s;
+
for (s=server_base;s;s=s->next) {
- if (bcmp(&s->address,address,sizeof(struct sockaddr_in))==0)
- return s;
+ if (s->used_address != NULL && s->used_address->ai_addr != NULL &&
+ address != NULL && address->ai_addr != NULL &&
+ bcmp(&s->used_address->ai_addr, &address->ai_addr,
+ sizeof(struct sockaddr))==0) {
+ return s;
+ }
}
- return NULL;
+ return NULL;
}
int something_is_mounted(struct afp_server * server)
@@ -350,7 +355,7 @@
}
-struct afp_server * afp_server_init(struct sockaddr_in * address)
+struct afp_server * afp_server_init(struct addrinfo * address)
{
struct afp_server * s;
struct passwd *pw;
@@ -369,7 +374,7 @@
s->attention_len=0;
s->connect_state=SERVER_STATE_DISCONNECTED;
- memcpy(&s->address,address,sizeof(*address));
+ s->address = address;
/* FIXME this shouldn't be set here */
pw=getpwuid(geteuid());
@@ -633,22 +638,57 @@
int afp_server_connect(struct afp_server *server, int full)
{
- int error = 0;
- struct timeval t1, t2;
+ int error = 0;
+ struct timeval t1, t2;
+ struct addrinfo *address;
+ char log_msg[64];
+ char ip_addr[INET6_ADDRSTRLEN];
+
+ address = server->address;
+ while (address)
+ {
+ switch(address->ai_family)
+ {
+ case AF_INET6:
+ inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)address->ai_addr)->sin6_addr),
+ ip_addr, INET6_ADDRSTRLEN);
+ break;
+ case AF_INET:
+ inet_ntop(AF_INET, &(((struct sockaddr_in *)address->ai_addr)->sin_addr),
+ ip_addr, INET6_ADDRSTRLEN);
+ break;
+ default:
+ snprintf(ip_addr, 22, "unknown address family");
+ break;
+ }
- if ((server->fd= socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0 ) {
- error = errno;
- goto error;
- }
+ snprintf(log_msg, sizeof(log_msg), "trying %s ...", ip_addr);
+
+ log_for_client(NULL, AFPFSD, LOG_NOTICE, log_msg);
+
+ server->fd = socket(address->ai_family,
+ address->ai_socktype, address->ai_protocol);
+
+ if (server->fd >= 0)
+ {
+ if (connect(server->fd, address->ai_addr, address->ai_addrlen) == 0)
+ break;
+ close(server->fd);
+ server->fd = -1;
+ }
+ address = address->ai_next;
+ }
- if (connect(server->fd,(struct sockaddr *) &server->address,sizeof(server->address)) < 0) {
+ if(server->fd < 0)
+ {
error = errno;
goto error;
}
- server->exit_flag=0;
- server->lastrequestid=0;
- server->connect_state=SERVER_STATE_CONNECTED;
+ server->exit_flag = 0;
+ server->lastrequestid = 0;
+ server->connect_state = SERVER_STATE_CONNECTED;
+ server->used_address = address;
add_server(server);
diff -Naur afpfs-ng-0.8.1/lib/afp_url.c afpfs-ng-0.8.1-v6/lib/afp_url.c
--- afpfs-ng-0.8.1/lib/afp_url.c 2013-03-08 17:35:51.000000000 -0800
+++ afpfs-ng-0.8.1-v6/lib/afp_url.c 2013-03-08 17:14:12.000000000 -0800
@@ -14,7 +14,6 @@
static int check_servername (char * servername)
{
- if (strchr(servername,':')) return -1;
if (strchr(servername,'/')) return -1;
return 0;
}
@@ -150,6 +149,7 @@
int skip_earliestpart=0;
int skip_secondpart=0;
char * lastchar;
+ int foundv6literal=0;
if (verbose) printf("Parsing %s\n",toparse);
@@ -223,9 +223,19 @@
}
/* p now points to the start of the server name*/
+ /* square brackets denote a literal ipv6 address */
+ if (*p == '[' &&
+ (q=strchr(p,']'))) {
+ foundv6literal = 1;
+ p++;
+ *q = '\0';
+ q++;
+ }
+
/* see if we have a port number */
- if ((q=strchr(p,':'))) {
+ if ((foundv6literal && (q=strchr(q,':'))) ||
+ (!foundv6literal && (q=strchr(p,':'))) ) {
*q='\0';
q++;
if (check_port(q)) return -1;
diff -Naur afpfs-ng-0.8.1/lib/connect.c afpfs-ng-0.8.1-v6/lib/connect.c
--- afpfs-ng-0.8.1/lib/connect.c 2013-03-08 17:35:12.000000000 -0800
+++ afpfs-ng-0.8.1-v6/lib/connect.c 2013-03-08 19:32:23.000000000 -0800
@@ -21,24 +21,25 @@
-int afp_get_address(void * priv, const char * hostname, unsigned int port,
- struct sockaddr_in * address)
+struct addrinfo * afp_get_address(void * priv, const char * hostname, unsigned int port)
{
- struct hostent *h;
- h= gethostbyname(hostname);
- if (!h) {
+ char port_string[6];
+ struct addrinfo hints;
+ struct addrinfo * addresses;
+
+ memset(&hints, 0, sizeof(struct addrinfo));
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+
+ snprintf(port_string, sizeof(port_string), "%u", port);
+ int res = getaddrinfo(hostname, port_string, &hints, &addresses);
+ if (res != 0 ) {
log_for_client(priv,AFPFSD,LOG_ERR,
"Could not resolve %s.\n",hostname);
- goto error;
+ return NULL;
}
- memset(address,0,sizeof(*address));
- address->sin_family = AF_INET;
- address->sin_port = htons(port);
- memcpy(&address->sin_addr,h->h_addr,h->h_length);
- return 0;
-error:
- return -1;
+ return addresses;
}
@@ -46,7 +47,7 @@
struct afp_server * afp_server_full_connect (void * priv, struct afp_connection_request *req)
{
int ret;
- struct sockaddr_in address;
+ struct addrinfo * address;
struct afp_server * s=NULL;
struct afp_server * tmpserver;
char signature[AFP_SIGNATURE_LEN];
@@ -59,12 +60,12 @@
unsigned int rx_quantum;
char icon[AFP_SERVER_ICON_LEN];
- if (afp_get_address(priv,req->url.servername, req->url.port,&address)<0)
+ if ((address = afp_get_address(priv,req->url.servername, req->url.port)) == NULL)
goto error;
- if ((s=find_server_by_address(&address))) goto have_server;
+ if ((s=find_server_by_address(address))) goto have_server;
- if ((tmpserver=afp_server_init(&address))==NULL) goto error;
+ if ((tmpserver=afp_server_init(address))==NULL) goto error;
if ((ret=afp_server_connect(tmpserver,1))<0) {
if (ret==-ETIMEDOUT) {
@@ -75,7 +76,6 @@
"Could not connect, %s\n",strerror(-ret));
}
afp_server_remove(tmpserver);
- afp_server_remove(tmpserver);
goto error;
}
loop_disconnect(tmpserver);
@@ -98,7 +98,7 @@
s=find_server_by_signature(signature);
if (!s) {
- s = afp_server_init(&address);
+ s = afp_server_init(address);
if (afp_server_connect(s,0) !=0) {
log_for_client(priv,AFPFSD,LOG_ERR,
@@ -108,7 +108,7 @@
}
if ((afp_server_complete_connection(priv,
- s,&address,(unsigned char *) &versions,uams,
+ s,address,(unsigned char *) &versions,uams,
req->url.username, req->url.password,
req->url.requested_version, req->uam_mask))==NULL) {
goto error;
diff -Naur afpfs-ng-0.8.1/lib/server.c afpfs-ng-0.8.1-v6/lib/server.c
--- afpfs-ng-0.8.1/lib/server.c 2013-03-08 17:35:12.000000000 -0800
+++ afpfs-ng-0.8.1-v6/lib/server.c 2013-03-08 17:14:12.000000000 -0800
@@ -22,7 +22,7 @@
struct afp_server * afp_server_complete_connection(
void * priv,
struct afp_server * server,
- struct sockaddr_in * address, unsigned char * versions,
+ struct addrinfo * address, unsigned char * versions,
unsigned int uams, char * username, char * password,
unsigned int requested_version, unsigned int uam_mask)
{
diff -Naur afpfs-ng-0.8.1/lib/status.c afpfs-ng-0.8.1-v6/lib/status.c
--- afpfs-ng-0.8.1/lib/status.c 2013-03-08 17:35:12.000000000 -0800
+++ afpfs-ng-0.8.1-v6/lib/status.c 2013-03-09 15:47:50.000000000 -0800
@@ -73,6 +73,7 @@
int pos=0;
int firsttime=0;
struct dsi_request * request;
+ char ip_addr[64];
memset(text,0,*len);
@@ -85,15 +86,32 @@
for (j=0;j<AFP_SIGNATURE_LEN;j++)
sprintf(signature_string+(j*2),"%02x",
(unsigned int) ((char) s->signature[j]));
+
+ switch(s->used_address->ai_family)
+ {
+ case AF_INET6:
+ inet_ntop(AF_INET6,
+ &(((struct sockaddr_in6 *)s->used_address->ai_addr)->sin6_addr),
+ ip_addr, INET6_ADDRSTRLEN);
+ break;
+ case AF_INET:
+ inet_ntop(AF_INET,
+ &(((struct sockaddr_in *)s->used_address->ai_addr)->sin_addr),
+ ip_addr, INET6_ADDRSTRLEN);
+ break;
+ default:
+ snprintf(ip_addr, 23, "unknown address family");
+ break;
+ }
pos+=snprintf(text+pos,*len-pos,
"Server %s\n"
" connection: %s:%d %s\n"
" using AFP version: %s\n",
s->server_name_printable,
- inet_ntoa(s->address.sin_addr),ntohs(s->address.sin_port),
- (s->connect_state==SERVER_STATE_DISCONNECTED ?
- "Disconnected" : "(active)"),
+ ip_addr, ntohs(s->used_address->ai_protocol),
+ (s->connect_state==SERVER_STATE_DISCONNECTED ?
+ "(disconnected)" : "(active)"),
s->using_version->av_name
);