Dhcp HostName isn't mandatory.
[reactos.git] / reactos / base / services / dhcp / dhclient.c
index 2e41dd4..39a3de4 100644 (file)
@@ -114,18 +114,23 @@ int              check_arp( struct interface_info *ip, struct client_lease *lp )
 
 time_t scripttime;
 
-/* XXX Added this since it's not in the NDK ;0/ */
-ULONG
-NTAPI
-RtlRandom(
-  IN OUT PULONG  Seed
-  );
-
 /* XXX Implement me */
 int check_arp( struct interface_info *ip, struct client_lease *lp ) {
     return 1;
 }
 
+static VOID CALLBACK
+DispatchMain(DWORD argc, LPTSTR *argv)
+{
+       dispatch();
+}
+
+static SERVICE_TABLE_ENTRY ServiceTable[2] =
+{
+    {TEXT("DHCP"), DispatchMain},
+    {NULL, NULL}
+};
+
 int
 main(int argc, char *argv[])
 {
@@ -177,7 +182,7 @@ main(int argc, char *argv[])
 
         DH_DbgPrint(MID_TRACE,("Going into dispatch()\n"));
 
-       dispatch();
+       StartServiceCtrlDispatcher(ServiceTable);
 
        /* not reached */
        return (0);
@@ -428,7 +433,7 @@ dhcpack(struct packet *packet)
                ip->client->new->rebind = ip->client->new->renewal +
                    ip->client->new->renewal / 2 + ip->client->new->renewal / 4;
 
-#ifdef _REACTOS_
+#ifdef __REACTOS__
        ip->client->new->obtained = cur_time;
 #endif
        ip->client->new->expiry += cur_time;
@@ -445,9 +450,17 @@ dhcpack(struct packet *packet)
        bind_lease(ip);
 }
 
