home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / samba-1.9.18p7.tar.gz / samba-1.9.18p7.tar / samba-1.9.18p7 / source / nmbd_logonnames.c < prev    next >
C/C++ Source or Header  |  1998-05-04  |  6KB  |  167 lines

  1. /* 
  2.    Unix SMB/Netbios implementation.
  3.    Version 1.9.
  4.    NBT netbios routines and daemon - version 2
  5.    Copyright (C) Andrew Tridgell 1994-1998
  6.    Copyright (C) Luke Kenneth Casson Leighton 1994-1998
  7.    Copyright (C) Jeremy Allison 1994-1998
  8.    
  9.    This program is free software; you can redistribute it and/or modify
  10.    it under the terms of the GNU General Public License as published by
  11.    the Free Software Foundation; either version 2 of the License, or
  12.    (at your option) any later version.
  13.    
  14.    This program is distributed in the hope that it will be useful,
  15.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.    GNU General Public License for more details.
  18.    
  19.    You should have received a copy of the GNU General Public License
  20.    along with this program; if not, write to the Free Software
  21.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22.    
  23. */
  24.  
  25. #include "includes.h"
  26.  
  27. extern int DEBUGLEVEL;
  28.  
  29. extern pstring scope;
  30. extern pstring myname;
  31. extern fstring myworkgroup;
  32. extern char **my_netbios_names;
  33. extern struct in_addr ipzero;
  34. extern struct in_addr allones_ip;
  35.  
  36. extern uint16 samba_nb_type; /* Samba's NetBIOS type. */
  37.  
  38. /****************************************************************************
  39.   Fail to become a Logon server on a subnet.
  40.   ****************************************************************************/
  41. static void become_logon_server_fail(struct subnet_record *subrec,
  42.                                       struct response_record *rrec,
  43.                                       struct nmb_name *fail_name)
  44. {
  45.   struct work_record *work = find_workgroup_on_subnet(subrec, fail_name->name);
  46.   struct server_record *servrec;
  47.  
  48.   if(!work)
  49.   {
  50.     DEBUG(0,("become_logon_server_fail: Error - cannot find \
  51. workgroup %s on subnet %s\n", fail_name->name, subrec->subnet_name));
  52.     return;
  53.   }
  54.  
  55.   if((servrec = find_server_in_workgroup( work, myname)) == NULL)
  56.   {
  57.     DEBUG(0,("become_logon_server_fail: Error - cannot find server %s \
  58. in workgroup %s on subnet %s\n",
  59.        myname, fail_name->name, subrec->subnet_name));
  60.     work->log_state = LOGON_NONE;
  61.     return;
  62.   }
  63.  
  64.   /* Set the state back to LOGON_NONE. */
  65.   work->log_state = LOGON_NONE;
  66.  
  67.   servrec->serv.type &= ~SV_TYPE_DOMAIN_CTRL;
  68.  
  69.   DEBUG(0,("become_logon_server_fail: Failed to become a domain master for \
  70. workgroup %s on subnet %s. Couldn't register name %s.\n",
  71.        work->work_group, subrec->subnet_name, namestr(fail_name)));
  72.  
  73. }
  74.  
  75. /****************************************************************************
  76.   Become a Logon server on a subnet.
  77.   ****************************************************************************/
  78.  
  79. static void become_logon_server_success(struct subnet_record *subrec,
  80.                                         struct userdata_struct *userdata,
  81.                                         struct nmb_name *registered_name,
  82.                                         uint16 nb_flags,
  83.                                         int ttl, struct in_addr registered_ip)
  84. {
  85.   struct work_record *work = find_workgroup_on_subnet( subrec, registered_name->name);
  86.   struct server_record *servrec;
  87.  
  88.   if(!work)
  89.   {
  90.     DEBUG(0,("become_logon_server_success: Error - cannot find \
  91. workgroup %s on subnet %s\n", registered_name->name, subrec->subnet_name));
  92.     return;
  93.   }
  94.  
  95.   if((servrec = find_server_in_workgroup( work, myname)) == NULL)
  96.   {
  97.     DEBUG(0,("become_logon_server_success: Error - cannot find server %s \
  98. in workgroup %s on subnet %s\n",
  99.        myname, registered_name->name, subrec->subnet_name));
  100.     work->log_state = LOGON_NONE;
  101.     return;
  102.   }
  103.  
  104.   /* Set the state in the workgroup structure. */
  105.   work->log_state = LOGON_SRV; /* Become domain master. */
  106.  
  107.   /* Update our server status. */
  108.   servrec->serv.type |= (SV_TYPE_NT|SV_TYPE_DOMAIN_MEMBER);
  109.   /* To allow Win95 policies to load we need to set type domain
  110.      controller.
  111.    */
  112.   servrec->serv.type |= SV_TYPE_DOMAIN_CTRL;
  113.  
  114.   /* Tell the namelist writer to write out a change. */
  115.   subrec->work_changed = True;
  116.  
  117.   DEBUG(0,("become_logon_server_success: Samba is now a logon server \
  118. for workgroup %s on subnet %s\n", work->work_group, subrec->subnet_name));
  119. }
  120.  
  121. /*******************************************************************
  122.   Become a logon server by attempting to register the WORKGROUP<1c>
  123.   group name.
  124. ******************************************************************/
  125.  
  126. static void become_logon_server(struct subnet_record *subrec,
  127.                                 struct work_record *work)
  128. {
  129.   DEBUG(2,("become_logon_server: Atempting to become logon server for workgroup %s \
  130. on subnet %s\n", work->work_group,subrec->subnet_name));
  131.  
  132.   DEBUG(3,("become_logon_server: go to first stage: register %s<1c> name\n",
  133.           work->work_group));
  134.   work->log_state = LOGON_WAIT;
  135.  
  136.   register_name(subrec, work->work_group,0x1c,samba_nb_type|NB_GROUP,
  137.                 become_logon_server_success,
  138.                 become_logon_server_fail, NULL);
  139. }
  140.  
  141. /*****************************************************************************
  142.   Add the internet group <1c> logon names by unicast and broadcast.
  143.   ****************************************************************************/
  144. void add_logon_names(void)
  145. {
  146.   struct subnet_record *subrec;
  147.  
  148.   for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec))
  149.   {
  150.     struct work_record *work = find_workgroup_on_subnet(subrec, myworkgroup);
  151.  
  152.     if (work && (work->log_state == LOGON_NONE))
  153.     {
  154.       struct nmb_name nmbname;
  155.       make_nmb_name(&nmbname,myworkgroup,0x1c,scope);
  156.  
  157.       if (find_name_on_subnet(subrec, &nmbname, FIND_SELF_NAME) == NULL)
  158.       {
  159.         DEBUG(0,("add_domain_logon_names: At time %s attempting to become \
  160. logon server for workgroup %s on subnet %s\n", timestring(), myworkgroup, 
  161.                   subrec->subnet_name));
  162.         become_logon_server(subrec, work);
  163.       }
  164.     }
  165.   }
  166. }
  167.