25
25
#include <windows.h>
26
26
#include <winbase.h>
27
27
#include <wincon.h>
28
+ #include <shlobj.h>
28
29
#ifdef __MINGW32__
29
30
#include <mswsock.h>
30
31
#include <mbstring.h>
@@ -385,6 +386,60 @@ exit_handler(void)
385
386
}
386
387
}
387
388
389
+ static void
390
+ init_env (void )
391
+ {
392
+ char env [_MAX_PATH ];
393
+ DWORD len ;
394
+ BOOL f ;
395
+ LPITEMIDLIST pidl ;
396
+
397
+ if (!GetEnvironmentVariable ("HOME" , env , sizeof (env ))) {
398
+ f = FALSE;
399
+ if (GetEnvironmentVariable ("HOMEDRIVE" , env , sizeof (env )))
400
+ len = strlen (env );
401
+ else
402
+ len = 0 ;
403
+ if (GetEnvironmentVariable ("HOMEPATH" , env + len , sizeof (env ) - len ) || len ) {
404
+ f = TRUE;
405
+ }
406
+ else if (GetEnvironmentVariable ("USERPROFILE" , env , sizeof (env ))) {
407
+ f = TRUE;
408
+ }
409
+ else if (SHGetSpecialFolderLocation (NULL , CSIDL_PERSONAL , & pidl ) == 0 ) {
410
+ LPMALLOC alloc ;
411
+ f = SHGetPathFromIDList (pidl , env );
412
+ SHGetMalloc (& alloc );
413
+ alloc -> lpVtbl -> Free (alloc , pidl );
414
+ alloc -> lpVtbl -> Release (alloc );
415
+ }
416
+ if (f ) {
417
+ char * p = env ;
418
+ while (* p ) {
419
+ if (* p == '\\' ) * p = '/' ;
420
+ p = CharNext (p );
421
+ }
422
+ if (p - env == 2 && env [1 ] == ':' ) {
423
+ * p ++ = '/' ;
424
+ * p = 0 ;
425
+ }
426
+ SetEnvironmentVariable ("HOME" , env );
427
+ }
428
+ }
429
+
430
+ if (!GetEnvironmentVariable ("USER" , env , sizeof env )) {
431
+ if (GetEnvironmentVariable ("USERNAME" , env , sizeof env ) ||
432
+ GetUserName (env , (len = sizeof env , & len ))) {
433
+ SetEnvironmentVariable ("USER" , env );
434
+ }
435
+ else {
436
+ NTLoginName = "<Unknown>" ;
437
+ return ;
438
+ }
439
+ }
440
+ NTLoginName = strdup (env );
441
+ }
442
+
388
443
//
389
444
// Initialization stuff
390
445
//
@@ -413,6 +468,8 @@ NtInitialize(int *argc, char ***argv)
413
468
414
469
tzset ();
415
470
471
+ init_env ();
472
+
416
473
init_stdhandle ();
417
474
418
475
atexit (exit_handler );
@@ -429,21 +486,6 @@ NtInitialize(int *argc, char ***argv)
429
486
char *
430
487
getlogin ()
431
488
{
432
- char buffer [200 ];
433
- DWORD len = 200 ;
434
- extern char * NTLoginName ;
435
-
436
- if (NTLoginName == NULL ) {
437
- if (GetUserName (buffer , & len )) {
438
- NTLoginName = (char * )malloc (len + 1 );
439
- if (!NTLoginName ) return NULL ;
440
- strncpy (NTLoginName , buffer , len );
441
- NTLoginName [len ] = '\0' ;
442
- }
443
- else {
444
- NTLoginName = "<Unknown>" ;
445
- }
446
- }
447
489
return NTLoginName ;
448
490
}
449
491
@@ -1086,10 +1128,9 @@ insert(const char *path, VALUE vinfo)
1086
1128
if (!tmpcurr ) return -1 ;
1087
1129
MEMZERO (tmpcurr , NtCmdLineElement , 1 );
1088
1130
tmpcurr -> len = strlen (path );
1089
- tmpcurr -> str = ( char * ) malloc ( tmpcurr -> len + 1 );
1131
+ tmpcurr -> str = strdup ( path );
1090
1132
if (!tmpcurr -> str ) return -1 ;
1091
1133
tmpcurr -> flags |= NTMALLOC ;
1092
- strcpy (tmpcurr -> str , path );
1093
1134
* * tail = tmpcurr ;
1094
1135
* tail = & tmpcurr -> next ;
1095
1136
@@ -1406,8 +1447,7 @@ rb_w32_cmdvector(const char *cmd, char ***vec)
1406
1447
ptr = buffer + (elements + 1 ) * sizeof (char * );
1407
1448
1408
1449
while (curr = cmdhead ) {
1409
- strncpy (ptr , curr -> str , curr -> len );
1410
- ptr [curr -> len ] = '\0' ;
1450
+ memcpy (ptr , curr -> str , curr -> len + 1 );
1411
1451
* vptr ++ = ptr ;
1412
1452
ptr += curr -> len + 1 ;
1413
1453
cmdhead = curr -> next ;
@@ -1859,7 +1899,7 @@ rb_w32_strerror(int e)
1859
1899
e = GetLastError ();
1860
1900
if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM |
1861
1901
FORMAT_MESSAGE_IGNORE_INSERTS , & source , e , 0 ,
1862
- buffer , 512 , NULL ) == 0 ) {
1902
+ buffer , sizeof ( buffer ) , NULL ) == 0 ) {
1863
1903
strcpy (buffer , "Unknown Error" );
1864
1904
}
1865
1905
}
0 commit comments