aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-04-11 10:00:33 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-04-11 10:00:33 -0700
commit010747cad678c6b5d310db072c77a2ce17f2706e (patch)
tree82e2f7a9c79249f5685ee620a28aded4d64a325a
parentbc234c204c0a1d6d02363e9a60418dd52a6c3c87 (diff)
parentb2a132cd667a004dc64d58c0f029978cc46eb564 (diff)
Merge pull request #1050 from arlolra/setgroups
Implements setgroups
-rw-r--r--src/library.js15
-rw-r--r--system/include/libc/sys/unistd.h4
-rw-r--r--system/include/sys/un.h1
-rw-r--r--tests/unistd/misc.c9
4 files changed, 24 insertions, 5 deletions
diff --git a/src/library.js b/src/library.js
index f6b2a31e..01c0a3f3 100644
--- a/src/library.js
+++ b/src/library.js
@@ -2118,7 +2118,20 @@ LibraryManager.library = {
return 1;
}
},
- // TODO: Implement initgroups, setgroups (grp.h).
+ // TODO: Implement initgroups (grp.h).
+ setgroups__deps: ['__setErrNo', '$ERRNO_CODES', 'sysconf'],
+ setgroups: function (ngroups, gidset) {
+ // int setgroups(int ngroups, const gid_t *gidset);
+ // https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/setgroups.2.html
+ if (ngroups < 1 || ngroups > _sysconf({{{ cDefine('_SC_NGROUPS_MAX') }}})) {
+ ___setErrNo(ERRNO_CODES.EINVAL);
+ return -1;
+ } else {
+ // We have just one process/user/group, so it makes no sense to set groups.
+ ___setErrNo(ERRNO_CODES.EPERM);
+ return -1;
+ }
+ },
gethostid: function() {
// long gethostid(void);
// http://pubs.opengroup.org/onlinepubs/000095399/functions/gethostid.html
diff --git a/system/include/libc/sys/unistd.h b/system/include/libc/sys/unistd.h
index b0c6d505..1a414b3c 100644
--- a/system/include/libc/sys/unistd.h
+++ b/system/include/libc/sys/unistd.h
@@ -153,8 +153,8 @@ int _EXFUN(seteuid, (uid_t __uid ));
#endif
int _EXFUN(setgid, (gid_t __gid ));
#endif
-#if defined(__CYGWIN__)
-int _EXFUN(setgroups, (int ngroups, const gid_t *grouplist ));
+#if defined(EMSCRIPTEN) || defined(__CYGWIN__)
+int _EXFUN(setgroups, (int ngroups, const gid_t *gidset));
#endif
int _EXFUN(setpgid, (pid_t __pid, pid_t __pgid ));
int _EXFUN(setpgrp, (void ));
diff --git a/system/include/sys/un.h b/system/include/sys/un.h
index b70425fb..ca002158 100644
--- a/system/include/sys/un.h
+++ b/system/include/sys/un.h
@@ -35,6 +35,7 @@
#include <sys/cdefs.h>
#include <sys/_types.h>
+#include <sys/socket.h>
/*
* Definitions for UNIX IPC domain.
diff --git a/tests/unistd/misc.c b/tests/unistd/misc.c
index 4e7ac216..5b0d63d2 100644
--- a/tests/unistd/misc.c
+++ b/tests/unistd/misc.c
@@ -106,7 +106,7 @@ int main() {
printf("alarm: %d", alarm(42));
printf(", errno: %d\n", errno);
errno = 0;
- printf("ualarm: %d", ualarm(123, 456));
+ printf("ualarm: %ld", ualarm(123, 456));
printf(", errno: %d\n", errno);
errno = 0;
@@ -117,7 +117,7 @@ int main() {
printf(", errno: %d\n", errno);
errno = 0;
- printf("crypt: %d", crypt("foo", "bar"));
+ printf("crypt: %s", crypt("foo", "bar"));
printf(", errno: %d\n", errno);
errno = 0;
char encrypt_block[64] = {0};
@@ -192,5 +192,10 @@ int main() {
printf(", errno: %d\n", errno);
errno = 0;
+ gid_t groups2[1] = {0};
+ printf("setgroups: %d", setgroups(1, groups2));
+ printf(", errno: %d\n", errno);
+ errno = 0;
+
return 0;
}