From 6da33c469bac90929c7d2a8751f0909f80def9a4 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sun, 13 Jan 2013 03:14:43 +0100 Subject: [PATCH] Add grent(3). --- libc/Makefile | 1 + libc/grent.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++ libc/include/grp.h | 50 ++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 libc/grent.cpp create mode 100644 libc/include/grp.h 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