-void set_name_servers( struct client_lease *new_lease ) {
+void set_name_servers( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) {
+    CHAR Buffer[200] = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
+    HKEY RegKey;
+
+    strcat(Buffer, Adapter->DhclientInfo.name);
+    if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, Buffer, 0, KEY_WRITE, &RegKey ) != ERROR_SUCCESS)
+        return;
+
+
     if( new_lease->options[DHO_DOMAIN_NAME_SERVERS].len ) {
-        HKEY RegKey;
+
         struct iaddr nameserver;
         char *nsbuf;
         int i, addrs =
@@ -456,12 +469,9 @@ void set_name_servers( struct client_lease *new_lease ) {
                /* XXX I'm setting addrs to 1 until we are ready up the chain */
                addrs = 1;
         nsbuf = malloc( addrs * sizeof(IP_ADDRESS_STRING) );
-        nsbuf[0] = 0;
 
-        if( nsbuf && !RegOpenKeyEx
-            ( HKEY_LOCAL_MACHINE,
-              "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
-              0, KEY_WRITE, &RegKey ) ) {
+        if( nsbuf) {
+            nsbuf[0] = 0;
             for( i = 0; i < addrs; i++ ) {
                 nameserver.len = sizeof(ULONG);
                 memcpy( nameserver.iabuf,
@@ -471,23 +481,32 @@ void set_name_servers( struct client_lease *new_lease ) {
                 if( i != addrs-1 ) strcat( nsbuf, "," );
             }
 
-            DH_DbgPrint(MID_TRACE,("Setting Nameservers: %s\n", nsbuf));
+            DH_DbgPrint(MID_TRACE,("Setting DhcpNameserver: %s\n", nsbuf));
 
-            /* XXX Fixme: I think this may be wrong and that we might have
-             * a problem somewhere else (in iphlpapi for example).
-             *
-             * Recheck the +1 below.
-             */
-            RegSetValueEx( RegKey, "NameServer", 0, REG_SZ,
+            RegSetValueExA( RegKey, "DhcpNameServer", 0, REG_SZ,
                            (LPBYTE)nsbuf, strlen(nsbuf) + 1 );
-
             free( nsbuf );
         }
+
+    } else {
+            RegDeleteValueW( RegKey, L"DhcpNameServer" );
     }
+
+    RegCloseKey( RegKey );
+
 }
 
 void setup_adapter( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) {
+    CHAR Buffer[200] = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
     struct iaddr netmask;
+    HKEY hkey;
+    int i;
+    DWORD dwEnableDHCP;
+
+    strcat(Buffer, Adapter->DhclientInfo.name);
+    if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, Buffer, 0, KEY_WRITE, &hkey) != ERROR_SUCCESS)
+        hkey = NULL;
+
 
     if( Adapter->NteContext )
         DeleteIPAddress( Adapter->NteContext );
@@ -499,13 +518,27 @@ void setup_adapter( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) {
         memcpy( netmask.iabuf,
                 new_lease->options[DHO_SUBNET_MASK].data,
                 new_lease->options[DHO_SUBNET_MASK].len );
-
         Status = AddIPAddress
             ( *((ULONG*)new_lease->address.iabuf),
               *((ULONG*)netmask.iabuf),
               Adapter->IfMib.dwIndex,
               &Adapter->NteContext,
               &Adapter->NteInstance );
+        if (hkey) {
+            RegSetValueExA(hkey, "DhcpIPAddress", 0, REG_SZ, (LPBYTE)piaddr(new_lease->address), strlen(piaddr(new_lease->address))+1);
+            Buffer[0] = '\0';
+            for(i = 0; i < new_lease->options[DHO_SUBNET_MASK].len; i++)
+            {
+                sprintf(&Buffer[strlen(Buffer)], "%u", new_lease->options[DHO_SUBNET_MASK].data[i]);
+                if (i + 1 < new_lease->options[DHO_SUBNET_MASK].len)
+                    strcat(Buffer, ".");
+            }
+            RegSetValueExA(hkey, "DhcpSubnetMask", 0, REG_SZ, (LPBYTE)Buffer, strlen(Buffer)+1);
+            RegSetValueExA(hkey, "IPAddress", 0, REG_SZ, (LPBYTE)"0.0.0.0", 8);
+            RegSetValueExA(hkey, "SubnetMask", 0, REG_SZ, (LPBYTE)"0.0.0.0", 8);
+            dwEnableDHCP = 1;
+            RegSetValueExA(hkey, "EnableDHCP", 0, REG_DWORD, (LPBYTE)&dwEnableDHCP, sizeof(DWORD));
+        }
 
         if( !NT_SUCCESS(Status) )
             warning("AddIPAddress: %lx\n", Status);
@@ -534,7 +567,22 @@ void setup_adapter( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) {
             warning("CreateIpForwardEntry: %lx\n", Status);
         else
             old_default_route = RouterMib.dwForwardNextHop;
+
+        if (hkey) {
+            Buffer[0] = '\0';
+            for(i = 0; i < new_lease->options[DHO_ROUTERS].len; i++)
+            {
+                sprintf(&Buffer[strlen(Buffer)], "%u", new_lease->options[DHO_ROUTERS].data[i]);
+                if (i + 1 < new_lease->options[DHO_ROUTERS].len)
+                    strcat(Buffer, ".");
+            }
+            RegSetValueExA(hkey, "DhcpDefaultGateway", 0, REG_SZ, (LPBYTE)Buffer, strlen(Buffer)+1);
+            RegSetValueExA(hkey, "DefaultGateway", 0, REG_SZ, (LPBYTE)"0.0.0.0", 8);
+        }
     }
+
+    if (hkey)
+        RegCloseKey(hkey);
 }
 
 
@@ -558,7 +606,7 @@ bind_lease(struct interface_info *ip)
 
     note("bound to %s -- renewal in %ld seconds.",
          piaddr(ip->client->active->address),
-         ip->client->active->renewal - cur_time);
+         (long int)(ip->client->active->renewal - cur_time));
 
     ip->client->state = S_BOUND;
 
@@ -567,7 +615,7 @@ bind_lease(struct interface_info *ip)
     if( Adapter )  setup_adapter( Adapter, new_lease );
     else warning("Could not find adapter for info %p\n", ip);
 
-    set_name_servers( new_lease );
+    set_name_servers( Adapter, new_lease );
 
     reinitialize_interfaces();
 }
@@ -820,7 +868,7 @@ packet_to_lease(struct packet *packet)
 
        lease->address.len = sizeof(packet->raw->yiaddr);
        memcpy(lease->address.iabuf, &packet->raw->yiaddr, lease->address.len);
-#ifdef _REACTOS_
+#ifdef __REACTOS__
        lease->serveraddress.len = sizeof(packet->raw->siaddr);
        memcpy(lease->serveraddress.iabuf, &packet->raw->siaddr, lease->address.len);
 #endif
@@ -987,7 +1035,7 @@ send_discover(void *ipp)
 
        note("DHCPDISCOVER on %s to %s port %d interval %ld",
            ip->name, inet_ntoa(sockaddr_broadcast.sin_addr),
-           ntohs(sockaddr_broadcast.sin_port), ip->client->interval);
+           ntohs(sockaddr_broadcast.sin_port), (long int)ip->client->interval);
 
        /* Send out a packet. */
        (void)send_packet(ip, &ip->client->packet, ip->client->packet_length,
@@ -1040,8 +1088,8 @@ state_panic(void *ipp)
                             ip->client->active->renewal) {
                             ip->client->state = S_BOUND;
                             note("bound: renewal in %ld seconds.",
-                                 ip->client->active->renewal -
-                                 cur_time);
+                                 (long int)(ip->client->active->renewal -
+                                 cur_time));
                             add_timeout(
                                 ip->client->active->renewal,
                                 state_bound, ip);
