diff options
author | Andreas Schneider <asn@samba.org> | 2011-06-08 14:50:20 +0200 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2011-07-04 18:27:55 +1000 |
commit | c663dfff880634865c4b9f8bad0fa8599899e66a (patch) | |
tree | b00703f55c9e391a295723d7bf625ebce50b6a22 | |
parent | 6b86590342799f3fd35700a1cd1f5fd2aba3547c (diff) | |
download | samba-c663dfff880634865c4b9f8bad0fa8599899e66a.tar.gz |
s3-util: Add a get_remote_hostname() function.
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
-rw-r--r-- | source3/Makefile.in | 10 | ||||
-rw-r--r-- | source3/include/proto.h | 7 | ||||
-rw-r--r-- | source3/lib/util_sock.c | 108 | ||||
-rwxr-xr-x | source3/wscript_build | 2 |
4 files changed, 121 insertions, 6 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index aaea79d0f3e..f674500bca1 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -436,7 +436,7 @@ CRYPTO_OBJ = ../lib/crypto/crc32.o ../lib/crypto/md5.o \ ../lib/crypto/sha256.o ../lib/crypto/hmacsha256.o \ ../lib/crypto/aes.o ../lib/crypto/rijndael-alg-fst.o -LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ) $(CRYPTO_OBJ) \ +LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ) $(CRYPTO_OBJ) $(LIBTSOCKET_OBJ) \ lib/messages.o librpc/gen_ndr/ndr_messaging.o lib/messages_local.o \ lib/messages_ctdbd.o lib/ctdb_packet.o lib/ctdbd_conn.o \ ../lib/socket/interfaces.o lib/memcache.o \ @@ -576,7 +576,7 @@ LIBTSOCKET_OBJ = ../lib/tsocket/tsocket.o \ CLDAP_OBJ = libads/cldap.o \ ../libcli/cldap/cldap.o \ ../lib/util/idtree.o \ - $(LIBCLI_LDAP_MESSAGE_OBJ) $(LIBCLI_LDAP_NDR_OBJ) $(LIBTSOCKET_OBJ) + $(LIBCLI_LDAP_MESSAGE_OBJ) $(LIBCLI_LDAP_NDR_OBJ) TLDAP_OBJ = lib/tldap.o lib/tldap_util.o lib/util_tsock.o @@ -1038,7 +1038,7 @@ SMBPASSWD_OBJ = utils/smbpasswd.o $(PASSWD_UTIL_OBJ) $(PASSCHANGE_OBJ) \ rpc_client/init_lsa.o PDBEDIT_OBJ = utils/pdbedit.o $(PASSWD_UTIL_OBJ) $(PARAM_OBJ) $(PASSDB_OBJ) \ - $(LIBSAMBA_OBJ) $(LIBTSOCKET_OBJ) \ + $(LIBSAMBA_OBJ) \ $(LIB_NONSMBD_OBJ) $(GROUPDB_OBJ) \ $(LIBCLI_LDAP_NDR_OBJ) \ $(DRSUAPI_OBJ) $(LIBNDR_GEN_OBJ0) \ @@ -1327,7 +1327,7 @@ PAM_SMBPASS_OBJ_0 = pam_smbpass/pam_smb_auth.o pam_smbpass/pam_smb_passwd.o \ PAM_SMBPASS_OBJ = $(PAM_SMBPASS_OBJ_0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \ $(SMBLDAP_OBJ) $(LIBSAMBA_OBJ) \ $(DRSUAPI_OBJ) $(LIBNDR_GEN_OBJ0) \ - $(LIBTSOCKET_OBJ) $(PAM_ERRORS_OBJ) + $(PAM_ERRORS_OBJ) IDMAP_RW_OBJ = winbindd/idmap_rw.o @@ -1505,7 +1505,7 @@ NTLM_AUTH_OBJ = ${NTLM_AUTH_OBJ1} $(LIBSAMBA_OBJ) $(POPT_LIB_OBJ) \ ../lib/util/asn1.o ../libcli/auth/spnego_parse.o libsmb/clikrb5.o ../libcli/auth/krb5_wrap.o libads/kerberos.o \ libsmb/samlogon_cache.o \ $(LIBADS_SERVER_OBJ) \ - $(PASSDB_OBJ) $(LIBTSOCKET_OBJ) $(GROUPDB_OBJ) \ + $(PASSDB_OBJ) $(GROUPDB_OBJ) \ $(SMBLDAP_OBJ) $(LIBNMB_OBJ) \ $(WBCOMMON_OBJ) \ $(LIBCLI_LDAP_NDR_OBJ) \ diff --git a/source3/include/proto.h b/source3/include/proto.h index 36ba416e786..9e6cfc1c08d 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -788,6 +788,13 @@ NTSTATUS open_socket_out_defer_recv(struct tevent_req *req, int *pfd); int open_udp_socket(const char *host, int port); const char *get_peer_name(int fd, bool force_lookup); const char *get_peer_addr(int fd, char *addr, size_t addr_len); + +struct tsocket_address; + +int get_remote_hostname(const struct tsocket_address *remote_address, + char **name, + TALLOC_CTX *mem_ctx); + int create_pipe_sock(const char *socket_dir, const char *socket_name, mode_t dir_perms); diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c index 9b8632b181a..a35bd58d11d 100644 --- a/source3/lib/util_sock.c +++ b/source3/lib/util_sock.c @@ -27,6 +27,7 @@ #include "lib/socket/interfaces.h" #include "../lib/util/tevent_unix.h" #include "../lib/util/tevent_ntstatus.h" +#include "../lib/tsocket/tsocket.h" const char *client_name(int fd) { @@ -1126,6 +1127,113 @@ const char *get_peer_addr(int fd, char *addr, size_t addr_len) return get_peer_addr_internal(fd, addr, addr_len, NULL, NULL); } +int get_remote_hostname(const struct tsocket_address *remote_address, + char **name, + TALLOC_CTX *mem_ctx) +{ + char name_buf[MAX_DNS_NAME_LENGTH]; + char tmp_name[MAX_DNS_NAME_LENGTH]; + struct name_addr_pair nc; + struct sockaddr_storage ss; + socklen_t len; + int rc; + + if (!lp_hostname_lookups()) { + nc.name = tsocket_address_inet_addr_string(remote_address, + mem_ctx); + if (nc.name == NULL) { + return -1; + } + + len = tsocket_address_bsd_sockaddr(remote_address, + (struct sockaddr *) &nc.ss, + sizeof(struct sockaddr_storage)); + if (len < 0) { + return -1; + } + + store_nc(&nc); + lookup_nc(&nc); + + if (nc.name == NULL) { + *name = talloc_strdup(mem_ctx, "UNKNOWN"); + } else { + *name = talloc_strdup(mem_ctx, nc.name); + } + return 0; + } + + lookup_nc(&nc); + + ZERO_STRUCT(ss); + + len = tsocket_address_bsd_sockaddr(remote_address, + (struct sockaddr *) &ss, + sizeof(struct sockaddr_storage)); + if (len < 0) { + return -1; + } + + /* it might be the same as the last one - save some DNS work */ + if (sockaddr_equal((struct sockaddr *)&ss, (struct sockaddr *)&nc.ss)) { + if (nc.name == NULL) { + *name = talloc_strdup(mem_ctx, "UNKNOWN"); + } else { + *name = talloc_strdup(mem_ctx, nc.name); + } + return 0; + } + + /* Look up the remote host name. */ + rc = sys_getnameinfo((struct sockaddr *) &ss, + len, + name_buf, + sizeof(name_buf), + NULL, + 0, + 0); + if (rc < 0) { + char *p; + + p = tsocket_address_inet_addr_string(remote_address, mem_ctx); + if (p == NULL) { + return -1; + } + + DEBUG(1,("getnameinfo failed for %s with error %s\n", + p, + gai_strerror(rc))); + strlcpy(name_buf, p, sizeof(name_buf)); + + talloc_free(p); + } else { + if (!matchname(name_buf, (struct sockaddr *)&ss, len)) { + DEBUG(0,("matchname failed on %s\n", name_buf)); + strlcpy(name_buf, "UNKNOWN", sizeof(name_buf)); + } + } + + strlcpy(tmp_name, name_buf, sizeof(tmp_name)); + alpha_strcpy(name_buf, tmp_name, "_-.", sizeof(name_buf)); + if (strstr(name_buf,"..")) { + strlcpy(name_buf, "UNKNOWN", sizeof(name_buf)); + } + + nc.name = name_buf; + nc.ss = ss; + + store_nc(&nc); + lookup_nc(&nc); + + if (nc.name == NULL) { + *name = talloc_strdup(mem_ctx, "UNKOWN"); + } else { + *name = talloc_strdup(mem_ctx, nc.name); + } + + return 0; +} + /******************************************************************* Create protected unix domain socket. diff --git a/source3/wscript_build b/source3/wscript_build index 301d851dd38..33f242c9fe2 100755 --- a/source3/wscript_build +++ b/source3/wscript_build @@ -800,7 +800,7 @@ bld.SAMBA3_SUBSYSTEM('KRBCLIENT', bld.SAMBA3_SUBSYSTEM('samba3core', source=LIB_SRC, - deps='LIBCRYPTO ndr security NDR_SECURITY samba-util NDR_MESSAGING LIBASYNC_REQ tdb-wrap3 UTIL_TDB UTIL_PW SAMBA_VERSION KRB5_WRAP flag_mapping util_reg PTHREADPOOL interfaces cap string_init param util_str CHARSET3 namearray dbwrap_util util_sec util_malloc memcache ccan errors3', + deps='LIBTSOCKET LIBCRYPTO ndr security NDR_SECURITY samba-util NDR_MESSAGING LIBASYNC_REQ tdb-wrap3 UTIL_TDB UTIL_PW SAMBA_VERSION KRB5_WRAP flag_mapping util_reg PTHREADPOOL interfaces cap string_init param util_str CHARSET3 namearray dbwrap_util util_sec util_malloc memcache ccan errors3', vars=locals()) bld.SAMBA3_LIBRARY('smbd_shim', |