add directory gnu

This commit is contained in:
gohigh
2024-02-19 00:24:47 -05:00
parent 32616db5a4
commit a40f4cadb0
5086 changed files with 1860970 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
# Copyright (C) 1991, 1992 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
# The GNU 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
# Library General Public License for more details.
# You should have received a copy of the GNU Library General Public
# License along with the GNU C Library; see the file COPYING.LIB. If
# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
# Cambridge, MA 02139, USA.
#
# Sub-makefile for grp portion of the library.
#
subdir := grp
routines := grpopen grpread fgetgrent getgrent getgrgid getgrnam \
initgroups setgroups
tests := testgrp
include ../Rules

View File

@@ -0,0 +1,41 @@
/* Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <errno.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <grp.h>
/* Read a group entry from STREAM. */
struct group *
DEFUN(fgetgrent, (stream), FILE *stream)
{
static PTR info = NULL;
if (info == NULL)
{
info = __grpalloc();
if (info == NULL)
return NULL;
}
return __grpread(stream, info);
}

View File

@@ -0,0 +1,67 @@
/* Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stddef.h>
#include <stdio.h>
#include <grp.h>
static FILE *stream = NULL;
/* Rewind the stream. */
void
DEFUN_VOID(setgrent)
{
if (stream != NULL)
rewind(stream);
}
/* Close the stream. */
void
DEFUN_VOID(endgrent)
{
if (stream != NULL)
{
(void) fclose(stream);
stream = NULL;
}
}
/* Read an entry from the stream. */
struct group *
DEFUN_VOID(getgrent)
{
static PTR info = NULL;
if (info == NULL)
{
info = __grpalloc();
if (info == NULL)
return(NULL);
}
if (stream == NULL)
{
stream = __grpopen();
if (stream == NULL)
return(NULL);
}
return(__grpread(stream, info));
}

View File

@@ -0,0 +1,50 @@
/* Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stddef.h>
#include <stdio.h>
#include <sys/types.h>
#include <grp.h>
/* Search for an entry with a matching group ID. */
struct group *
DEFUN(getgrgid, (gid), register gid_t gid)
{
static PTR info = NULL;
register FILE *stream;
register struct group *g;
if (info == NULL)
{
info = __grpalloc();
if (info == NULL)
return NULL;
}
stream = __grpopen();
if (stream == NULL)
return NULL;
while ((g = __grpread(stream, info)) != NULL)
if (g->gr_gid == (gid_t) gid)
break;
(void) fclose(stream);
return g;
}

View File

@@ -0,0 +1,50 @@
/* Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <grp.h>
/* Search for an entry with a matching name. */
struct group *
DEFUN(getgrnam, (name), register CONST char *name)
{
static PTR info = NULL;
register FILE *stream;
register struct group *g;
if (info == NULL)
{
info = __grpalloc();
if (info == NULL)
return NULL;
}
stream = __grpopen();
if (stream == NULL)
return NULL;
while ((g = __grpread(stream, info)) != NULL)
if (!strcmp(g->gr_name, name))
break;
(void) fclose(stream);
return g;
}

View File

@@ -0,0 +1,98 @@
/* Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
/*
* POSIX Standard: 9.2.1 Group Database Access <grp.h>
*/
#ifndef _GRP_H
#define _GRP_H 1
#include <features.h>
#include <gnu/types.h>
/* The group structure. */
struct group
{
char *gr_name; /* Group name. */
char *gr_passwd; /* Password. */
__gid_t gr_gid; /* Group ID. */
char **gr_mem; /* Member list. */
};
#if defined(__USE_SVID) || defined(__USE_GNU)
#define __need_FILE
#include <stdio.h>
#endif
#ifdef __USE_GNU
/* Return a new stream open on the group file. */
extern FILE *EXFUN(__grpopen, (NOARGS));
/* Read a group entry from STREAM, filling in G.
Return the `struct group' of G if successful, NULL on failure. */
extern struct group *EXFUN(__grpread, (FILE *__stream, PTR __g));
/* Return a chunk of memory containing pre-initialized data for __grpread. */
extern PTR EXFUN(__grpalloc, (NOARGS));
#endif
#if defined(__USE_SVID) || defined(__USE_MISC)
/* Rewind the group-file stream. */
extern void EXFUN(setgrent, (NOARGS));
/* Close the group-file stream. */
extern void EXFUN(endgrent, (NOARGS));
/* Read an entry from the group-file stream, opening it if necessary. */
extern struct group *EXFUN(getgrent, (NOARGS));
#endif
#ifdef __USE_SVID
/* Read a group entry from STREAM. */
extern struct group *EXFUN(fgetgrent, (FILE *__stream));
#endif
/* Search for an entry with a matching group ID. */
extern struct group *EXFUN(getgrgid, (__gid_t __gid));
/* Search for an entry with a matching group name. */
extern struct group *EXFUN(getgrnam, (CONST char *__name));
#ifdef __USE_BSD
#define __need_size_t
#include <stddef.h>
/* Set the group set for the current user to GROUPS (N of them). */
extern int EXFUN(setgroups, (size_t __n, CONST __gid_t *groups));
/* Initialize the group set for the current user
by reading the group database and using all groups
of which USER is a member. Also include GROUP. */
extern int EXFUN(initgroups, (CONST char *user, __gid_t group));
#endif /* Use BSD. */
#endif /* grp.h */

