www.pudn.com > DynDNS95.zip > Dyndns95.c


/* TO DO:								*/ 
/*		Randomize local connection port	*/ 
 
#include     
#include     
#include  
#include  
#include  
#include  
#include  
#include "resource.h" 
#include "DynDNS95.h" 
 
#define REMOTEPORT 50 
#define REMOTEHOST "master.dyndns.com" 
 
#define NAME "DYNDNS.COM Win95/NT Client BETA" 
#define VERSION "4.95-client-a" 
#define AUTHOR "Gus Hurwitz" 
#define CONTACT "ghurwitz@dyndns.com" 
 
#define RegDynDNSKey "Software\\DynDNS2000" 
 
#define DUMMYPORT 2454  // This should be changed to something random 
 
NOTIFYICONDATA tnid; 
HINSTANCE gInstance; 
HWND mDlg; 
SOCKET s_internal_connect; 
SOCKET s_internal_bind; 
SOCKET s_dyndns; 
 
int hidden=0; 
int update=0; 
int WSAStarted=0; 
int AccountStatus=0; 
int RunningUpdate=0; 
int DEBUG2=0; 
 
DWORD i; 
 
char uname[64], passwd[64], domain[64], IP[20], MBuf[8192], MRec[2048], *RBuf; 
char fulldomain[64]; 
char scratchpad[64], bigpad[1024]; 
static DWORD ToUpdate, IPCheckDelay, SinceUpdate, RetryDelay; 
 
int UpdateIP(HWND, char *, char *, char *, char *); 
char FAR *Name2Addr(char *); 
int IPCurrent(HWND); 
BOOL CALLBACK DynDNSProc(HWND, UINT, WPARAM, LPARAM); 
BOOL CALLBACK DynDNSSetupProc(HWND, UINT, WPARAM, LPARAM); 
BOOL MySetDlgItemText(HWND, int, LPCTSTR, BOOL); 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    MSG msg; 
    HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(SmallIcon)); 
	gInstance=hInstance; 
 
	IP  [0] = '\0'; 
    memset(MBuf, 0, 8192); 
    memset(MRec, 0, 2048); 
 
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.uID = 3265; 
    tnid.hWnd = NULL; 
    tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
    tnid.uCallbackMessage = WM_NOTIFYICON; 
    tnid.hIcon = hIcon; 
    strcpy(tnid.szTip, "DynDNS.com Updater");   
 
	tnid.hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DynDNS), NULL, DynDNSProc); 
	Shell_NotifyIcon(NIM_ADD, &tnid); 
 
    while (GetMessage(&msg, NULL, 0, 0)) 
        { 
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
		} 
    return (msg.wParam); 
} 
 
BOOL CALLBACK DynDNSSetupProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
	HKEY hKey; 
	DWORD cbData; 
	char debug[64]; 
 
	switch(uMsg) 
	{ 
	case WM_INITDIALOG: 
	case WM_CREATE: 
		{ 
		if(RegOpenKeyEx(HKEY_CURRENT_USER, RegDynDNSKey, 0, KEY_QUERY_VALUE,&hKey)!=ERROR_SUCCESS) 
			{ 
			} 
		else 
			{ 
			cbData=64;	RegQueryValueEx(hKey, "domain", NULL, NULL, scratchpad, &cbData);scratchpad[cbData]='\0'; 
			MySetDlgItemText(hDlg, IDC_DOMAIN, scratchpad, 0); 
			cbData=64;	RegQueryValueEx(hKey, "passwd", NULL, NULL, scratchpad, &cbData);scratchpad[cbData]='\0'; 
			MySetDlgItemText(hDlg, IDC_PASSWD, scratchpad, 0); 
			RegCloseKey(hKey); 
			} 
		} 
		break; 
 
	case WM_DESTROY: 
		break; 
 
	case WM_COMMAND: 
		switch(wParam) 
		{ 
		case IDC_OK: 
			if(RegCreateKeyEx(HKEY_CURRENT_USER, RegDynDNSKey, 0, NULL, REG_OPTION_NON_VOLATILE,  
												 KEY_SET_VALUE, NULL, &hKey, &cbData)!=ERROR_SUCCESS) 
				{ 
				MessageBox(hDlg, "Unable to access registry! Quiting.", "Fatal Error", MB_OK); 
				exit(-1); 
				} 
			cbData = GetDlgItemText(hDlg, IDC_PASSWD,passwd, sizeof(scratchpad))+1; 
			RegSetValueEx(hKey, "passwd", 0, REG_SZ, passwd, cbData); 
			cbData = GetDlgItemText(hDlg, IDC_DOMAIN,domain, sizeof(scratchpad))+1; 
			RegSetValueEx(hKey, "domain", 0, REG_SZ, domain, cbData); 
 
			IPCheckDelay=300; 
			RetryDelay=60; 
			RegSetValueEx(hKey,        "uname", 0,    REG_SZ,"postmaster", strlen("postmaster")); 
			RegSetValueEx(hKey,           "IP", 0,    REG_SZ,      "AUTO", strlen("AUTO")); 
			RegSetValueEx(hKey, "IPCheckDelay", 0, REG_DWORD, (LPBYTE)&IPCheckDelay, sizeof(DWORD)); 
			RegSetValueEx(hKey,   "RetryDelay", 0, REG_DWORD,   (LPBYTE)&RetryDelay, sizeof(DWORD)); 
			 
			RegCloseKey(hKey); 
			EndDialog(hDlg, 0); 
			break; 
		case IDC_CANCEL: 
			cbData = GetDlgItemText(hDlg, IDC_DOMAIN,debug, sizeof(scratchpad))+1; 
			if(!strncmp("debug--1", debug, 8)) 
				{ 
				MessageBox(hDlg, MRec, "Debug", MB_OK); 
				} 
			else 
			if(!strncmp("debug--2", debug, 8)) 
				{ 
				DEBUG2=(DEBUG2?0:1); 
				MessageBox(hDlg, "Debug level 2 toggeled", "Debug", MB_OK); 
				} 
			EndDialog(hDlg, 0); 
			break; 
		} 
		break; 
 
	default: 
		return(FALSE); 
		break; 
	} 
	return(TRUE); 
} 
 
BOOL CALLBACK DynDNSProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
	switch(uMsg) 
	{ 
	case WM_INITDIALOG: 
	case WM_CREATE: 
		{ 
			WSADATA WSAdata; 
			HKEY hKey; 
			DWORD cbData; 
 
			if(RegOpenKeyEx(HKEY_CURRENT_USER, RegDynDNSKey, 0, KEY_QUERY_VALUE,&hKey)!=ERROR_SUCCESS) 
				{ 
				DialogBox(gInstance, MAKEINTRESOURCE(IDD_DynDNSSetup), hDlg, DynDNSSetupProc); 
				if(!strncmp("postmaster", uname, 10)) 
					{ 
					sprintf(fulldomain, "%s", domain); 
					} 
				else 
					{ 
					sprintf(fulldomain, "%s.%s", uname, domain); 
					} 
				MySetDlgItemText(hDlg, IDC_STATIC_DOMAIN, fulldomain, 0); 
				MySetDlgItemText(hDlg, IDC_STATIC_IP, IP, 0); 
				MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Setup Complete", 1); 
				if(RegOpenKeyEx(HKEY_CURRENT_USER, RegDynDNSKey, 0, KEY_QUERY_VALUE,&hKey)!=ERROR_SUCCESS) 
					{ 
					MessageBox(hDlg, "Key Creation Failed! Quiting.", "Fatal Error", MB_OK); 
					exit(-1); 
					} 
				} 
 
			cbData=64; RegQueryValueEx(hKey,  "uname", NULL, NULL,  uname, &cbData); 
			cbData=64; RegQueryValueEx(hKey, "passwd", NULL, NULL, passwd, &cbData); 
			cbData=64; RegQueryValueEx(hKey, "domain", NULL, NULL, domain, &cbData); 
			cbData=20; RegQueryValueEx(hKey,     "IP", NULL, NULL,     IP, &cbData); 
			cbData=sizeof(DWORD); RegQueryValueEx(hKey,   "IPCheckDelay", NULL, NULL, (LPBYTE)&IPCheckDelay,   &cbData); 
			cbData=sizeof(DWORD); RegQueryValueEx(hKey,   "RetryDelay", NULL, NULL, (LPBYTE)&RetryDelay,   &cbData); 
			ToUpdate=IPCheckDelay; 
			sprintf(scratchpad, "%.2d:%.2d:%.2d", ToUpdate/3600, ToUpdate/60, ToUpdate%60); 
			MySetDlgItemText(hDlg, IDC_STATIC_ToUpdate, scratchpad, 0); 
			RegCloseKey(hKey); 
 
			MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Initializing...", 1); 
			if(WSAStartup(0x0101, &WSAdata)) 
			{ 
				MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "WSAStartup Error", 1); 
			} 
			else 
			{ 
				WSAStarted=1; 
			} 
			if(!strncmp("postmaster", uname, 10)) 
				{ 
				sprintf(fulldomain, "%s", domain); 
				} 
			else 
				{ 
				sprintf(fulldomain, "%s.%s", uname, domain); 
				} 
			MySetDlgItemText(hDlg, IDC_STATIC_DOMAIN, fulldomain, 0); 
			MySetDlgItemText(hDlg, IDC_STATIC_IP, IP, 0); 
			MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Client Initialized", 1); 
		} 
		SetTimer(hDlg, SecondCount, 1000, NULL); 
		mDlg = hDlg; 
		break; 
 
	case WM_DESTROY: 
		Shell_NotifyIcon(NIM_DELETE, &tnid); 
		WSACleanup(); 
		WSAStarted=0; 
		break; 
 
	case WM_TIMER: 
		switch(wParam) 
		{ 
		case SecondCount: 
			if(!RunningUpdate) 
				{ 
				ToUpdate--; 
				sprintf(scratchpad, "%.2d:%.2d:%.2d", ToUpdate/3600, ToUpdate/60, ToUpdate%60); 
				MySetDlgItemText(hDlg, IDC_STATIC_ToUpdate, scratchpad, 0); 
				} 
			SinceUpdate++; 
			sprintf(scratchpad, "%.2d:%.2d:%.2d", SinceUpdate/3600, SinceUpdate/60, SinceUpdate%60); 
			MySetDlgItemText(hDlg, IDC_STATIC_SinceUpdate, scratchpad, 0); 
 
			if((!ToUpdate) && (!RunningUpdate)) 
				{ 
				MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Checking IP", 1); 
				if(update) 
					{ 
					MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Forced IP Update", 1); 
					if(UpdateIP(hDlg, uname, passwd, domain, IP)) 
						{ 
						ToUpdate=IPCheckDelay; 
						sprintf(scratchpad, "%.2d:%.2d:%.2d", ToUpdate/3600, ToUpdate/60, ToUpdate%60); 
						MySetDlgItemText(hDlg, IDC_STATIC_ToUpdate, scratchpad, 0); 
						SinceUpdate=0; 
						sprintf(scratchpad, "%.2d:%.2d:%.2d", SinceUpdate/3600, SinceUpdate/60, SinceUpdate%60); 
						MySetDlgItemText(hDlg, IDC_STATIC_SinceUpdate, scratchpad, 0); 
						RunningUpdate=0; 
						} 
					else 
						{ 
						ToUpdate=RetryDelay; 
						sprintf(scratchpad, "%.2d:%.2d:%.2d", ToUpdate/3600, ToUpdate/60, ToUpdate%60); 
						MySetDlgItemText(hDlg, IDC_STATIC_ToUpdate, scratchpad, 0); 
						RunningUpdate=0; 
						} 
					} 
				else 
				if(!IPCurrent(hDlg)) 
					{ 
					MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Updating IP", 1); 
					if(UpdateIP(hDlg, uname, passwd, domain, IP)) 
						{ 
						ToUpdate=IPCheckDelay; 
						sprintf(scratchpad, "%.2d:%.2d:%.2d", ToUpdate/3600, ToUpdate/60, ToUpdate%60); 
						MySetDlgItemText(hDlg, IDC_STATIC_ToUpdate, scratchpad, 0); 
						SinceUpdate=0; 
						sprintf(scratchpad, "%.2d:%.2d:%.2d", SinceUpdate/3600, SinceUpdate/60, SinceUpdate%60); 
						MySetDlgItemText(hDlg, IDC_STATIC_SinceUpdate, scratchpad, 0); 
						RunningUpdate=0; 
						} 
					else 
						{ 
						ToUpdate=RetryDelay; 
						sprintf(scratchpad, "%.2d:%.2d:%.2d", ToUpdate/3600, ToUpdate/60, ToUpdate%60); 
						MySetDlgItemText(hDlg, IDC_STATIC_ToUpdate, scratchpad, 0); 
						RunningUpdate=0; 
						} 
					} 
				else 
					{ 
					ToUpdate=IPCheckDelay; 
					sprintf(scratchpad, "%.2d:%.2d:%.2d", ToUpdate/3600, ToUpdate/60, ToUpdate%60); 
					MySetDlgItemText(hDlg, IDC_STATIC_ToUpdate, scratchpad, 0); 
					RunningUpdate=0; 
					} 
				if(!ToUpdate) 
					{ 
					RunningUpdate=1; 
					} 
				} 
		break; 
		} 
		break; 
 
	case WM_COMMAND: 
		switch(wParam) 
		{ 
		case IDC_HIDE: 
			ShowWindow(hDlg, SW_HIDE); 
			hidden=0; 
			break; 
		case IDC_SETUP: 
			DialogBox(gInstance, MAKEINTRESOURCE(IDD_DynDNSSetup), hDlg, DynDNSSetupProc); 
			if(!strncmp("postmaster", uname, 10)) 
				{ 
				sprintf(fulldomain, "%s", domain); 
				} 
			else 
				{ 
				sprintf(fulldomain, "%s.%s", uname, domain); 
				} 
			MySetDlgItemText(hDlg, IDC_STATIC_DOMAIN, fulldomain, 0); 
			MySetDlgItemText(hDlg, IDC_STATIC_IP, IP, 0); 
			MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Setup Complete", 1); 
			break; 
		case IDC_UPDATE: 
			ToUpdate=1; 
			update=1; 
			break; 
		case IDC_QUIT: 
			closesocket(s_dyndns); 
			closesocket(s_internal_connect); 
			closesocket(s_internal_bind); 
			WSACleanup(); 
			Shell_NotifyIcon(NIM_DELETE, &tnid); 
			exit(0); 
			break; 
		case IDC_INFO: 
			sprintf(bigpad, "DYNDNS.COM IP Updater Version %s\n\nCopyright 2000 DYNDNS.COM\n\nRunning Dot50 Protocol\nConfiguration Stored in Registry (Software\\DynDNS2000)\n\nReport bugs to %s\n", VERSION, CONTACT); 
			MessageBox(hDlg, bigpad, "DYNDNS.COM IP Updater", MB_OK); 
			break; 
		} 
		break; 
 
	case WM_NOTIFYICON: 
		switch(lParam) 
		{ 
		case WM_LBUTTONDBLCLK: 
			hidden = 1; 
			ShowWindow(hDlg, SW_SHOW); 
			SetForegroundWindow(mDlg); 
			break; 
		} 
		break; 
 
	default: 
		return(FALSE); 
		break; 
	} 
	return(TRUE); 
} 
 
 
char FAR *Name2Addr(char *nm) 
{ 
LPHOSTENT lphe; 
char FAR *IAD; 
 
if(!(lphe = gethostbyname(nm))) 
	{ 
	return NULL; 
	} 
IAD = inet_ntoa(*(LPIN_ADDR)*(lphe->h_addr_list)); 
return(IAD); 
} 
 
