| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| save_IFS="${IFS}" |
| IFS="${IFS}:" |
| gettext_dir=FAILED |
| locale_dir=FAILED |
| first_param="$1" |
| for dir in $PATH |
| do |
| if test "$gettext_dir" = FAILED && test -f $dir/gettext \ |
| && ($dir/gettext --version >/dev/null 2>&1) |
| then |
| set `$dir/gettext --version 2>&1` |
| if test "$3" = GNU |
| then |
| gettext_dir=$dir |
| fi |
| fi |
| if test "$locale_dir" = FAILED && test -f $dir/shar \ |
| && ($dir/shar --print-text-domain-dir >/dev/null 2>&1) |
| then |
| locale_dir=`$dir/shar --print-text-domain-dir` |
| fi |
| done |
| IFS="$save_IFS" |
| if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED |
| then |
| echo=echo |
| else |
| TEXTDOMAINDIR=$locale_dir |
| export TEXTDOMAINDIR |
| TEXTDOMAIN=sharutils |
| export TEXTDOMAIN |
| echo="$gettext_dir/gettext -s" |
| fi |
| if touch -am -t 200112312359.59 $$.touch >/dev/null 2>&1 && test ! -f 200112312359.59 -a -f $$.touch; then |
| shar_touch='touch -am -t $1$2$3$4$5$6.$7 "$8"' |
| elif touch -am 123123592001.59 $$.touch >/dev/null 2>&1 && test ! -f 123123592001.59 -a ! -f 123123592001.5 -a -f $$.touch; then |
| shar_touch='touch -am $3$4$5$6$1$2.$7 "$8"' |
| elif touch -am 1231235901 $$.touch >/dev/null 2>&1 && test ! -f 1231235901 -a -f $$.touch; then |
| shar_touch='touch -am $3$4$5$6$2 "$8"' |
| else |
| shar_touch=: |
| echo |
| $echo 'WARNING: not restoring timestamps. Consider getting and' |
| $echo "installing GNU \`touch', distributed in GNU File Utilities..." |
| echo |
| fi |
| rm -f 200112312359.59 123123592001.59 123123592001.5 1231235901 $$.touch |
| |
| if mkdir _sh10937; then |
| $echo 'x -' 'creating lock directory' |
| else |
| $echo 'failed to create lock directory' |
| exit 1 |
| fi |
| |
| if test -f 'Makefile' && test "$first_param" != -c; then |
| $echo 'x -' SKIPPING 'Makefile' '(file already exists)' |
| else |
| $echo 'x -' extracting 'Makefile' '(text)' |
| sed 's/^X//' << 'SHAR_EOF' > 'Makefile' && |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| X |
| |
| |
| |
| |
| |
| |
| |
| |
| X |
| |
| X |
| |
| |
| |
| |
| |
| |
| |
| |
| X |
| |
| |
| X |
| |
| X |
| extern int optind; |
| extern char *optarg; |
| static char *adduser = NULL; |
| static char *deluser = NULL; |
| static char *thisgroup = NULL; |
| static int purge = FALSE; |
| static int list = FALSE; |
| static int exclusive = 0; |
| X |
| static int isroot(void) { |
| X return getuid() ? FALSE : TRUE; |
| } |
| X |
| static int isgroup(void) { |
| X gid_t g = getgid(); |
| X struct group *grp = getgrgid(g); |
| X |
| X return TRUE; |
| } |
| X |
| static char *whoami(void) { |
| X struct group *grp = getgrgid(getgid()); |
| X struct passwd *usr = getpwuid(getuid()); |
| X |
| X if (0 == strcmp(usr->pw_name, grp->gr_name)) { |
| X return (char *)strdup(usr->pw_name); |
| X } else { |
| X return NULL; |
| X } |
| } |
| X |
| static void |
| addtogroup(char *user, char **members) { |
| X int i; |
| X char **pmembers; |
| X |
| X for (i = 0; NULL != members[i]; i++ ) { |
| X if (0 == strcmp(user, members[i])) { |
| X fprintf(stderr, "Member already exists\n"); |
| X exit(EXIT_MEMBER_EXISTS); |
| X } |
| X } |
| X |
| X if (0 == i) { |
| X pmembers = (char **)calloc(2, sizeof(char *)); |
| X } else { |
| X pmembers = (char **)realloc(members, sizeof(char *)*(i+1)); |
| X } |
| X |
| X *members = *pmembers; |
| X members[i] = user; |
| X members[i+1] = NULL; |
| } |
| X |
| static void |
| rmfromgroup(char *user, char **members) { |
| X int i; |
| X int found = FALSE; |
| X |
| X i = 0; |
| X while (!found && NULL != members[i]) { |
| X if (0 == strcmp(user, members[i])) { |
| X found = TRUE; |
| X } else { |
| X i++; |
| X } |
| X } |
| X |
| X while (found && NULL != members[i]) { |
| X members[i] = members[++i]; |
| X } |
| X |
| X if (!found) { |
| X fprintf(stderr, "Member to remove could not be found\n"); |
| X exit(EXIT_NOT_MEMBER); |
| X } |
| } |
| X |
| static void |
| nomembers(char **members) { |
| X int i; |
| X |
| X for (i = 0; NULL != members[i]; i++ ) { |
| X members[i] = NULL; |
| X } |
| } |
| X |
| static void |
| members(char **members) { |
| X int i; |
| X |
| X for (i = 0; NULL != members[i]; i++ ) { |
| X printf("%s ", members[i]); |
| X |
| X if (NULL == members[i+1]) { |
| X printf("\n"); |
| X } else { |
| X printf(" "); |
| X } |
| X } |
| } |
| X |
| static void usage(void) { |
| X fprintf(stderr, "usage: groupmems -a username | -d username | -D | -l [-g groupname]\n"); |
| X exit(EXIT_USAGE); |
| } |
| X |
| main(int argc, char **argv) { |
| X int arg, i; |
| X char *name; |
| X struct group *grp; |
| X |
| X while ((arg = getopt(argc, argv, "a:d:g:Dl")) != EOF) { |
| X switch (arg) { |
| X case 'a': |
| X adduser = strdup(optarg); |
| X ++exclusive; |
| X break; |
| X case 'd': |
| X deluser = strdup(optarg); |
| X ++exclusive; |
| X break; |
| X case 'g': |
| X thisgroup = strdup(optarg); |
| X break; |
| X case 'D': |
| X purge = TRUE; |
| X ++exclusive; |
| X break; |
| X case 'l': |
| X list = TRUE; |
| X ++exclusive; |
| X break; |
| X default: |
| X usage(); |
| X } |
| X } |
| X |
| X if (exclusive > 1 || optind < argc) { |
| X usage(); |
| X } |
| X |
| X if (!isroot() && NULL != thisgroup) { |
| X fprintf(stderr, "Only root can add members to different groups\n"); |
| X exit(EXIT_NOT_ROOT); |
| X } else if (isroot() && NULL != thisgroup) { |
| X name = thisgroup; |
| X } else if (!isgroup()) { |
| X fprintf(stderr, "Group access is required\n"); |
| X exit(EXIT_NOT_EROOT); |
| X } else if (NULL == (name = whoami())) { |
| X fprintf(stderr, "Not primary owner of current group\n"); |
| X exit(EXIT_NOT_PRIMARY); |
| X } |
| X |
| X if (!gr_lock()) { |
| X fprintf(stderr, "Unable to lock group file\n"); |
| X exit(EXIT_GROUP_FILE); |
| X } |
| X |
| X if (!gr_open(O_RDWR)) { |
| X fprintf(stderr, "Unable to open group file\n"); |
| X exit(EXIT_GROUP_FILE); |
| X } |
| X |
| X grp = (struct group *)gr_locate(name); |
| X |
| X if (NULL != adduser) { |
| X addtogroup(adduser, grp->gr_mem); |
| X gr_update(grp); |
| X } else if (NULL != deluser) { |
| X rmfromgroup(deluser, grp->gr_mem); |
| X gr_update(grp); |
| X } else if (purge) { |
| X nomembers(grp->gr_mem); |
| X gr_update(grp); |
| X } else if (list) { |
| X members(grp->gr_mem); |
| X } |
| X |
| X if (!gr_close()) { |
| X fprintf(stderr, "Cannot close group file\n"); |
| X exit(EXIT_GROUP_FILE); |
| X } |
| X |
| X gr_unlock(); |
| X |
| X exit(EXIT_SUCCESS); |
| } |
| X |
| |
| SHAR_EOF |
| (set 20 00 05 25 14 36 38 'groupmems.c'; eval "$shar_touch") && |
| chmod 0644 'groupmems.c' || |
| $echo 'restore of' 'groupmems.c' 'failed' |
| if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ |
| && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then |
| md5sum -c << SHAR_EOF >/dev/null 2>&1 \ |
| || $echo 'groupmems.c:' 'MD5 check failed' |
| f0dd68f8d762d89d24d3ce1f4141f981 groupmems.c |
| SHAR_EOF |
| else |
| shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'groupmems.c'`" |
| test 6348 -eq "$shar_count" || |
| $echo 'groupmems.c:' 'original size' '6348,' 'current size' "$shar_count!" |
| fi |
| fi |
| |
| if test -f 'groupmems.8' && test "$first_param" != -c; then |
| $echo 'x -' SKIPPING 'groupmems.8' '(file already exists)' |
| else |
| $echo 'x -' extracting 'groupmems.8' '(text)' |
| sed 's/^X//' << 'SHAR_EOF' > 'groupmems.8' && |
| X.\" |
| X.\" Copyright 2000, International Business Machines, Inc. |
| X.\" All rights reserved. |
| X.\" |
| X.\" original author: George Kraft IV, gk4@us.ibm.com |
| X.\" |
| X.\" Redistribution and use in source and binary forms, with or without |
| X.\" modification, are permitted provided that the following conditions |
| X.\" are met: |
| X.\" |
| X.\" 1. Redistributions of source code must retain the above copyright |
| X.\" notice, this list of conditions and the following disclaimer. |
| X.\" 2. Redistributions in binary form must reproduce the above copyright |
| X.\" notice, this list of conditions and the following disclaimer in the |
| X.\" documentation and/or other materials provided with the distribution. |
| X.\" 3. Neither the name of International Business Machines, Inc., nor the |
| X.\" names of its contributors may be used to endorse or promote products |
| X.\" derived from this software without specific prior written permission. |
| X.\" |
| X.\" THIS SOFTWARE IS PROVIDED BY INTERNATIONAL BUSINESS MACHINES, INC. AND |
| X.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
| X.\" BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
| X.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL |
| X.\" INTERNATIONAL BUSINESS MACHINES, INC. OR CONTRIBUTORS BE LIABLE |
| X.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| X.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| X.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| X.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| X.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| X.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| X.\" SUCH DAMAGE. |
| X.\" |
| X.\" $Id$ |
| X.\" |
| X.TH GROUPMEMS 8 |
| X.SH NAME |
| groupmems \- Administer members of a user's primary group |
| X.SH SYNOPSIS |
| X.B groupmems |
| \fB-a\fI user_name \fR | |
| \fB-d\fI user_name \fR | |
| \fB-l\fR | |
| \fB-D\fR | |
| [\fB-g\fI group_name \fR] |
| X.SH DESCRIPTION |
| The \fBgroupmems\fR utility allows a user to administer their own |
| group membership list without the requirement of superuser privileges. |
| The \fBgroupmems\fR utility is for systems that configure its users to |
| be in their own name sake primary group (i.e., guest / guest). |
| X.P |
| Only the superuser, as administrator, can use \fBgroupmems\fR to alter |
| the memberships of other groups. |
| X.IP "\fB-a \fIuser_name\fR" |
| Add a new user to the group membership list. |
| X.IP "\fB-d \fIuser_name\fR" |
| Delete a user from the group membership list. |
| X.IP "\fB-l\fR" |
| List the group membership list. |
| X.IP "\fB-D\fR" |
| Delete all users from the group membership list. |
| X.IP "\fB-g \fIgroup_name\fR" |
| The superuser can specify which group membership list to modify. |
| X.SH SETUP |
| The \fBgroupmems\fR executable should be in mode \fB2770\fR as user \fBroot\fR |
| and in group \fBgroups\fR. The system administrator can add users to |
| group groups to allow or disallow them using the \fBgroupmems\fR utility |
| to manager their own group membership list. |
| X.P |
| X $ groupadd -r groups |
| X.br |
| X $ chmod 2770 groupmems |
| X.br |
| X $ chown root.groups groupmems |
| X.br |
| X $ groupmems -g groups -a gk4 |
| X.SH FILES |
| /etc/group |
| X.br |
| /etc/gshadow |
| X.SH SEE ALSO |
| X.BR chfn (1), |
| X.BR chsh (1), |
| X.BR useradd (8), |
| X.BR userdel (8), |
| X.BR usermod (8), |
| X.BR passwd (1), |
| X.BR groupadd (8), |
| X.BR groupdel (8) |
| X.SH AUTHOR |
| George Kraft IV (gk4@us.ibm.com) |
| X.\" EOF |
| SHAR_EOF |
| (set 20 00 05 25 14 38 23 'groupmems.8'; eval "$shar_touch") && |
| chmod 0600 'groupmems.8' || |
| $echo 'restore of' 'groupmems.8' 'failed' |
| if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ |
| && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then |
| md5sum -c << SHAR_EOF >/dev/null 2>&1 \ |
| || $echo 'groupmems.8:' 'MD5 check failed' |
| 181e6cd3a3c9d3df320197fa2cde2b4a groupmems.8 |
| SHAR_EOF |
| else |
| shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'groupmems.8'`" |
| test 3372 -eq "$shar_count" || |
| $echo 'groupmems.8:' 'original size' '3372,' 'current size' "$shar_count!" |
| fi |
| fi |
| rm -fr _sh10937 |
| exit 0 |
| |