Index: main/trunk/greenstone2/common-src/src/getpw/getpw.cpp
===================================================================
--- main/trunk/greenstone2/common-src/src/getpw/getpw.cpp	(revision 23046)
+++ main/trunk/greenstone2/common-src/src/getpw/getpw.cpp	(revision 23047)
@@ -28,24 +28,9 @@
 // #define _XOPEN_SOURCE_EXTENDED 1
 
-#include "gsdlconf.h"
-
-
-// include crypt
-#if defined(__WIN32__)
-#include "crypt.h"
-#else
-
-#include "config.h"
-#if defined(HAVE_CRYPT_H)
-#include <crypt.h>
-#endif
-
-#if defined(HAVE_UNISTD_H)
-#include <unistd.h>
-#endif
-/* we are probably in trouble if we have neither crypt.h or unistd.h,
-   but for now we'll do nothing about it... */
-
-#endif  /* not WIN32 */
+// Windows version seems to be sensitive to the order of <iostream> and <crypt.h>
+// having <iostream> *after* <crypt.h> lead to linking error such as:
+//    __freea already defined in getpw.obj
+// which seems to be caused by compiler confusion of whether it should be using
+// /MD or /MT (which control dynamic or static/multi-threaded linking)
 
 #if defined(GSDL_USE_OBJECTSPACE)
@@ -59,15 +44,79 @@
 // use the standard namespace
 #if !defined (GSDL_NAMESPACE_BROKEN)
-#if defined(GSDL_USE_OBJECTSPACE)
+#  if defined(GSDL_USE_OBJECTSPACE)
 using namespace ospace::std;
-#else
+#  else
 using namespace std;
-#endif
+#  endif
 #endif
 
+#include "gsdlconf.h"
+
+// include crypt
+#if defined(__WIN32__)
+#  include <windows.h>
+#  include <stdio.h>
+#  include <crypt.h>
+#else
+#  include "config.h"
+#  if defined(HAVE_CRYPT_H)
+#  include <crypt.h>
+#  endif
+
+#  if defined(HAVE_UNISTD_H)
+#  include <unistd.h>
+#  endif
+/* we are probably in trouble if we have neither crypt.h or unistd.h,
+   but for now we'll do nothing about it... */
+
+#endif  /* not WIN32 */
 
 #include <string.h>
 //#include <pwd.h>
 
+#if defined(__WIN32__)
+char* getPassword(HANDLE hSTDIN)
+{
+	char a[129];
+	int charCount = 0;
+	DWORD cNumRead;
+	INPUT_RECORD irIn[128];
+	
+	bool done = false;
+	while (!done)
+	{
+		if (!ReadConsoleInput(hSTDIN, irIn, 128, &cNumRead))
+		{
+			cerr << "There was an error reading input from the console\n";
+			return strdup("");
+		}
+		
+		for(int j = 0; j < cNumRead; j++)
+		{
+			if(irIn[j].EventType == KEY_EVENT)
+			{
+				KEY_EVENT_RECORD keyEvent = irIn[j].Event.KeyEvent;
+				if(keyEvent.bKeyDown == false)
+				{
+					if(keyEvent.wVirtualKeyCode == VK_RETURN)
+					{
+						done = true;
+						cout << "\n";
+					}
+					else
+					{
+						if(charCount < 129)
+						{
+							a[charCount++] = keyEvent.uChar.AsciiChar;
+						}
+					}
+				}
+			}
+		}
+	}
+	a[charCount] = '\0';
+	return strdup(a);
+}
+#endif
 
 int main (int argc, char *argv[]) {
@@ -79,11 +128,34 @@
   for (i=0; i<3; i++)  {
 #if defined(__WIN32__)
-    cerr << "Enter password  (will appear on screen): ";
-    char a[129];
-    cin.getline(a, 128);
+    HANDLE hSTDIN;
+	DWORD fdwMode, fdwPrevMode;
+	int counter=0;
+	
+	hSTDIN = GetStdHandle(STD_INPUT_HANDLE);
+	if (hSTDIN == INVALID_HANDLE_VALUE)
+	{
+		cerr << "There was an error getting a handle to the standard input\n";
+		return 1;
+	}
+	
+	if (!GetConsoleMode(hSTDIN, &fdwPrevMode))
+	{
+		cerr << "There was an error getting a handle to the current console mode\n";
+		return 2;
+	}
+	
+	fdwMode = NULL;
+	if (!SetConsoleMode(hSTDIN, fdwMode))
+	{
+		cerr << "There was an error setting the new handle mode\n";
+		return 3;
+	}
+	
+	cout << "Enter password:";
+	char* a = getPassword(hSTDIN);
+	
 #else
-    char *a = getpass("Enter password:");
+    char* a = getpass("Enter password:");
 #endif
-
     int len = strlen (a);
     if (len < 3 || len > 128) {
@@ -93,13 +165,11 @@
 
     strcpy (c, a);
-
+	
 #if defined(__WIN32__)
     cerr << "Re-enter password: ";
-    char b[129];
-    cin.getline(b, 128);
+    char* b = getPassword(hSTDIN);
 #else
-    char *b = getpass("Re-enter password:");  
+    char* b = getpass("Re-enter password:");  
 #endif
-
     if ((strcmp (c, b)) == 0) {
       password_ok = 1;
@@ -115,11 +185,10 @@
     return -1;
   }
-
-
+  
   char *salt = "Tp";
   char *pw = crypt (c, salt);
 
   cout << pw << "\n";
-  
+
   return 0;
 }
