Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2004-05-17 20:06:02 +0400
committerCorinna Vinschen <corinna@vinschen.de>2004-05-17 20:06:02 +0400
commit68509b303eb9d091068adf651385c29c41a8f458 (patch)
tree39b0c6a04fe2571166c8a9025bb0973858429e03 /winsup/cygwin/grp.cc
parent3271e9f9e38cb9d0e51554680f1f87c3ea3fe5f7 (diff)
* cygwin.din: Add symbols flockfile, ftrylockfile, funlockfile,
getgrgid_r, getgrnam_r and getlogin_r. * grp.cc (getgrgid_r): New function. (getgrnam_r): Ditto. * syscalls.cc (flockfile): Ditto. (ftrylockfile): Ditto. (funlockfile): Ditto. * sysconf.cc (sysconf): Return LOGIN_NAME_MAX in case of _SC_LOGIN_NAME_MAX. * thread.cc (__cygwin_lock_trylock): Define int. Return value from call to pthread_mutex_trylock. * uinfo.cc (getlogin_r): New function. * include/limits.h: Define LOGIN_NAME_MAX. * include/cygwin/version.h: Bump API minor number. * include/sys/lock.h: Add declarations for __cygwin_lock_xxx functions. * include/sys/stdio.h: Add define for _ftrylockfile.
Diffstat (limited to 'winsup/cygwin/grp.cc')
-rw-r--r--winsup/cygwin/grp.cc86
1 files changed, 86 insertions, 0 deletions
diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc
index ab0ef5738..39de15136 100644
--- a/winsup/cygwin/grp.cc
+++ b/winsup/cygwin/grp.cc
@@ -175,6 +175,49 @@ grp32togrp16 (struct __group16 *gp16, struct __group32 *gp32)
return gp16;
}
+extern "C" int
+getgrgid_r (__gid32_t gid, struct group *grp, char *buffer, size_t bufsize,
+ struct group **result)
+{
+ *result = NULL;
+
+ if (!grp || !buffer)
+ return ERANGE;
+
+ struct __group32 *tempgr = internal_getgrgid (gid, true);
+ pthread_testcancel ();
+ if (!tempgr)
+ return 0;
+
+ /* check needed buffer size. */
+ int i;
+ size_t needsize = strlen (tempgr->gr_name) + strlen (tempgr->gr_passwd)
+ + 2 + sizeof (char *);
+ for (i = 0; tempgr->gr_mem[i]; ++i)
+ needsize += strlen (tempgr->gr_mem[i]) + 1 + sizeof (char *);
+ if (needsize > bufsize)
+ return ERANGE;
+
+ /* make a copy of tempgr */
+ *result = grp;
+ grp->gr_gid = tempgr->gr_gid;
+ grp->gr_name = buffer;
+ grp->gr_passwd = grp->gr_name + strlen (tempgr->gr_name) + 1;
+ grp->gr_mem = (char **) (grp->gr_passwd + strlen (tempgr->gr_passwd) + 1);
+ char *mem = (char *) grp->gr_mem + (i + 1) * sizeof (char *);
+ for (i = 0; tempgr->gr_mem[i]; ++i)
+ {
+ grp->gr_mem[i] = mem;
+ mem += strlen (tempgr->gr_mem[i]) + 1;
+ }
+ grp->gr_mem[i] = NULL;
+ strcpy (grp->gr_name, tempgr->gr_name);
+ strcpy (grp->gr_passwd, tempgr->gr_passwd);
+ for (i = 0; tempgr->gr_mem[i]; ++i)
+ strcpy (grp->gr_mem[i], tempgr->gr_mem[i]);
+ return 0;
+}
+
extern "C" struct __group32 *
getgrgid32 (__gid32_t gid)
{
@@ -189,6 +232,49 @@ getgrgid (__gid16_t gid)
return grp32togrp16 (&g16, getgrgid32 (gid16togid32 (gid)));
}
+extern "C" int
+getgrnam_r (const char *nam, struct group *grp, char *buffer, size_t bufsize,
+ struct group **result)
+{
+ *result = NULL;
+
+ if (!grp || !buffer)
+ return ERANGE;
+
+ struct __group32 *tempgr = internal_getgrnam (nam, true);
+ pthread_testcancel ();
+ if (!tempgr)
+ return 0;
+
+ /* check needed buffer size. */
+ int i;
+ size_t needsize = strlen (tempgr->gr_name) + strlen (tempgr->gr_passwd)
+ + 2 + sizeof (char *);
+ for (i = 0; tempgr->gr_mem[i]; ++i)
+ needsize += strlen (tempgr->gr_mem[i]) + 1 + sizeof (char *);
+ if (needsize > bufsize)
+ return ERANGE;
+
+ /* make a copy of tempgr */
+ *result = grp;
+ grp->gr_gid = tempgr->gr_gid;
+ grp->gr_name = buffer;
+ grp->gr_passwd = grp->gr_name + strlen (tempgr->gr_name) + 1;
+ grp->gr_mem = (char **) (grp->gr_passwd + strlen (tempgr->gr_passwd) + 1);
+ char *mem = (char *) grp->gr_mem + (i + 1) * sizeof (char *);
+ for (i = 0; tempgr->gr_mem[i]; ++i)
+ {
+ grp->gr_mem[i] = mem;
+ mem += strlen (tempgr->gr_mem[i]) + 1;
+ }
+ grp->gr_mem[i] = NULL;
+ strcpy (grp->gr_name, tempgr->gr_name);
+ strcpy (grp->gr_passwd, tempgr->gr_passwd);
+ for (i = 0; tempgr->gr_mem[i]; ++i)
+ strcpy (grp->gr_mem[i], tempgr->gr_mem[i]);
+ return 0;
+}
+
extern "C" struct __group32 *
getgrnam32 (const char *name)
{