bert@bebux.UUCP (Bert Reuling) (01/06/89)
[ This is a replacement for chown(1). As I didn't receive a chgrp(1) with MINIX-ST, I wrote one myself. This resulted in this program. This chown (chgrp) accepts decimal UID's (GID's) as well as owner (group) names. ] #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive" # # Contents: # # README # Makefile # chown.c # # Wrapped by bert@tjilp on Thu Jan 5 13:46:16 1989 PATH=/bin:/usr/bin:/usr/local/bin ; export PATH if test -f 'README' -a "${1}" != "-c" then echo "$0: Will not overwrite existing file: README" else echo "x - README (1074 characters)" sed 's/^X//' <<\END_OF_SHAR >README X X X chown(1), X chgrp(1). X X Copyright (c) 1989 X X Bert Reuling X X X This program may be copied freely X X X Chown(1) changes the owner of files to 'owner'. The 'owner' X may be a decimal UID or a login name found in /etc/passwd. X X Chgrp(1) changes the group-ID of files to 'group'. The X 'group' may be either a decimal GID or a group name found in X /etc/group. X X Only the super-user can change owner or group. Note that X chgrp(1) is a link to chown(1) rather than a separate X program. X X Please send any suggestions, bug reports, etc,.. to: X X X ...!hp4nl!bebux!bert X X X / / Bert Reuling X /-, ,--, ,-, /- p/a Radio Holland bv X / / /--- / / Jan Rebelstraat 20 X `-' `-- ` `-- 1069 CC Amsterdam X The Netherlands X X MINIX werkgroep UNIXgg/HCC END_OF_SHAR if test 1074 -ne `wc -c <'README'` then echo "$0: unpacked with wrong size: README" fi fi if test -f 'Makefile' -a "${1}" != "-c" then echo "$0: Will not overwrite existing file: Makefile" else echo "x - Makefile (415 characters)" sed 's/^X//' <<\END_OF_SHAR >Makefile X# X# chown, chgrp - change owner or group X# XINSTALLDIR=/usr/bin XCFLAGS=-O X# Xchown: chown.c X cc -o chown chown.c X# Xinstall: chown X mv chown $(INSTALLDIR)/chown X ln $(INSTALLDIR)/chown $(INSTALLDIR)/chgrp X chmem =2000 $(INSTALLDIR)/chown X chown bin $(INSTALLDIR)/chown X chgrp bin $(INSTALLDIR)/chown X chmod 755 $(INSTALLDIR)/chown X# Xclean: X -rm -f core chown.o X# Xarchive: X shar README Makefile chown.c >chown.shar END_OF_SHAR if test 415 -ne `wc -c <'Makefile'` then echo "$0: unpacked with wrong size: Makefile" fi fi if test -f 'chown.c' -a "${1}" != "-c" then echo "$0: Will not overwrite existing file: chown.c" else echo "x - chown.c (1836 characters)" sed 's/^X//' <<\END_OF_SHAR >chown.c X/* X * chown, chgrp - change owner or group. Author: Bert Reuling X */ X#include <sys/types.h> X#include <sys/stat.h> X#include <stdio.h> X#include <ctype.h> X#include <pwd.h> X#include <grp.h> X X#ifndef TRUE X#define TRUE 1 X#define FALSE 0 X#endif X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ X int i, uid, gid, owner, status = 0; X struct passwd *pwd, *getpwuid(), *getpwnam(); X struct group *grp, *getgrgid(), *getgrnam(); X struct stat st; X X if (strcmp(argv[0], "chown") == 0) X owner = TRUE; X else if (strcmp(argv[0], "chgrp") == 0) X owner = FALSE; X else { X fprintf(stderr, "%s: should be named \"chown\" or \"chgrp\"\n", argv[0]); X exit(1); X } X X if (argc < 3) { X fprintf (stderr,"Usage: %s %s file ...\n", argv[0], (owner) ? "owner" : "group"); X exit(1); X } X X if (isdigit(argv[1][0])) { X if (owner) X pwd = getpwuid(atoi(argv[1])); X else X grp = getgrgid(atoi(argv[1])); X } X else { X if (owner) X pwd = getpwnam(argv[1]); X else X grp = getgrnam(argv[1]); X } X X if (owner && (pwd == NULL)) { X fprintf(stderr, "%s: unknown user\n", argv[0]); X exit(1); X } X if (!owner && (grp == NULL)) { X fprintf(stderr, "%s: unknown group\n", argv[0]); X exit(1); X } X for (i = 2; i < argc; i++) { X if (stat(argv[i], &st) != -1) { X if (owner) { X uid = pwd->pw_uid; /* new owner */ X gid = st.st_gid; /* old group */ X } X else { X uid = st.st_uid; /* old owner */ X gid = grp->gr_gid; /* new group */ X } X if (chown(argv[i], uid, gid) == -1) { X fprintf(stderr,"%s: not changed\n", argv[i]); X status++; X } X } X else { X perror(argv[i]); X status++; X } X } X exit(status); X} END_OF_SHAR if test 1836 -ne `wc -c <'chown.c'` then echo "$0: unpacked with wrong size: chown.c" fi fi echo "End of archive" exit 0 # # #