void set_local_machine_name(const char* local_name, BOOL perm) { static BOOL already_perm = False; fstring tmp_local_machine; fstrcpy(tmp_local_machine,local_name); 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") ) { fstrcpy( local_machine, client_socket_addr() ); return; } if (already_perm) return; already_perm = perm; alpha_strcpy(local_machine,tmp_local_machine,SAFE_NETBIOS_CHARS,sizeof(local_machine)-1); strlower_m(local_machine); }
void standard_sub_basic(const char *smb_name, char *str,size_t len) { char *p, *s; fstring pidstr; struct passwd *pass; const char *local_machine_name = get_local_machine_name(); for (s=str; (p=strchr_m(s, '%'));s=p) { fstring tmp_str; int l = (int)len - (int)(p-str); if (l < 0) l = 0; switch (*(p+1)) { case 'U' : fstrcpy(tmp_str, smb_name); strlower_m(tmp_str); string_sub(p,"%U",tmp_str,l); break; case 'G' : fstrcpy(tmp_str, smb_name); if ((pass = Get_Pwnam(tmp_str))!=NULL) { string_sub(p,"%G",gidtoname(pass->pw_gid),l); } else { p += 2; } break; case 'D' : fstrcpy(tmp_str, current_user_info.domain); strupper_m(tmp_str); string_sub(p,"%D", tmp_str,l); break; 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); else { pstring temp_name; pstrcpy(temp_name, global_myname()); strlower_m(temp_name); string_sub(p,"%L", temp_name,l); } break; case 'M' : string_sub(p,"%M", client_name(),l); break; case 'R' : string_sub(p,"%R", remote_proto,l); break; case 'T' : string_sub(p,"%T", timestring(False),l); break; case 'a' : string_sub(p,"%a", remote_arch,l); break; case 'd' : slprintf(pidstr,sizeof(pidstr)-1, "%d",(int)sys_getpid()); string_sub(p,"%d", pidstr,l); break; case 'h' : string_sub(p,"%h", myhostname(),l); break; case 'm' : string_sub(p,"%m", get_remote_machine_name(),l); break; case 'v' : string_sub(p,"%v", SAMBA_VERSION_STRING,l); break; case '$' : p += expand_env_var(p,l); break; /* Expand environment variables */ case '\0': p++; break; /* don't run off the end of the string */ default: p+=2; break; } } }
char *alloc_sub_basic(const char *smb_name, const char *str) { char *b, *p, *s, *r, *a_string; fstring pidstr; struct passwd *pass; const char *local_machine_name = get_local_machine_name(); /* workaround to prevent a crash while looking at bug #687 */ if (!str) { DEBUG(0,("alloc_sub_basic: NULL source string! This should not happen\n")); return NULL; } a_string = SMB_STRDUP(str); if (a_string == NULL) { DEBUG(0, ("alloc_sub_specified: Out of memory!\n")); return NULL; } for (b = s = a_string; (p = strchr_m(s, '%')); s = a_string + (p - b)) { r = NULL; b = a_string; switch (*(p+1)) { case 'U' : r = strdup_lower(smb_name); if (r == NULL) { goto error; } a_string = realloc_string_sub(a_string, "%U", r); break; case 'G' : r = SMB_STRDUP(smb_name); if (r == NULL) { goto error; } if ((pass = Get_Pwnam(r))!=NULL) { a_string = realloc_string_sub(a_string, "%G", gidtoname(pass->pw_gid)); } break; case 'D' : r = strdup_upper(current_user_info.domain); if (r == NULL) { goto error; } a_string = realloc_string_sub(a_string, "%D", r); break; case 'I' : a_string = realloc_string_sub(a_string, "%I", client_addr()); break; case 'i': a_string = realloc_string_sub( a_string, "%i", client_socket_addr() ); break; case 'L' : if ( StrnCaseCmp(p, "%LOGONSERVER%", strlen("%LOGONSERVER%")) == 0 ) { break; } if (local_machine_name && *local_machine_name) { a_string = realloc_string_sub(a_string, "%L", local_machine_name); } else { a_string = realloc_string_sub(a_string, "%L", global_myname()); } break; case 'N': 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()); break; case 'R' : a_string = realloc_string_sub(a_string, "%R", remote_proto); break; case 'T' : a_string = realloc_string_sub(a_string, "%T", timestring(False)); break; case 'a' : a_string = realloc_string_sub(a_string, "%a", remote_arch); break; case 'd' : slprintf(pidstr,sizeof(pidstr)-1, "%d",(int)sys_getpid()); a_string = realloc_string_sub(a_string, "%d", pidstr); break; case 'h' : a_string = realloc_string_sub(a_string, "%h", myhostname()); break; case 'm' : a_string = realloc_string_sub(a_string, "%m", remote_machine); break; case 'v' : a_string = realloc_string_sub(a_string, "%v", SAMBA_VERSION_STRING); break; case 'w' : a_string = realloc_string_sub(a_string, "%w", lp_winbind_separator()); break; case '$' : a_string = realloc_expand_env_var(a_string, p); /* Expand environment variables */ break; case '(': a_string = realloc_expand_longvar( a_string, p ); break; default: break; } p++; SAFE_FREE(r); if ( !a_string ) { return NULL; } } return a_string; error: SAFE_FREE(a_string); return NULL; }