diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-09-17 19:51:33 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-09-17 19:51:33 +0000 |
commit | 9b3c7c3c713d7018c79f0b0ca0b34d386e8a25dd (patch) | |
tree | 77802928e3a7d3163bc63c89979295da8260112a /login/programs/pt_chown.c | |
parent | d8f2b9ea8cf4fb6d043f2dbbeaaca04d4fd70fc6 (diff) | |
download | glibc-9b3c7c3c713d7018c79f0b0ca0b34d386e8a25dd.tar glibc-9b3c7c3c713d7018c79f0b0ca0b34d386e8a25dd.tar.gz glibc-9b3c7c3c713d7018c79f0b0ca0b34d386e8a25dd.tar.bz2 glibc-9b3c7c3c713d7018c79f0b0ca0b34d386e8a25dd.zip |
Update.
1998-09-17 19:34 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/sysv4/bits/utsname.h: Fix typo.
Patch by John Tobey <jtobey@banta-im.com>.
1998-09-17 Mark Kettenis <kettenis@phys.uva.nl>
* login/pty-internal.h: Removed. Moved constants related to the
`grantpt' helper program protocol to ...
* login/pty-private.h: ... here. New file.
* sysdeps/unix/sysv/linux/ptsname.c (ptsname): Reimplementation
to make the function work with kernels >= 2.1.115.
* sysdeps/unix/sysv/linux/getpt.c (getpt): Reimplement to call BSD
version if using the cloning device fails.
* sysdeps/unix/sysv/linux/grantpt.c: New file.
* sysdeps/unix/sysv/linux/unlockpt.c: General cleanup.
* sysdeps/unix/bsd/getpt.c (__getpt): Largely rewritten to allow
use by Linux specific code.
* sysdeps/unix/bsd/unlockpt.c: General cleanup.
* sysdeps/unix/grantpt.c: Largely rewritten. (pts_name): New
function. (grantpt): Use pts_name, check group and permission
mode in addition to owner. Try to set the owner, group and
permission mode first without invoking the helper program.
* login/programs/pt_chown.c: Largely rewritten. Add argp and
internationalization support. Use symbolic constants instead of
hardwired numbers for permission mode.
* sysdeps/unix/bsd/ptsname.c: New file.
1998-09-17 22:04 Tim Waugh <tim@cyberelk.demon.co.uk>
* posix/wordexp-test.c: Undo last change.
* posix/wordexp.c: Undo last change.
Diffstat (limited to 'login/programs/pt_chown.c')
-rw-r--r-- | login/programs/pt_chown.c | 153 |
1 files changed, 109 insertions, 44 deletions
diff --git a/login/programs/pt_chown.c b/login/programs/pt_chown.c index dbf79fc6ad..6ed8e82d5b 100644 --- a/login/programs/pt_chown.c +++ b/login/programs/pt_chown.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1998 Free Software Foundation, Inc. +/* pt_chmod - helper program for `grantpt'. + Copyright (C) 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by C. Scott Ananian <cananian@alumni.princeton.edu>, 1998. @@ -17,72 +18,136 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* pt_chmod.c ... securely implement grantpt in user-land. */ - -#include <sys/stat.h> -#include <sys/types.h> -#include <stdlib.h> -#include <unistd.h> +#include <argp.h> #include <errno.h> -#include <stdio.h> +#include <error.h> #include <grp.h> +#include <libintl.h> +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <unistd.h> + +#include "pty-private.h" -#include "pty-internal.h" -#define Str(x) _Str(x) -#define _Str(x) #x +/* Get libc version number. */ +#include "../version.h" -void -usage (void) +#define PACKAGE _libc_intl_domainname + +/* Name and version of program. */ +static void print_version (FILE *stream, struct argp_state *state); +void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version; + +/* Function to print some extra text in the help message. */ +static char *more_help (int key, const char *text, void *input); + +/* Data structure to communicate with argp functions. */ +static struct argp argp = { - fprintf (stderr, _("usage: pt_chown FD>&%s\n" - "This program is used internally by grantpt(3).\n"), - Str (PTY_FD)); - exit (0); + NULL, NULL, NULL, NULL, NULL, more_help +}; + + +/* Print the version information. */ +static void +print_version (FILE *stream, struct argp_state *state) +{ + fprintf (stream, "pt_chmod (GNU %s) %s\n", PACKAGE, VERSION); + fprintf (stream, gettext ("\ +Copyright (C) %s Free Software Foundation, Inc.\n\ +This is free software; see the source for copying conditions. There is NO\n\ +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ +"), "1998"); } -void -bad_installation (void) +static char * +more_help (int key, const char *text, void *input) { - fputs (_("pt_chown: installation problem: " - "This program needs to be setuid root.\n"), stderr); - exit (FAIL_EXEC); + char *cp; + + switch (key) + { + case ARGP_KEY_HELP_PRE_DOC: + asprintf (&cp, gettext ("\ +Set the owner, group and access permission of the terminal passed on\ + file descriptor `%d'. This is the helper program for the `grantpt'\ + function. It is not intended to be run directly from the command\ + line.\n"), + PTY_FILENO); + return cp; + case ARGP_KEY_HELP_EXTRA: + /* We print some extra information. */ + asprintf (&cp, gettext ("\ +The owner is set to the current user, the group is set to `%s',\ + and the access permission is set to `%o'.\n\n\ +%s"), + TTY_GROUP, S_IRUSR|S_IWUSR|S_IWGRP, gettext ("\ +Report bugs using the `glibcbug' script to <bugs@gnu.org>.\n")); + return cp; + default: + break; + } + return (char *) text; } int -main (int argc, char **argv) +main (int argc, char *argv[]) { - struct group *grp; - struct stat s; char *pty; + int remaining; + struct stat st; + struct group *p; gid_t gid; - uid_t uid; - if (argc != 1) - usage (); + /* Set locale via LC_ALL. */ + setlocale (LC_ALL, ""); + + /* Set the text message domain. */ + textdomain (PACKAGE); + + /* parse and process arguments. */ + argp_parse (&argp, argc, argv, 0, &remaining, NULL); + + if (remaining < argc) + { + /* We should not be called with any non-option parameters. */ + error (0, 0, gettext ("too many arguments")); + argp_help (&argp, stdout, ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR, + program_invocation_short_name); + exit (EXIT_FAILURE); + } + + /* Check if we are properly installed. */ if (geteuid () != 0) - bad_installation (); - - grp = getgrnam (TTY_GROUP); - gid = grp ? grp->gr_gid : getgid (); - uid = getuid (); + error (FAIL_EXEC, 0, gettext ("needs to be installed setuid `root'")); - /* Check that fd is a valid pty master -- call ptsname(). */ - pty = ptsname (PTY_FD); + /* Check that PTY_FILENO is a valid master pseudo terminal. */ + pty = ptsname (PTY_FILENO); if (pty == NULL) return errno == EBADF ? FAIL_EBADF : FAIL_EINVAL; - close (PTY_FD); + close (PTY_FILENO); - /* Check that target file is a character device. */ - if (stat (pty, &s)) - return FAIL_EINVAL; /* This should only fail if pty doesn't exist. */ - if (!S_ISCHR (s.st_mode)) + /* Check that the returned slave pseudo terminal is a + character device. */ + if (stat (pty, &st) < 0 || !S_ISCHR(st.st_mode)) return FAIL_EINVAL; - if (chmod (pty, 0620)) - return FAIL_EACCES; /* XXX: Probably not true. */ + /* Get the group ID of the special `tty' group. */ + p = getgrnam (TTY_GROUP); + gid = p ? p->gr_gid : getgid (); + + /* Set the owner to the real user ID, and the group to that special + group ID. */ + if (chown (pty, getuid (), gid) < 0) + return FAIL_EACCES; - if (chown (pty, uid, gid)) + /* Set the permission mode to readable and writable by the owner, + and writable by the group. */ + if (chmod (pty, S_IRUSR|S_IWUSR|S_IWGRP) < 0) return FAIL_EACCES; - return 0; + exit (EXIT_SUCCESS); } |