int IPCurrent(HWND hDlg) 
{ 
SOCKADDR_IN in_sin, out_sin; 
	 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Creating bind() socket", 1); 
	if((s_internal_bind=socket(AF_INET, SOCK_STREAM,0)) == INVALID_SOCKET) 
		{ 
/**/    sprintf(scratchpad, "Can't create bind() socket (%d)", WSAGetLastError()); 
		MySetDlgItemText(hDlg, IDC_STATIC_STATUS, scratchpad, 1); 
		return 0; 
		} 
 
	in_sin.sin_family = AF_INET; 
 	in_sin.sin_addr.s_addr=INADDR_ANY; 
	in_sin.sin_port=htons(DUMMYPORT); 
 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Binding bind() socket", 1); 
	if(bind(s_internal_bind, (struct sockaddr FAR*) &in_sin, sizeof(in_sin)) == SOCKET_ERROR) 
		{ 
/**/    sprintf(scratchpad, "Can't bind() socket (%d)", WSAGetLastError()); 
		MySetDlgItemText(hDlg, IDC_STATIC_STATUS, scratchpad, 1); 
		return 0; 
		} 
 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Listening to bind() socket", 1); 
	if(listen(s_internal_bind, 1) == SOCKET_ERROR) 
		{ 
/**/    sprintf(scratchpad, "Can't listen() socket (%d)", WSAGetLastError()); 
		MySetDlgItemText(hDlg, IDC_STATIC_STATUS, scratchpad, 1); 
		return 0; 
		} 
 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Creating connect() socket", 1); 
	if((s_internal_connect=socket(AF_INET, SOCK_STREAM,0)) == INVALID_SOCKET) 
		{ 
/**/    sprintf(scratchpad, "Can't create connect() socket (%d)", WSAGetLastError()); 
		MySetDlgItemText(hDlg, IDC_STATIC_STATUS, scratchpad, 1); 
		return 0; 
		} 
 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Resolving our IP", 1); 
 
	out_sin.sin_family = AF_INET; 
	sprintf(scratchpad, "%s", Name2Addr(fulldomain)); 
//	strncpy(scratchpad, "127.0.0.1", 20);				// Use this line for local testing 
	out_sin.sin_addr.s_addr=inet_addr(scratchpad);; 
	out_sin.sin_port=htons(DUMMYPORT); 
 
	if(!out_sin.sin_addr.s_addr) 
		{ 
/**/    sprintf(scratchpad, "Can't resolve our IP (%d)", WSAGetLastError() ); 
		MySetDlgItemText(hDlg, IDC_STATIC_STATUS, scratchpad, 1); 
		return 0; 
		} 
 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Connecting to ourself", 1); 
	if(connect(s_internal_connect, (struct sockaddr*) &out_sin, sizeof(SOCKADDR_IN)) < 0) 
		{ 
/**/    sprintf(scratchpad, "Can't connect to ourself (%d)", WSAGetLastError() ); 
		MySetDlgItemText(hDlg, IDC_STATIC_STATUS, scratchpad, 1); 
		return 0; 
		} 
 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "IP is up to date", 1); 
 
	closesocket(s_internal_bind); 
	closesocket(s_internal_connect); 
 
	return 1; 
} 
 
 
int UpdateIP(HWND hDlg, char *uname, char *passwd, char *domain, char *IP) 
{ 
struct CliData 
        { 
        char UName[20]; 
        char PWord[20]; 
        char NewIP[16]; 
        char Doman[64]; 
        }; 
 
struct CliData *Datum; 
struct sockaddr_in sin; 
 
sin.sin_family = AF_INET;                                
sin.sin_port = htons( REMOTEPORT ); 
sin.sin_addr.s_addr = inet_addr(Name2Addr(REMOTEHOST)); 
 
Datum = malloc(sizeof(struct CliData)); 
strcpy(Datum->NewIP, IP); 
strcpy(Datum->UName, uname); 
strcpy(Datum->PWord, passwd); 
strcpy(Datum->Doman, domain); 
 
if ((s_dyndns = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)  
	{ 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Socket Creation Error", 1); 
	return 0; 
	} 
if (connect(s_dyndns, (struct sockaddr *)&sin, sizeof(sin))==SOCKET_ERROR) 
	{ 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Connect Error", 1); 
	return 0; 
	} 
 
send(s_dyndns, (char *)Datum, sizeof(struct CliData), 0); 
 
recv(s_dyndns, MBuf, 8192, 0); 
 
closesocket(s_dyndns); 
 
if(DEBUG2) 
	{ 
	MessageBox(hDlg, MBuf, "Server Response", MB_OK); 
	} 
MySetDlgItemText(hDlg, IDC_STATIC_STATUS, MBuf, 1); 
 
if(strstr(MBuf, "Authorization")) 
	{ 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Invalid Login", 1); 
	return 0; 
	} 
else 
if(strstr(MBuf, "Internal")) 
	{ 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Server Error", 1); 
	return 0; 
	} 
else 
if(strstr(MBuf, "Invalid")) 
	{ 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Invalid Domain", 1); 
	return 0; 
	} 
else 
if(strstr(MBuf, "SUCCES")) 
	{ 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Update Successful", 1); 
	return 1; 
	} 
else 
	{ 
	MySetDlgItemText(hDlg, IDC_STATIC_STATUS, "Unknown Response", 1); 
	return 0; 
	} 
} 
 
 
BOOL MySetDlgItemText(HWND hDlg, int nIDDlgItem, LPCTSTR lpString, BOOL rec) 
{ 
	char tBuf[1536]; 
 
	if(rec) 
		{ 
		sprintf(MRec, "%s\n%s", MRec, lpString); 
		if(strlen(MRec)>1536) 
			{ 
			strncpy(tBuf, MRec+512, 1536); 
			strncpy(MRec, tBuf, 1536); 
			} 
		} 
	return SetDlgItemText(hDlg, nIDDlgItem, lpString); 
}