re PR libfortran/23803 ([mingw32] getlog malfunction)

PR libfortran/23803
	* intrinsics/getXid.c: Add getpid wrapper for MinGW.
	* intrinsics/getlog.c: Add getlogin wrapper for MinGW.
	* intrinsics/hostnm.c: Add gethostname wrapper for MinGW.

Co-Authored-By: Danny Smith <dannysmith@users.sourceforge.net>

From-SVN: r104624
This commit is contained in:
Francois-Xavier Coudert 2005-09-25 23:02:17 +02:00 committed by François-Xavier Coudert
parent ad90e28f8f
commit 86ab632081
4 changed files with 77 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2005-09-25 Francois-Xavier Coudert <coudert@clipper.ens.fr>
Danny Smith <dannysmith@users.sourceforge.net>
PR libfortran/23803
* intrinsics/getXid.c: Add getpid wrapper for MinGW.
* intrinsics/getlog.c: Add getlogin wrapper for MinGW.
* intrinsics/hostnm.c: Add gethostname wrapper for MinGW.
2005-09-24 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR libfortran/23802

View File

@ -38,6 +38,11 @@ Boston, MA 02110-1301, USA. */
#include "libgfortran.h"
#ifdef __MINGW32__
#define HAVE_GETPID
#include <process.h>
#endif
#ifdef HAVE_GETGID
extern GFC_INTEGER_4 PREFIX(getgid) (void);
export_proto_np(PREFIX(getgid));

View File

@ -39,6 +39,29 @@ Boston, MA 02110-1301, USA. */
#endif
/* Windows32 version */
#if defined __MINGW32__ && !defined HAVE_GETLOGIN
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <lmcons.h> /* for UNLEN */
static char *
w32_getlogin (void)
{
static char name [UNLEN + 1];
DWORD namelen = sizeof (name);
GetUserName (name, &namelen);
return (name[0] == 0 ? NULL : name);
}
#undef getlogin
#define getlogin w32_getlogin
#define HAVE_GETLOGIN 1
#endif
/* GETLOG (LOGIN), g77 intrinsic for retrieving the login name for the
process.
CHARACTER(len=*), INTENT(OUT) :: LOGIN */

View File

@ -38,7 +38,47 @@ Boston, MA 02110-1301, USA. */
#include <unistd.h>
#endif
#include "../io/io.h"
/* Windows32 version */
#if defined __MINGW32__ && !defined HAVE_GETHOSTNAME
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <errno.h>
static int
w32_gethostname (char *name, size_t len)
{
/* We could try the WinSock API gethostname, but that will
fail if WSAStartup function has has not been called. We don't
really need a name that will be understood by socket API, so avoid
unnecessary dependence on WinSock libraries by using
GetComputerName instead. */
/* On Win9x GetComputerName fails if the input size is less
than MAX_COMPUTERNAME_LENGTH + 1. */
char buffer[MAX_COMPUTERNAME_LENGTH + 1];
DWORD size = sizeof (buffer);
if (!GetComputerName (buffer, &size))
return -1;
if ((size = strlen (buffer) + 1) > len)
{
errno = EINVAL;
/* Truncate as per POSIX spec. We do not NUL-terminate. */
size = len;
}
memcpy (name, buffer, (size_t) size);
return 0;
}
#undef gethostname
#define gethostname w32_gethostname
#define HAVE_GETHOSTNAME 1
#endif
/* SUBROUTINE HOSTNM(NAME, STATUS)
CHARACTER(len=*), INTENT(OUT) :: NAME