//Completely renumbers and rewrites the lease list from current membory. void ReorderLeases() { int i; AsyncSaveKey (TFTPD32_DHCP_KEY, KEY_LEASE_NUMLEASES, & nAllocatedIP, sizeof(nAllocatedIP), REG_DWORD, szTftpd32IniFile); for(i = 0; i < nAllocatedIP; ++i) { char key [_MAX_PATH]; char* macaddr = haddrtoa(tFirstIP[i]->sMacAddr, 6, ':'); char* addr = inet_ntoa(tFirstIP[i]->dwIP); char* alloc = timetoa(tFirstIP[i]->tAllocated); char* renew = timetoa(tFirstIP[i]->tRenewed); tFirstIP[i]->dwAllocNum = i; if (sSettings.bPersLeases) { sprintf(key, "%s%d%s", KEY_LEASE_PREFIX, i, KEY_LEASE_MAC); SaveKey(TFTPD32_DHCP_KEY, key, macaddr, strlen(macaddr) + 1, REG_SZ, szTftpd32IniFile); sprintf(key, "%s%d%s", KEY_LEASE_PREFIX, i, KEY_LEASE_IP); SaveKey(TFTPD32_DHCP_KEY, key, addr, strlen(addr) + 1, REG_SZ, szTftpd32IniFile); sprintf(key, "%s%d%s", KEY_LEASE_PREFIX, i, KEY_LEASE_ALLOC); SaveKey(TFTPD32_DHCP_KEY, key, alloc, strlen(alloc) + 1, REG_SZ, szTftpd32IniFile); sprintf(key, "%s%d%s", KEY_LEASE_PREFIX, i, KEY_LEASE_RENEW); AsyncSaveKey(TFTPD32_DHCP_KEY, key, renew, strlen(renew) + 1, REG_SZ, szTftpd32IniFile); } } }
// Save configuration either in INI file (if it exists) or in registry int DHCPSaveConfig ( const struct S_DHCP_Param *pNewParamDHCP ) { INT Ark; char szBuf[64]; // allocate new array, but keep pointers if ( sParamDHCP.nPoolSize!=pNewParamDHCP->nPoolSize ) { tFirstIP = realloc (tFirstIP, sizeof (tFirstIP[0]) * pNewParamDHCP->nPoolSize); tMAC = realloc (tMAC, sizeof (tMAC[0]) * pNewParamDHCP->nPoolSize); // do not complain if pool is empty if (pNewParamDHCP->nPoolSize!=0 && (tFirstIP==NULL || tMAC==NULL) ) { SVC_ERROR ("Can not allocate memory"); return FALSE; } } nAllocatedIP = min (nAllocatedIP, pNewParamDHCP->nPoolSize); sParamDHCP = *pNewParamDHCP; for (Ark=0 ; Ark<SizeOfTab (tDHCPd32Entry) ; Ark++) AsyncSaveKey ( TFTPD32_DHCP_KEY, tDHCPd32Entry [Ark].szEntry, tDHCPd32Entry [Ark].pValue, tDHCPd32Entry [Ark].nBufSize, tDHCPd32Entry [Ark].nType, szTftpd32IniFile ); // custom items for (Ark=0 ; Ark < SizeOfTab (sParamDHCP.t) ; Ark++) { wsprintf (szBuf, "%s%d", KEY_DHCP_USER_OPTION_NB, Ark+1); AsyncSaveKey (TFTPD32_DHCP_KEY, szBuf, & sParamDHCP.t[Ark].nAddOption, sizeof sParamDHCP.t[Ark].nAddOption, REG_DWORD, szTftpd32IniFile); wsprintf (szBuf, "%s%d", KEY_DHCP_USER_OPTION_VALUE, Ark+1); AsyncSaveKey (TFTPD32_DHCP_KEY, szBuf, sParamDHCP.t[Ark].szAddOption, sizeof sParamDHCP.t[Ark].szAddOption, REG_SZ, szTftpd32IniFile); } return TRUE; } // DHCPSaveConfig
//Zero tRenewed void ZeroRenewTime(struct LL_IP* pCur) { char* t; char key [_MAX_PATH]; sprintf(key, "%s%d%s", KEY_LEASE_PREFIX, pCur->dwAllocNum, KEY_LEASE_RENEW); pCur->tRenewed = 0; t = timetoa(pCur->tRenewed); if (sSettings.bPersLeases) AsyncSaveKey(TFTPD32_DHCP_KEY, key, t, strlen(t) + 1, REG_SZ, szTftpd32IniFile); }
//Set the MAC address to all zeros void ZeroMacAddr(struct LL_IP* pCur) { char key [_MAX_PATH]; char* macaddr; sprintf(key, "%s%d%s", KEY_LEASE_PREFIX, pCur->dwAllocNum, KEY_LEASE_MAC); memset(pCur->sMacAddr, 0, sizeof pCur->sMacAddr); macaddr = haddrtoa(pCur->sMacAddr, 6, ':'); if (sSettings.bPersLeases) AsyncSaveKey(TFTPD32_DHCP_KEY, key, macaddr, strlen(macaddr), REG_SZ, szTftpd32IniFile); }
///////////////////////////////////////////////////////// // Save Settings into ini file/registry ///////////////////////////////////////////////////////// BOOL Tftpd32SaveSettings (void) { int Ark, Rc; for (Ark=0, Rc=TRUE ; Rc && Ark< SizeOfTab (tTftpd32Entry) ; Ark++) Rc = AsyncSaveKey ( TFTPD32_MAIN_KEY, tTftpd32Entry[Ark].szEntry, tTftpd32Entry[Ark].pValue, tTftpd32Entry[Ark].nBufSize, tTftpd32Entry[Ark].nType, szTftpd32IniFile ); if (! Rc) REG_ERROR(); return Rc; } // Tftpd32SaveSettings
//Set the number of allocated entries explicitly void SetNumAllocated(int n) { nAllocatedIP = n; if (sSettings.bPersLeases) AsyncSaveKey(TFTPD32_DHCP_KEY, KEY_LEASE_NUMLEASES, &nAllocatedIP, sizeof(nAllocatedIP), REG_DWORD, szTftpd32IniFile); }