[win32] support getlogin()
[p5sagit/p5-mst-13.2.git] / win32 / win32.c
index dcdda53..bdfb3e2 100644 (file)
@@ -55,6 +55,26 @@ char  szShellPath[MAX_PATH+1];
 char  szPerlLibRoot[MAX_PATH+1];
 HANDLE PerlDllHandle = INVALID_HANDLE_VALUE;
 
+#ifdef USE_THREADS
+#  ifdef USE_DECLSPEC_THREAD
+__declspec(thread) char        strerror_buffer[512];
+__declspec(thread) char        getlogin_buffer[128];
+#    ifdef HAVE_DES_FCRYPT
+__declspec(thread) char        crypt_buffer[30];
+#    endif
+#  else
+#    define strerror_buffer    (thr->i.Wstrerror_buffer)
+#    define getlogin_buffer    (thr->i.Wgetlogin_buffer)
+#    define crypt_buffer       (thr->i.Wcrypt_buffer)
+#  endif
+#else
+char   strerror_buffer[512];
+char   getlogin_buffer[128];
+#  ifdef HAVE_DES_FCRYPT
+char   crypt_buffer[30];
+#  endif
+#endif
+
 static int do_spawn2(char *cmd, int exectype);
 
 int 
@@ -556,6 +576,17 @@ setgid(gid_t agid)
     return (agid == ROOT_GID ? 0 : -1);
 }
 
+char *
+getlogin(void)
+{
+    dTHR;
+    char *buf = getlogin_buffer;
+    DWORD size = sizeof(getlogin_buffer);
+    if (GetUserName(buf,&size))
+       return buf;
+    return (char*)NULL;
+}
+
 /*
  * pretended kill
  */
@@ -733,6 +764,17 @@ win32_alarm(unsigned int sec)
     return 0;
 }
 
+#ifdef HAVE_DES_FCRYPT
+extern char *  des_fcrypt(char *cbuf, const char *txt, const char *salt);
+
+DllExport char *
+win32_crypt(const char *txt, const char *salt)
+{
+    dTHR;
+    return des_fcrypt(crypt_buffer, txt, salt);
+}
+#endif
+
 #ifdef USE_FIXED_OSFHANDLE
 
 EXTERN_C int __cdecl _alloc_osfhnd(void);
@@ -936,16 +978,6 @@ win32_feof(FILE *fp)
  * we have to roll our own.
  */
 
-#ifdef USE_THREADS
-#ifdef USE_DECLSPEC_THREAD
-__declspec(thread) char        strerror_buffer[512];
-#else
-#define strerror_buffer (thr->i.Wstrerror_buffer)
-#endif
-#else
-char   strerror_buffer[512];
-#endif
-
 DllExport char *
 win32_strerror(int e) 
 {
@@ -1506,8 +1538,8 @@ static
 XS(w32_LoginName)
 {
     dXSARGS;
-    char name[256];
-    DWORD size = sizeof(name);
+    char *name = getlogin_buffer;
+    DWORD size = sizeof(getlogin_buffer);
     if (GetUserName(name,&size)) {
        /* size includes NULL */
        ST(0) = sv_2mortal(newSVpv(name,size-1));