@@ -1515,7 +1563,7 @@ rewrite_client_leases(void)
        if (!leaseFile) {
                leaseFile = fopen(path_dhclient_db, "w");
                if (!leaseFile)
-                       error("can't create %s: %m", path_dhclient_db);
+                       error("can't create %s: %s", path_dhclient_db, strerror(errno));
        } else {
                fflush(leaseFile);
                rewind(leaseFile);
@@ -1552,7 +1600,7 @@ write_client_lease(struct interface_info *ip, struct client_lease *lease,
        if (!leaseFile) {       /* XXX */
                leaseFile = fopen(path_dhclient_db, "w");
                if (!leaseFile)
-                       error("can't create %s: %m", path_dhclient_db);
+                       error("can't create %s: %s", path_dhclient_db, strerror(errno));
        }
 
        fprintf(leaseFile, "lease {\n");
@@ -1607,7 +1655,7 @@ script_init(char *reason, struct string_list *medium)
            sizeof(size_t) + strlen(reason);
 
        if ((buf = buf_open(hdr.len)) == NULL)
-               error("buf_open: %m");
+               error("buf_open: %s", strerror(errno));
 
        errs = 0;
        errs += buf_add(buf, &hdr, sizeof(hdr));
@@ -1619,10 +1667,10 @@ script_init(char *reason, struct string_list *medium)
        errs += buf_add(buf, reason, len);
 
        if (errs)
-               error("buf_add: %m");
+               error("buf_add: %s", strerror(errno));
 
        if (buf_close(privfd, buf) == -1)
-               error("buf_close: %m");
+               error("buf_close: %s", strerror(errno));
 }
 
 void
@@ -1706,7 +1754,7 @@ supersede:
                                        len = ip->client->
                                            config->defaults[i].len +
                                            lease->options[i].len;
-                                       if (len > sizeof(dbuf)) {
+                                       if (len >= sizeof(dbuf)) {
                                                warning("no space to %s %s",
                                                    "prepend option",
                                                    dhcp_options[i].name);
@@ -1727,7 +1775,7 @@ supersede:
                                case ACTION_APPEND:
                                        len = ip->client->
                                            config->defaults[i].len +
-                                           lease->options[i].len;
+                                           lease->options[i].len + 1;
                                        if (len > sizeof(dbuf)) {
                                                warning("no space to %s %s",
                                                    "append option",
@@ -1800,7 +1848,7 @@ script_write_params(char *prefix, struct client_lease *lease)
        scripttime = time(NULL);
 
        if ((buf = buf_open(hdr.len)) == NULL)
-               error("buf_open: %m");
+               error("buf_open: %s", strerror(errno));
 
        errs = 0;
        errs += buf_add(buf, &hdr, sizeof(hdr));
@@ -1820,10 +1868,10 @@ script_write_params(char *prefix, struct client_lease *lease)
        }
 
        if (errs)
-               error("buf_add: %m");
+               error("buf_add: %s", strerror(errno));
 
        if (buf_close(privfd, buf) == -1)
-               error("buf_close: %m");
+               error("buf_close: %s", strerror(errno));
 }
 
 int
@@ -1913,11 +1961,9 @@ check_option(struct client_lease *l, int option)
        case DHO_HOST_NAME:
        case DHO_DOMAIN_NAME:
        case DHO_NIS_DOMAIN:
-               if (!res_hnok(sbuf)) {
+               if (!res_hnok(sbuf))
                        warning("Bogus Host Name option %d: %s (%s)", option,
                            sbuf, opbuf);
-                       return (0);
-               }
                return (1);
        case DHO_PAD:
        case DHO_TIME_OFFSET:
@@ -2032,7 +2078,7 @@ option_as_string(unsigned int code, unsigned char *data, int len)
        for (; dp < data + len; dp++) {
                if (!isascii(*dp) || !isprint(*dp)) {
                        if (dp + 1 != data + len || *dp != 0) {
-                               snprintf(op, opleft, "\\%03o", *dp);
+                               _snprintf(op, opleft, "\\%03o", *dp);
                                op += 4;
                                opleft -= 4;
                        }