mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-28 16:00:22 +02:00
* posix.h (scm_setgroups): New prototype.
* posix.c (scm_setgroups): New. Thanks to Paul Jarc! (scm_getgroups): Handle groups ids that don't fit into a fixnum. Don't use SCM_WRITABLE_VELTS.
This commit is contained in:
parent
d707b9df30
commit
f360a962d4
2 changed files with 51 additions and 9 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
|
/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2003 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -214,20 +214,61 @@ SCM_DEFINE (scm_getgroups, "getgroups", 0, 0, 0,
|
||||||
groups = scm_malloc (size);
|
groups = scm_malloc (size);
|
||||||
getgroups (ngroups, groups);
|
getgroups (ngroups, groups);
|
||||||
|
|
||||||
result = scm_c_make_vector (ngroups, SCM_UNDEFINED);
|
result = scm_c_make_vector (ngroups, SCM_BOOL_F);
|
||||||
|
while (--ngroups >= 0)
|
||||||
|
SCM_VECTOR_SET (result, ngroups, scm_ulong2num (groups[ngroups]));
|
||||||
|
|
||||||
{
|
|
||||||
SCM * ve = SCM_WRITABLE_VELTS(result);
|
|
||||||
|
|
||||||
while (--ngroups >= 0)
|
|
||||||
ve[ngroups] = SCM_MAKINUM (groups [ngroups]);
|
|
||||||
}
|
|
||||||
free (groups);
|
free (groups);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SETGROUPS
|
||||||
|
SCM_DEFINE (scm_setgroups, "setgroups", 1, 0, 0,
|
||||||
|
(SCM group_vec),
|
||||||
|
"Set the supplementary group IDs to those found in the vector argument.")
|
||||||
|
#define FUNC_NAME s_scm_setgroups
|
||||||
|
{
|
||||||
|
size_t ngroups;
|
||||||
|
size_t size;
|
||||||
|
size_t i;
|
||||||
|
int result;
|
||||||
|
int save_errno;
|
||||||
|
GETGROUPS_T *groups;
|
||||||
|
|
||||||
|
SCM_VALIDATE_VECTOR (SCM_ARG1, group_vec);
|
||||||
|
|
||||||
|
ngroups = SCM_VECTOR_LENGTH (group_vec);
|
||||||
|
|
||||||
|
/* validate before allocating, so we don't have to worry about leaks */
|
||||||
|
for (i = 0; i < ngroups; i++)
|
||||||
|
{
|
||||||
|
unsigned long ulong_gid;
|
||||||
|
GETGROUPS_T gid;
|
||||||
|
SCM_VALIDATE_ULONG_COPY (1, SCM_VECTOR_REF (group_vec, i), ulong_gid);
|
||||||
|
gid = ulong_gid;
|
||||||
|
if (gid != ulong_gid)
|
||||||
|
SCM_OUT_OF_RANGE (1, SCM_VECTOR_REF (group_vec, i));
|
||||||
|
}
|
||||||
|
|
||||||
|
size = ngroups * sizeof (GETGROUPS_T);
|
||||||
|
/* XXX - if (size / sizeof (GETGROUPS_T) != ngroups) out-of-range */
|
||||||
|
groups = scm_malloc (size);
|
||||||
|
for(i = 0; i < ngroups; i++)
|
||||||
|
groups [i] = SCM_NUM2ULONG (1, SCM_VECTOR_REF (group_vec, i));
|
||||||
|
|
||||||
|
result = setgroups (ngroups, groups);
|
||||||
|
save_errno = errno; /* don't let free() touch errno */
|
||||||
|
free (groups);
|
||||||
|
errno = save_errno;
|
||||||
|
if (result < 0)
|
||||||
|
SCM_SYSERROR;
|
||||||
|
return SCM_UNSPECIFIED;
|
||||||
|
}
|
||||||
|
#undef FUNC_NAME
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_GETPWENT
|
#ifdef HAVE_GETPWENT
|
||||||
SCM_DEFINE (scm_getpwuid, "getpw", 0, 1, 0,
|
SCM_DEFINE (scm_getpwuid, "getpw", 0, 1, 0,
|
||||||
(SCM user),
|
(SCM user),
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#ifndef SCM_POSIX_H
|
#ifndef SCM_POSIX_H
|
||||||
#define SCM_POSIX_H
|
#define SCM_POSIX_H
|
||||||
|
|
||||||
/* Copyright (C) 1995,1996,1997,1998,2000,2001 Free Software Foundation, Inc.
|
/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2003 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -36,6 +36,7 @@ SCM_API SCM scm_setsid (void);
|
||||||
SCM_API SCM scm_setpgid (SCM pid, SCM pgid);
|
SCM_API SCM scm_setpgid (SCM pid, SCM pgid);
|
||||||
SCM_API SCM scm_pipe (void);
|
SCM_API SCM scm_pipe (void);
|
||||||
SCM_API SCM scm_getgroups (void);
|
SCM_API SCM scm_getgroups (void);
|
||||||
|
SCM_API SCM scm_setgroups (SCM groups);
|
||||||
SCM_API SCM scm_getpgrp (void);
|
SCM_API SCM scm_getpgrp (void);
|
||||||
SCM_API SCM scm_getpwuid (SCM user);
|
SCM_API SCM scm_getpwuid (SCM user);
|
||||||
SCM_API SCM scm_setpwent (SCM arg);
|
SCM_API SCM scm_setpwent (SCM arg);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue