Changeset 5ebff60 for lib/ftutil.c
- Timestamp:
- 2015-02-20T22:50:54Z (9 years ago)
- Branches:
- master
- Children:
- 0b9daac, 3d45471, 7733b8c
- Parents:
- af359b4
- git-author:
- Indent <please@…> (19-02-15 05:47:20)
- git-committer:
- dequis <dx@…> (20-02-15 22:50:54)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lib/ftutil.c
raf359b4 r5ebff60 29 29 30 30 #define ASSERTSOCKOP(op, msg) \ 31 if ( (op) == -1 ) {\32 g_snprintf( errmsg, sizeof( errmsg ), msg ": %s", strerror( errno )); \31 if ((op) == -1) { \ 32 g_snprintf(errmsg, sizeof(errmsg), msg ": %s", strerror(errno)); \ 33 33 return -1; } 34 34 … … 36 36 * Creates a listening socket and returns it in saddr_ptr. 37 37 */ 38 int ft_listen( struct sockaddr_storage *saddr_ptr, char *host, char *port, int copy_fd, int for_bitlbee_client, char **errptr ) 38 int ft_listen(struct sockaddr_storage *saddr_ptr, char *host, char *port, int copy_fd, int for_bitlbee_client, 39 char **errptr) 39 40 { 40 41 int fd, gret, saddrlen; 41 42 struct addrinfo hints, *rp; 42 socklen_t ssize = sizeof( struct sockaddr_storage);43 socklen_t ssize = sizeof(struct sockaddr_storage); 43 44 struct sockaddr_storage saddrs, *saddr = &saddrs; 44 45 static char errmsg[1024]; 45 46 char *ftlisten = global.conf->ft_listen; 46 47 47 if ( errptr )48 if (errptr) { 48 49 *errptr = errmsg; 50 } 49 51 50 strcpy( port, "0");52 strcpy(port, "0"); 51 53 52 54 /* Format is <IP-A>[:<Port-A>];<IP-B>[:<Port-B>] where … … 54 56 * and B is for connections with IM peers. 55 57 */ 56 if( ftlisten ) 57 { 58 char *scolon = strchr( ftlisten, ';' ); 58 if (ftlisten) { 59 char *scolon = strchr(ftlisten, ';'); 59 60 char *colon; 60 61 61 if( scolon ) 62 { 63 if( for_bitlbee_client ) 64 { 62 if (scolon) { 63 if (for_bitlbee_client) { 65 64 *scolon = '\0'; 66 strncpy( host, ftlisten, HOST_NAME_MAX);65 strncpy(host, ftlisten, HOST_NAME_MAX); 67 66 *scolon = ';'; 67 } else { 68 strncpy(host, scolon + 1, HOST_NAME_MAX); 68 69 } 69 else 70 { 71 strncpy( host, scolon + 1, HOST_NAME_MAX ); 72 } 73 } 74 else 75 { 76 strncpy( host, ftlisten, HOST_NAME_MAX ); 70 } else { 71 strncpy(host, ftlisten, HOST_NAME_MAX); 77 72 } 78 73 79 if( ( colon = strchr( host, ':' ) ) ) 80 { 74 if ((colon = strchr(host, ':'))) { 81 75 *colon = '\0'; 82 strncpy( port, colon + 1, 5);76 strncpy(port, colon + 1, 5); 83 77 } 84 } 85 else if( copy_fd >= 0 && getsockname( copy_fd, (struct sockaddr*) &saddrs, &ssize ) == 0 && 86 ( saddrs.ss_family == AF_INET || saddrs.ss_family == AF_INET6 ) && 87 getnameinfo( (struct sockaddr*) &saddrs, ssize, host, HOST_NAME_MAX, 88 NULL, 0, NI_NUMERICHOST ) == 0 ) 89 { 78 } else if (copy_fd >= 0 && getsockname(copy_fd, (struct sockaddr*) &saddrs, &ssize) == 0 && 79 (saddrs.ss_family == AF_INET || saddrs.ss_family == AF_INET6) && 80 getnameinfo((struct sockaddr*) &saddrs, ssize, host, HOST_NAME_MAX, 81 NULL, 0, NI_NUMERICHOST) == 0) { 90 82 /* We just took our local address on copy_fd, which is likely to be a 91 83 sensible address from which we can do a file transfer now - the 92 84 most sensible we can get easily. */ 93 } 94 else 95 { 96 ASSERTSOCKOP( gethostname( host, HOST_NAME_MAX + 1 ), "gethostname()" ); 85 } else { 86 ASSERTSOCKOP(gethostname(host, HOST_NAME_MAX + 1), "gethostname()"); 97 87 } 98 88 99 memset( &hints, 0, sizeof( struct addrinfo ));89 memset(&hints, 0, sizeof(struct addrinfo)); 100 90 hints.ai_socktype = SOCK_STREAM; 101 91 hints.ai_flags = AI_NUMERICSERV; 102 92 103 if ( ( gret = getaddrinfo( host, port, &hints, &rp ) ) != 0 ) 104 { 105 sprintf( errmsg, "getaddrinfo() failed: %s", gai_strerror( gret ) ); 93 if ((gret = getaddrinfo(host, port, &hints, &rp)) != 0) { 94 sprintf(errmsg, "getaddrinfo() failed: %s", gai_strerror(gret)); 106 95 return -1; 107 96 } … … 109 98 saddrlen = rp->ai_addrlen; 110 99 111 memcpy( saddr, rp->ai_addr, saddrlen);100 memcpy(saddr, rp->ai_addr, saddrlen); 112 101 113 freeaddrinfo( rp);102 freeaddrinfo(rp); 114 103 115 ASSERTSOCKOP( fd = socket( saddr->ss_family, SOCK_STREAM, 0 ), "Opening socket");116 ASSERTSOCKOP( bind( fd, ( struct sockaddr *)saddr, saddrlen ), "Binding socket");117 ASSERTSOCKOP( listen( fd, 1 ), "Making socket listen");104 ASSERTSOCKOP(fd = socket(saddr->ss_family, SOCK_STREAM, 0), "Opening socket"); 105 ASSERTSOCKOP(bind(fd, ( struct sockaddr *) saddr, saddrlen), "Binding socket"); 106 ASSERTSOCKOP(listen(fd, 1), "Making socket listen"); 118 107 119 if ( !inet_ntop( saddr->ss_family, saddr->ss_family == AF_INET ? 120 ( void * )&( ( struct sockaddr_in * ) saddr )->sin_addr.s_addr : 121 ( void * )&( ( struct sockaddr_in6 * ) saddr )->sin6_addr.s6_addr, 122 host, HOST_NAME_MAX ) ) 123 { 124 strcpy( errmsg, "inet_ntop failed on listening socket" ); 108 if (!inet_ntop(saddr->ss_family, saddr->ss_family == AF_INET ? 109 ( void * ) &(( struct sockaddr_in * ) saddr)->sin_addr.s_addr : 110 ( void * ) &(( struct sockaddr_in6 * ) saddr)->sin6_addr.s6_addr, 111 host, HOST_NAME_MAX)) { 112 strcpy(errmsg, "inet_ntop failed on listening socket"); 125 113 return -1; 126 114 } 127 115 128 ssize = sizeof( struct sockaddr_storage);129 ASSERTSOCKOP( getsockname( fd, ( struct sockaddr *)saddr, &ssize ), "Getting socket name");116 ssize = sizeof(struct sockaddr_storage); 117 ASSERTSOCKOP(getsockname(fd, ( struct sockaddr *) saddr, &ssize), "Getting socket name"); 130 118 131 if( saddr->ss_family == AF_INET ) 132 g_snprintf( port, 6, "%d", ntohs( ( (struct sockaddr_in *) saddr )->sin_port ) ); 133 else 134 g_snprintf( port, 6, "%d", ntohs( ( (struct sockaddr_in6 *) saddr )->sin6_port ) ); 119 if (saddr->ss_family == AF_INET) { 120 g_snprintf(port, 6, "%d", ntohs(((struct sockaddr_in *) saddr)->sin_port)); 121 } else { 122 g_snprintf(port, 6, "%d", ntohs(((struct sockaddr_in6 *) saddr)->sin6_port)); 123 } 135 124 136 if( saddr_ptr ) 137 memcpy( saddr_ptr, saddr, saddrlen ); 125 if (saddr_ptr) { 126 memcpy(saddr_ptr, saddr, saddrlen); 127 } 138 128 139 129 /* I hate static-length strings.. */ 140 host[HOST_NAME_MAX -1] = '\0';130 host[HOST_NAME_MAX - 1] = '\0'; 141 131 port[5] = '\0'; 142 132 143 133 return fd; 144 134 }
Note: See TracChangeset
for help on using the changeset viewer.