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[])
{
DH_DbgPrint(MID_TRACE,("Going into dispatch()\n"));
- dispatch();
+ StartServiceCtrlDispatcher(ServiceTable);
/* not reached */
return (0);
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;
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 =
/* 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,
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 );
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);
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);
}
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;
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();
}
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
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,
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);
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);
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");
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));
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
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);
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",
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));
}
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
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:
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;
}