View File

@@ -0,0 +1,28 @@
/* Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stdio.h>
#include <grp.h>
/* Return a new stream open on the group file. */
FILE *
DEFUN_VOID(__grpopen)
{
return fopen("/etc/group", "r");
}

View File

@@ -0,0 +1,135 @@
/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <errno.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <grp.h>
/* This is the function that all the others are based on.
The format of the group file is known only here. */
/* Structure containing info kept by each __grpread caller. */
typedef struct
{
char *buf;
size_t buflen;
size_t max_members;
char **members;
struct group g;
} grpread_info;
/* Return a chunk of memory containing a pre-initialized `grpread_info'. */
PTR
DEFUN_VOID(__grpalloc)
{
grpread_info *info = (PTR) malloc (sizeof(grpread_info));
if (info == NULL)
return NULL;
info->buf = NULL;
info->buflen = 0;
info->max_members = 5;
info->members = (char **) malloc (5 * sizeof(char *));
if (info->members == NULL)
{
free ((PTR) info);
return NULL;
}
return info;
}
/* Read a group entry from STREAM, filling in G. */
struct group *
DEFUN(__grpread, (stream, g), FILE *stream AND PTR CONST g)
{
register grpread_info *CONST info = (grpread_info *) g;
char *start, *end;
register size_t i;
/* Idiocy checks. */
if (stream == NULL)
{
errno = EINVAL;
return NULL;
}
do
if (__getline (&info->buf, &info->buflen, stream) == -1)
return NULL;
while (info->buf[0] == '#');
start = info->buf;
end = strchr (start, ':');
if (end == NULL)
return NULL;
*end = '\0';
info->g.gr_name = start;
start = end + 1;
end = strchr (start, ':');
if (end == NULL)
return NULL;
*end = '\0';
info->g.gr_passwd = start;
info->g.gr_gid = (gid_t) strtol (end + 1, &end, 10);
if (*end != ':')
return NULL;
i = 0;
do
{
start = end + 1;
end = strchr (start, ',');
if (end == NULL)
{
end = strchr (start, '\n');
if (end == start)
break;
if (end == NULL)
return NULL;
*end = '\0';
end = NULL;
}
else
*end = '\0';
if (i == info->max_members - 2)
{
info->max_members += 5;
info->members = (char **)
realloc ((PTR) info->members, info->max_members * sizeof (char *));
if (info->members == NULL)
return NULL;
}
info->members[i++] = start;
} while (end != NULL);
info->members[i] = NULL;
info->g.gr_mem = info->members;
return &info->g;
}

View File

@@ -0,0 +1,65 @@
/* Copyright (C) 1989, 1991 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <unistd.h>
#include <string.h>
#include <grp.h>
#include <limits.h>
#include <sys/types.h>
/* Initialize the group set for the current user
by reading the group database and using all groups
of which USER is a member. Also include GROUP. */
int
DEFUN(initgroups, (user, group),
CONST char *user AND gid_t group)
{
static PTR info = NULL;
register FILE *stream;
register struct group *g;
gid_t groups[NGROUPS_MAX];
register size_t n;
if (info == NULL)
{
info = __grpalloc();
if (info == NULL)
return -1;
}
stream = __grpopen();
if (stream == NULL)
return -1;
n = 0;
groups[n++] = group;
while (n < NGROUPS_MAX && (g = __grpread(stream, info)) != NULL)
if (g->gr_gid != group)
{
register char **m;
for (m = g->gr_mem; *m != NULL; ++m)
if (!strcmp(*m, user))
groups[n++] = g->gr_gid;
}
return setgroups(n, groups);
}

View File

@@ -0,0 +1,40 @@
#include <ansidecl.h>
#include <grp.h>
#include <pwd.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int
DEFUN_VOID(main)
{
uid_t me;
struct passwd *my_passwd;
struct group *my_group;
char **members;
me = getuid ();
my_passwd = getpwuid (me);
printf ("My login name is %s.\n", my_passwd->pw_name);
printf ("My uid is %d.\n", (int)(my_passwd->pw_uid));
printf ("My home directory is %s.\n", my_passwd->pw_dir);
printf ("My default shell is %s.\n", my_passwd->pw_shell);
my_group = getgrgid (my_passwd->pw_gid);
if (!my_group) {
printf ("Couldn't find out about group %d.\n", (int)(my_passwd->pw_gid));
exit (EXIT_FAILURE);
}
printf ("My default group is %s (%d).\n",
my_group->gr_name, (int)(my_passwd->pw_gid));
printf ("The members of this group are:\n");
for (members = my_group->gr_mem; *members != NULL; ++members)
printf (" %s\n", *members);
exit (EXIT_SUCCESS);
}