diff --git a/libc/Makefile b/libc/Makefile
index 531940b6..ce9b1b33 100644
--- a/libc/Makefile
+++ b/libc/Makefile
@@ -200,6 +200,7 @@ getppid.o \
gettermmode.o \
gettimeofday.o \
getuid.o \
+grent.o \
init.o \
ioctl.o \
ioleast.o \
diff --git a/libc/grent.cpp b/libc/grent.cpp
new file mode 100644
index 00000000..05c558cb
--- /dev/null
+++ b/libc/grent.cpp
@@ -0,0 +1,67 @@
+/*******************************************************************************
+
+ Copyright(C) Jonas 'Sortie' Termansen 2013.
+
+ This file is part of the Sortix C Library.
+
+ The Sortix C Library is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or (at your
+ option) any later version.
+
+ The Sortix C Library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with the Sortix C Library. If not, see .
+
+ grent.cpp
+ Group database.
+
+*******************************************************************************/
+
+#include
+
+#include
+#include
+#include
+
+const gid_t ROOT_GID = 0;
+const char* const ROOT_NAME = "root";
+
+static struct group global_group;
+
+static struct group* fill_group(struct group* gr)
+{
+ const char* env_groupname = getenv("GROUPNAME");
+ strcpy(gr->gr_name, env_groupname ? env_groupname : ROOT_NAME);
+ const char* env_groupid = getenv("GROUPID");
+ gr->gr_gid = env_groupid ? atoi(env_groupid) : ROOT_GID;
+ return gr;
+}
+
+static gid_t lookup_groupname(const char* name)
+{
+ const char* env_groupname = getenv("GROUPNAME");
+ const char* my_groupname = env_groupname ? env_groupname : ROOT_NAME;
+ if ( !strcmp(my_groupname, name) )
+ {
+ const char* env_groupid = getenv("GROUPID");
+ if ( env_groupid )
+ return atoi(env_groupid);
+ }
+ return 1;
+}
+
+extern "C" struct group* getgrgid(gid_t gid)
+{
+ (void) gid;
+ return fill_group(&global_group);
+}
+
+extern "C" struct group* getgrnam(const char* name)
+{
+ return getgrgid(lookup_groupname(name));
+}
diff --git a/libc/include/grp.h b/libc/include/grp.h
new file mode 100644
index 00000000..8e0b9e90
--- /dev/null
+++ b/libc/include/grp.h
@@ -0,0 +1,50 @@
+/*******************************************************************************
+
+ Copyright(C) Jonas 'Sortie' Termansen 2013.
+
+ This file is part of the Sortix C Library.
+
+ The Sortix C Library is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or (at your
+ option) any later version.
+
+ The Sortix C Library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with the Sortix C Library. If not, see .
+
+ grp.h
+ Group database.
+
+*******************************************************************************/
+
+#ifndef INCLUDE_GRP_H
+#define INCLUDE_GRP_H
+
+#include
+
+__BEGIN_DECLS
+
+@include(gid_t.h)
+@include(uid_t.h)
+@include(size_t.h)
+
+#define _GROUP_BUFFER_SIZE 64
+
+struct group
+{
+ char gr_name[_GROUP_BUFFER_SIZE];
+ gid_t gr_gid;
+ char** gr_mem;
+};
+
+struct group* getgrgid(gid_t gid);
+struct group* getgrnam(const char* name);
+
+__END_DECLS
+
+#endif