summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2003-11-07 10:11:48 +0000
committerVolker Lendecke <vlendec@samba.org>2003-11-07 10:11:48 +0000
commit3a7c8c4f0e7fcfc2e20e1ad5e4b8e3c215ef1f0d (patch)
tree9c096c1dc5728fc5e40c3281638a509fb741ba7e /source
parentd7162122eaf5d897e5de51604e431bfbaa20e905 (diff)
downloadsamba-3a7c8c4f0e7fcfc2e20e1ad5e4b8e3c215ef1f0d.tar.gz
samba-3a7c8c4f0e7fcfc2e20e1ad5e4b8e3c215ef1f0d.tar.xz
samba-3a7c8c4f0e7fcfc2e20e1ad5e4b8e3c215ef1f0d.zip
Implement %i-Macro for the locally used IP address. With this you can again
have virtual hosts with different configurations on a single smbd even on port 445. Volker
Diffstat (limited to 'source')
-rw-r--r--source/lib/substitute.c3
-rw-r--r--source/lib/util_sock.c28
2 files changed, 31 insertions, 0 deletions
diff --git a/source/lib/substitute.c b/source/lib/substitute.c
index 923afd989f7..ee342964d0f 100644
--- a/source/lib/substitute.c
+++ b/source/lib/substitute.c
@@ -363,6 +363,9 @@ void standard_sub_basic(const char *smb_name, char *str,size_t len)
case 'I' :
string_sub(p,"%I", client_addr(),l);
break;
+ case 'i' :
+ string_sub(p,"%i", client_socket_addr(),l);
+ break;
case 'L' :
if (local_machine_name && *local_machine_name)
string_sub(p,"%L", local_machine_name,l);
diff --git a/source/lib/util_sock.c b/source/lib/util_sock.c
index bdd167b04dd..1d62da53c5b 100644
--- a/source/lib/util_sock.c
+++ b/source/lib/util_sock.c
@@ -802,6 +802,11 @@ char *client_addr(void)
return get_peer_addr(client_fd);
}
+char *client_socket_addr(void)
+{
+ return get_socket_addr(client_fd);
+}
+
struct in_addr *client_inaddr(struct sockaddr *sa)
{
struct sockaddr_in *sockin = (struct sockaddr_in *) (sa);
@@ -941,6 +946,29 @@ char *get_peer_addr(int fd)
return addr_buf;
}
+char *get_socket_addr(int fd)
+{
+ struct sockaddr sa;
+ struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
+ int length = sizeof(sa);
+ static fstring addr_buf;
+
+ fstrcpy(addr_buf,"0.0.0.0");
+
+ if (fd == -1) {
+ return addr_buf;
+ }
+
+ if (getsockname(fd, &sa, &length) < 0) {
+ DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
+ return addr_buf;
+ }
+
+ fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
+
+ return addr_buf;
+}
+
/*******************************************************************
Create protected unix domain socket.