| 
					
				 | 
			
			
				@@ -77,7 +77,7 @@ extern char *_getcwd(char *buf, size_t size); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define MAX_OPTIONS 100 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define MAX_CONF_FILE_LINE_SIZE (8 * 1024) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static int exit_flag; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int exit_flag = 0;               /* Main loop should exit */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static char server_base_name[40];       /* Set by init_server_name() */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static char *server_name;               /* Set by init_server_name() */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static char *icon_name;                 /* Set by init_server_name() */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -858,30 +858,26 @@ static BOOL CALLBACK InputDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lP) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void base64_encode(const unsigned char *src, int src_len, char *dst) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void suggest_passwd(char *passwd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    static const char *b64 = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    int i, j, a, b, c; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (i = j = 0; i < src_len; i += 3) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        a = src[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        b = i + 1 >= src_len ? 0 : src[i + 1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        c = i + 2 >= src_len ? 0 : src[i + 2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        dst[j++] = b64[a >> 2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        dst[j++] = b64[((a & 3) << 4) | (b >> 4)]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (i + 1 < src_len) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dst[j++] = b64[(b & 15) << 2 | (c >> 6)]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (i + 2 < src_len) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dst[j++] = b64[c & 63]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    unsigned u; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    char * p; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    union { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FILETIME ft; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LARGE_INTEGER li; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } num; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* valid characters are 32 to 126 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    GetSystemTimeAsFileTime(&num.ft); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    num.li.HighPart |= GetCurrentProcessId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    p = passwd; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    while (num.li.QuadPart) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        u = (unsigned)(num.li.QuadPart % 95); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        num.li.QuadPart -= u; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        num.li.QuadPart /= 95; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        *p = (char)(u+32); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        p++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    while (j % 4 != 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        dst[j++] = '='; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    dst[j++] = '\0'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void add_control(unsigned char **mem, DLGTEMPLATE *dia, WORD type, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -923,14 +919,7 @@ static int get_password(const char * user, const char * realm, char * passwd, un 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* Create a password suggestion */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     memset(passwd, 0, passwd_len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GetSystemTimeAsFileTime((LPFILETIME)mem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    *((DWORD*)mem) |= GetCurrentProcessId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    base64_encode(mem, 6, passwd); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    p = mem+100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (y=32;y<127;y++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (ispunct(y)) {*p=(char)y; p++;} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    passwd[8] = mem[(GetTickCount()/30)%(p-(mem+100))+100]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    suggest_passwd(passwd); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* Create the dialog */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (void) memset(mem, 0, sizeof(mem)); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1291,7 +1280,7 @@ static void change_password_file() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert((int)p - (int)mem < sizeof(mem)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         dia->cy = y + 20; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } while (IDOK == DialogBoxIndirectParam(NULL, dia, NULL, PasswordDlgProc, (LPARAM) path)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } while ((IDOK == DialogBoxIndirectParam(NULL, dia, NULL, PasswordDlgProc, (LPARAM) path)) && (!exit_flag)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     guard--; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1374,6 +1363,7 @@ static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         case ID_QUIT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             mg_stop(ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Shell_NotifyIcon(NIM_DELETE, &TrayIcon); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            exit_flag = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             PostQuitMessage(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         case ID_SETTINGS: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1427,6 +1417,7 @@ static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     case WM_CLOSE: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         mg_stop(ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Shell_NotifyIcon(NIM_DELETE, &TrayIcon); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        exit_flag = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         PostQuitMessage(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return 0;/* We've just sent our own quit message, with proper hwnd. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     default: 
			 |