a pointless commit to check on a problem Luke reported with CVS
[kai/samba.git] / source3 / lib / util.c
index 5af41cc06cd625fc7d666bddedb057cee257afd9..306e80c3073cf64b3d9e79fbba99c42ba7b0fa24 100644 (file)
@@ -93,9 +93,9 @@ static BOOL stdout_logging = False;
 static char *filename_dos(char *path,char *buf);
 
 #if defined(SIGUSR2)
-/**************************************************************************** **
+/******************************************************************************
  catch a sigusr2 - decrease the debug log level.
- **************************************************************************** */
+ *****************************************************************************/
 int sig_usr2(void)
 {  
   BlockSignals( True, SIGUSR2);
@@ -3106,7 +3106,7 @@ void become_daemon(void)
 {
 #ifndef NO_FORK_DEBUG
   if (fork())
-    exit(0);
+    _exit(0);
 
   /* detach from the terminal */
 #ifdef USE_SETSID
@@ -3716,73 +3716,81 @@ void reset_globals_after_fork()
 /*******************************************************************
  return the DNS name of the client 
  ******************************************************************/
-char *client_name(void)
-{
-  struct sockaddr sa;
-  struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
-  int     length = sizeof(sa);
-  static pstring name_buf;
-  struct hostent *hp;
-
-  if (global_client_name_done) 
-    return name_buf;
-
-  strcpy(name_buf,"UNKNOWN");
-
-  if (Client == -1) {
-         return name_buf;
-  }
-
-  if (getpeername(Client, &sa, &length) < 0) {
-    DEBUG(0,("getpeername failed\n"));
-    return name_buf;
-  }
-
-  /* Look up the remote host name. */
-  if ((hp = gethostbyaddr((char *) &sockin->sin_addr,
-                         sizeof(sockin->sin_addr),
-                         AF_INET)) == 0) {
-    DEBUG(1,("Gethostbyaddr failed for %s\n",client_addr()));
-    StrnCpy(name_buf,client_addr(),sizeof(name_buf) - 1);
-  } else {
-    StrnCpy(name_buf,(char *)hp->h_name,sizeof(name_buf) - 1);
-    if (!matchname(name_buf, sockin->sin_addr)) {
-      DEBUG(0,("Matchname failed on %s %s\n",name_buf,client_addr()));
-      strcpy(name_buf,"UNKNOWN");
-    }
-  }
-  global_client_name_done = True;
-  return name_buf;
+char *client_name(int fd)
+{
+       struct sockaddr sa;
+       struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
+       int     length = sizeof(sa);
+       static pstring name_buf;
+       struct hostent *hp;
+       static int last_fd=-1;
+       
+       if (global_client_name_done && last_fd == fd) 
+               return name_buf;
+       
+       last_fd = fd;
+       global_client_name_done = False;
+       
+       strcpy(name_buf,"UNKNOWN");
+       
+       if (fd == -1) {
+               return name_buf;
+       }
+       
+       if (getpeername(fd, &sa, &length) < 0) {
+               DEBUG(0,("getpeername failed\n"));
+               return name_buf;
+       }
+       
+       /* Look up the remote host name. */
+       if ((hp = gethostbyaddr((char *) &sockin->sin_addr,
+                               sizeof(sockin->sin_addr),
+                               AF_INET)) == 0) {
+               DEBUG(1,("Gethostbyaddr failed for %s\n",client_addr(fd)));
+               StrnCpy(name_buf,client_addr(fd),sizeof(name_buf) - 1);
+       } else {
+               StrnCpy(name_buf,(char *)hp->h_name,sizeof(name_buf) - 1);
+               if (!matchname(name_buf, sockin->sin_addr)) {
+                       DEBUG(0,("Matchname failed on %s %s\n",name_buf,client_addr(fd)));
+                       strcpy(name_buf,"UNKNOWN");
+               }
+       }
+       global_client_name_done = True;
+       return name_buf;
 }
 
 /*******************************************************************
  return the IP addr of the client as a string 
  ******************************************************************/
-char *client_addr(void)
+char *client_addr(int fd)
 {
-  struct sockaddr sa;
-  struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
-  int     length = sizeof(sa);
-  static fstring addr_buf;
-
-  if (global_client_addr_done) 
-    return addr_buf;
-
-  strcpy(addr_buf,"0.0.0.0");
+       struct sockaddr sa;
+       struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
+       int     length = sizeof(sa);
+       static fstring addr_buf;
+       static int last_fd = -1;
 
-  if (Client == -1) {
-         return addr_buf;
-  }
+       if (global_client_addr_done && fd == last_fd) 
+               return addr_buf;
 
-  if (getpeername(Client, &sa, &length) < 0) {
-    DEBUG(0,("getpeername failed\n"));
-    return addr_buf;
-  }
+       last_fd = fd;
+       global_client_addr_done = False;
 
-  fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
+       strcpy(addr_buf,"0.0.0.0");
 
-  global_client_addr_done = True;
-  return addr_buf;
+       if (fd == -1) {
+               return addr_buf;
+       }
+       
+       if (getpeername(fd, &sa, &length) < 0) {
+               DEBUG(0,("getpeername failed\n"));
+               return addr_buf;
+       }
+       
+       fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
+       
+       global_client_addr_done = True;
+       return addr_buf;
 }
 
 /*******************************************************************
@@ -3946,9 +3954,9 @@ void standard_sub_basic(char *str)
                                break;
                        }
                        case 'N' : string_sub(p,"%N", automount_server(username)); break;
-                       case 'I' : string_sub(p,"%I", client_addr()); break;
+                       case 'I' : string_sub(p,"%I", client_addr(Client)); break;
                        case 'L' : string_sub(p,"%L", local_machine); break;
-                       case 'M' : string_sub(p,"%M", client_name()); break;
+                       case 'M' : string_sub(p,"%M", client_name(Client)); break;
                        case 'R' : string_sub(p,"%R", remote_proto); break;
                        case 'T' : string_sub(p,"%T", timestring()); break;
                        case 'U' : string_sub(p,"%U", username); break;
@@ -4047,11 +4055,20 @@ struct hostent *Get_Hostbyname(char *name)
       exit(0);
     }
 
+   
+  /* 
+   * This next test is redundent and causes some systems (with
+   * broken isalnum() calls) problems.
+   * JRA.
+   */
+
+#if 0
   if (!isalnum(*name2))
     {
       free(name2);
       return(NULL);
     }
+#endif /* 0 */
 
   ret = sys_gethostbyname(name2);
   if (ret != NULL)
@@ -4848,4 +4865,29 @@ char *tab_depth(int depth)
        return spaces;
 }
 
+/*****************************************************************
+ Convert a domain SID to an ascii string. (non-reentrant).
+*****************************************************************/
+
+/* BIG NOTE: this function only does SIDS where the identauth is not >= 2^32 */
+char *dom_sid_to_string(DOM_SID *sid)
+{
+  static pstring sidstr;
+  char subauth[16];
+  int i;
+  uint32 ia = (sid->id_auth[5]) +
+              (sid->id_auth[4] << 8 ) +
+              (sid->id_auth[3] << 16) +
+              (sid->id_auth[2] << 24);
 
+  sprintf(sidstr, "S-%d-%d", sid->sid_rev_num, ia);
+
+  for (i = 0; i < sid->num_auths; i++)
+  {
+    sprintf(subauth, "-%d", sid->sub_auths[i]);
+    strcat(sidstr, subauth);
+  }
+
+  DEBUG(7,("dom_sid_to_string returning %s\n", sidstr));
+  return sidstr;
+}