int hostport2addr(SOCKADDR_UNION *addr, char *hostname, char *portname) { SOCKADDR_LIST addr_list; int retval; addr_list.num=0; addr_list.addr=NULL; retval=hostport2addrlist(&addr_list, hostname, portname); if(retval>0) memcpy(addr, &addr_list.addr[0], sizeof *addr); if(addr_list.addr) str_free(addr_list.addr); return retval; }
unsigned hostport2addr(SOCKADDR_UNION *addr, char *host_name, char *port_name, int passive) { SOCKADDR_LIST *addr_list; unsigned retval; addr_list=str_alloc(sizeof(SOCKADDR_LIST)); addrlist_clear(addr_list, passive); retval=hostport2addrlist(addr_list, host_name, port_name); if(retval) addrlist2addr(addr, addr_list); str_free(addr_list->addr); str_free(addr_list); return retval; }
int name2addrlist(SOCKADDR_LIST *addr_list, char *name, char *default_host) { char tmp[STRLEN], *hostname, *portname; /* set hostname and portname */ safecopy(tmp, name); portname=strrchr(tmp, ':'); if(portname) { hostname=tmp; *portname++='\0'; } else { /* no ':' - use default host IP */ hostname=default_host; portname=tmp; } /* fill addr_list structure */ return hostport2addrlist(addr_list, hostname, portname); }
int name2addrlist(SOCKADDR_LIST *addr_list, char *name, char *default_host) { char *tmp, *hostname, *portname; int retval; /* set hostname and portname */ tmp=str_dup(name); portname=strrchr(tmp, ':'); if(portname) { hostname=tmp; *portname++='\0'; } else { /* no ':' - use default host IP */ hostname=default_host; portname=tmp; } /* fill addr_list structure */ retval=hostport2addrlist(addr_list, hostname, portname); str_free(tmp); return retval; }
int name2addrlist(SOCKADDR_LIST *addr_list, char *name, char *default_host) { char *tmp, *hostname, *portname; int retval; addr_list->cur=0; /* reset round-robin counter */ /* first check if this is a UNIX socket */ #ifdef HAVE_STRUCT_SOCKADDR_UN if(*name=='/') { if(offsetof(struct sockaddr_un, sun_path)+strlen(name)+1 > sizeof(struct sockaddr_un)) { s_log(LOG_ERR, "Unix socket path is too long"); return 0; /* no results */ } addr_list->addr=str_realloc(addr_list->addr, (addr_list->num+1)*sizeof(SOCKADDR_UNION)); addr_list->addr[addr_list->num].un.sun_family=AF_UNIX; strcpy(addr_list->addr[addr_list->num].un.sun_path, name); return ++(addr_list->num); /* ok - return the number of addresses */ } #endif /* set hostname and portname */ tmp=str_dup(name); portname=strrchr(tmp, ':'); if(portname) { hostname=tmp; *portname++='\0'; } else { /* no ':' - use default host IP */ hostname=default_host; portname=tmp; } /* fill addr_list structure */ retval=hostport2addrlist(addr_list, hostname, portname); str_free(tmp); return retval; }