mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 06:20:23 +02:00
* posix.c (scm_gethostname): Make sure len is initialised before
it is used. Restructured to (hopefully) represent possible configurations more clearly in the code. Added unwind handler.
This commit is contained in:
parent
3bd3bae820
commit
b28f5b3cb2
2 changed files with 60 additions and 22 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2003-04-24 Dirk Herrmann <dirk@dirk-herrmanns-seiten.de>
|
||||||
|
|
||||||
|
* posix.c (scm_gethostname): Make sure len is initialised before
|
||||||
|
it is used. Restructured to (hopefully) represent possible
|
||||||
|
configurations more clearly in the code. Added unwind handler.
|
||||||
|
|
||||||
2004-03-23 Kevin Ryde <user42@zip.com.au>
|
2004-03-23 Kevin Ryde <user42@zip.com.au>
|
||||||
|
|
||||||
* posix.c (scm_gethostname): Use sysconf(_SC_HOST_NAME_MAX) and/or
|
* posix.c (scm_gethostname): Use sysconf(_SC_HOST_NAME_MAX) and/or
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "libguile/_scm.h"
|
#include "libguile/_scm.h"
|
||||||
|
#include "libguile/dynwind.h"
|
||||||
#include "libguile/fports.h"
|
#include "libguile/fports.h"
|
||||||
#include "libguile/scmsigs.h"
|
#include "libguile/scmsigs.h"
|
||||||
#include "libguile/feature.h"
|
#include "libguile/feature.h"
|
||||||
|
@ -1748,59 +1749,90 @@ SCM_DEFINE (scm_sethostname, "sethostname", 1, 0, 0,
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
#endif /* HAVE_SETHOSTNAME */
|
#endif /* HAVE_SETHOSTNAME */
|
||||||
|
|
||||||
|
|
||||||
#if HAVE_GETHOSTNAME
|
#if HAVE_GETHOSTNAME
|
||||||
SCM_DEFINE (scm_gethostname, "gethostname", 0, 0, 0,
|
SCM_DEFINE (scm_gethostname, "gethostname", 0, 0, 0,
|
||||||
(void),
|
(void),
|
||||||
"Return the host name of the current processor.")
|
"Return the host name of the current processor.")
|
||||||
#define FUNC_NAME s_scm_gethostname
|
#define FUNC_NAME s_scm_gethostname
|
||||||
{
|
{
|
||||||
int len, res, save_errno;
|
#ifdef MAXHOSTNAMELEN
|
||||||
char *p = scm_malloc (len);
|
|
||||||
SCM name;
|
|
||||||
|
|
||||||
/* Default 256 is for Solaris, under Linux ENAMETOOLONG is returned if not
|
|
||||||
large enough. SUSv2 specifies 255 maximum too, apparently. */
|
|
||||||
len = 256;
|
|
||||||
|
|
||||||
/* Various systems define MAXHOSTNAMELEN (including Solaris in fact).
|
/* Various systems define MAXHOSTNAMELEN (including Solaris in fact).
|
||||||
On GNU/Linux this doesn't include the terminating '\0', hence "+ 1". */
|
* On GNU/Linux this doesn't include the terminating '\0', hence "+ 1". */
|
||||||
#ifdef MAXHOSTNAMELEN
|
const int len = MAXHOSTNAMELEN + 1;
|
||||||
len = MAXHOSTNAMELEN + 1;
|
char *const p = scm_malloc (len);
|
||||||
#endif
|
const int res = gethostname (p, len);
|
||||||
|
|
||||||
|
scm_frame_begin (0);
|
||||||
|
scm_frame_unwind_handler (free, p, 0);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Default 256 is for Solaris, under Linux ENAMETOOLONG is returned if not
|
||||||
|
* large enough. SUSv2 specifies 255 maximum too, apparently. */
|
||||||
|
int len = 256;
|
||||||
|
int res;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
# if HAVE_SYSCONF && defined (_SC_HOST_NAME_MAX)
|
||||||
|
|
||||||
/* POSIX specifies the HOST_NAME_MAX system parameter for the max size,
|
/* POSIX specifies the HOST_NAME_MAX system parameter for the max size,
|
||||||
which may reflect a particular kernel configuration.
|
* which may reflect a particular kernel configuration.
|
||||||
Must watch out for this existing but giving -1, as happens for instance
|
* Must watch out for this existing but giving -1, as happens for instance
|
||||||
in gnu/linux glibc 2.3.2. */
|
* in gnu/linux glibc 2.3.2. */
|
||||||
#if HAVE_SYSCONF && defined (_SC_HOST_NAME_MAX)
|
|
||||||
{
|
{
|
||||||
long n = sysconf (_SC_HOST_NAME_MAX);
|
const long int n = sysconf (_SC_HOST_NAME_MAX);
|
||||||
if (n != -1L)
|
if (n != -1L)
|
||||||
len = n;
|
len = n;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
p = scm_malloc (len);
|
||||||
|
|
||||||
|
scm_frame_begin (0);
|
||||||
|
scm_frame_unwind_handler (free, p, 0);
|
||||||
|
|
||||||
res = gethostname (p, len);
|
res = gethostname (p, len);
|
||||||
while (res == -1 && errno == ENAMETOOLONG)
|
while (res == -1 && errno == ENAMETOOLONG)
|
||||||
{
|
{
|
||||||
p = scm_realloc (p, len * 2);
|
|
||||||
len *= 2;
|
len *= 2;
|
||||||
|
|
||||||
|
/* scm_realloc may throw an exception. */
|
||||||
|
p = scm_realloc (p, len);
|
||||||
res = gethostname (p, len);
|
res = gethostname (p, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
if (res == -1)
|
if (res == -1)
|
||||||
{
|
{
|
||||||
save_errno = errno;
|
const int save_errno = errno;
|
||||||
|
|
||||||
|
// No guile exceptions can occur before we have freed p's memory.
|
||||||
|
scm_frame_end ();
|
||||||
free (p);
|
free (p);
|
||||||
|
|
||||||
errno = save_errno;
|
errno = save_errno;
|
||||||
SCM_SYSERROR;
|
SCM_SYSERROR;
|
||||||
}
|
}
|
||||||
name = scm_makfrom0str (p);
|
else
|
||||||
free (p);
|
{
|
||||||
return name;
|
/* scm_makfrom0str may throw an exception. */
|
||||||
|
const SCM name = scm_makfrom0str (p);
|
||||||
|
|
||||||
|
// No guile exceptions can occur before we have freed p's memory.
|
||||||
|
scm_frame_end ();
|
||||||
|
free (p);
|
||||||
|
|
||||||
|
return name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
#endif /* HAVE_GETHOSTNAME */
|
#endif /* HAVE_GETHOSTNAME */
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
scm_init_posix ()
|
scm_init_posix ()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue