s3-lib Replace StrnCaseCmp() with strncasecmp_m()
[amitay/samba.git] / source3 / lib / substitute.c
index 55acdd95e381d8faffc1b22a7d02eba0531ad732..b246a17132fcfed74a58664f050e174b12ccbdb1 100644 (file)
 
 
 #include "includes.h"
+#include "system/passwd.h"
+#include "secrets.h"
+#include "auth.h"
+
+static char *alloc_sub_basic(const char *smb_name, const char *domain_name,
+                            const char *str);
 
 userdom_struct current_user_info;
 fstring remote_proto="UNKNOWN";
@@ -41,33 +47,18 @@ bool set_local_machine_name(const char *local_name, bool perm)
 {
        static bool already_perm = false;
        char *tmp_local_machine = NULL;
-       char addr[INET6_ADDRSTRLEN];
        size_t len;
 
+       if (already_perm) {
+               return true;
+       }
+
        tmp_local_machine = SMB_STRDUP(local_name);
        if (!tmp_local_machine) {
                return false;
        }
        trim_char(tmp_local_machine,' ',' ');
 
-       /*
-        * Windows NT/2k uses "*SMBSERVER" and XP uses "*SMBSERV"
-        * arrggg!!!
-        */
-
-       if (strequal(tmp_local_machine, "*SMBSERVER") ||
-                       strequal(tmp_local_machine, "*SMBSERV") )  {
-               SAFE_FREE(local_machine);
-               local_machine = SMB_STRDUP(client_socket_addr(get_client_fd(),
-                                       addr, sizeof(addr)) );
-               SAFE_FREE(tmp_local_machine);
-               return local_machine ? true : false;
-       }
-
-       if (already_perm) {
-               return true;
-       }
-
        SAFE_FREE(local_machine);
        len = strlen(tmp_local_machine);
        local_machine = SMB_CALLOC_ARRAY(char, len+1);
@@ -203,6 +194,33 @@ void sub_set_smb_name(const char *name)
        }
 }
 
+static char sub_peeraddr[INET6_ADDRSTRLEN];
+static const char *sub_peername = "";
+static char sub_sockaddr[INET6_ADDRSTRLEN];
+
+void sub_set_socket_ids(const char *peeraddr, const char *peername,
+                       const char *sockaddr)
+{
+       const char *addr = peeraddr;
+
+       if (strnequal(addr, "::ffff:", 7)) {
+               addr += 7;
+       }
+       strlcpy(sub_peeraddr, addr, sizeof(sub_peeraddr));
+
+       sub_peername = SMB_STRDUP(peername);
+       if (sub_peername == NULL) {
+               sub_peername = sub_peeraddr;
+       }
+
+       /*
+        * Shouldn't we do the ::ffff: cancellation here as well? The
+        * original code in alloc_sub_basic() did not do it, so I'm
+        * leaving it out here as well for compatibility.
+        */
+       strlcpy(sub_sockaddr, sockaddr, sizeof(sub_sockaddr));
+}
+
 static const char *get_smb_user_name(void)
 {
        return smb_user_name ? smb_user_name : "";
@@ -310,7 +328,7 @@ static char * realloc_expand_env_var(char *str, char *p)
 
 static char *longvar_domainsid( void )
 {
-       DOM_SID sid;
+       struct dom_sid sid;
        fstring tmp;
        char *sid_string;
 
@@ -544,12 +562,11 @@ char *talloc_sub_basic(TALLOC_CTX *mem_ctx, const char *smb_name,
 /****************************************************************************
 ****************************************************************************/
 
-char *alloc_sub_basic(const char *smb_name, const char *domain_name,
-                     const char *str)
+static char *alloc_sub_basic(const char *smb_name, const char *domain_name,
+                            const char *str)
 {
        char *b, *p, *s, *r, *a_string;
        fstring pidstr, vnnstr;
-       char addr[INET6_ADDRSTRLEN];
        const char *local_machine_name = get_local_machine_name();
        TALLOC_CTX *tmp_ctx = NULL;
 
@@ -604,21 +621,18 @@ char *alloc_sub_basic(const char *smb_name, const char *domain_name,
                        a_string = realloc_string_sub(a_string, "%D", r);
                        break;
                case 'I' : {
-                       int offset = 0;
-                       client_addr(get_client_fd(), addr, sizeof(addr));
-                       if (strnequal(addr,"::ffff:",7)) {
-                               offset = 7;
-                       }
-                       a_string = realloc_string_sub(a_string, "%I",
-                                                     addr + offset);
+                       a_string = realloc_string_sub(
+                               a_string, "%I",
+                               sub_peeraddr[0] ? sub_peeraddr : "0.0.0.0");
                        break;
                }
                case 'i': 
-                       a_string = realloc_string_sub( a_string, "%i",
-                                       client_socket_addr(get_client_fd(), addr, sizeof(addr)) );
+                       a_string = realloc_string_sub(
+                               a_string, "%i",
+                               sub_sockaddr[0] ? sub_sockaddr : "0.0.0.0");
                        break;
                case 'L' : 
-                       if ( StrnCaseCmp(p, "%LOGONSERVER%", strlen("%LOGONSERVER%")) == 0 ) {
+                       if ( strncasecmp_m(p, "%LOGONSERVER%", strlen("%LOGONSERVER%")) == 0 ) {
                                break;
                        }
                        if (local_machine_name && *local_machine_name) {
@@ -631,7 +645,8 @@ char *alloc_sub_basic(const char *smb_name, const char *domain_name,
                        a_string = realloc_string_sub(a_string, "%N", automount_server(smb_name));
                        break;
                case 'M' :
-                       a_string = realloc_string_sub(a_string, "%M", client_name(get_client_fd()));
+                       a_string = realloc_string_sub(a_string, "%M",
+                                                     sub_peername);
                        break;
                case 'R' :
                        a_string = realloc_string_sub(a_string, "%R", remote_proto);
@@ -904,9 +919,9 @@ char *standard_sub_conn(TALLOC_CTX *ctx, connection_struct *conn, const char *st
 {
        return talloc_sub_advanced(ctx,
                                lp_servicename(SNUM(conn)),
-                               conn->server_info->unix_name,
+                               conn->session_info->unix_name,
                                conn->connectpath,
-                               conn->server_info->utok.gid,
+                               conn->session_info->utok.gid,
                                get_smb_user_name(),
                                "",
                                str);