Files
oldlinux-files/study/linux-travel/MINIX-1.5/1.5/Source/commands/chgrp.c
2024-02-19 00:25:23 -05:00

101 lines
2.0 KiB
C

/* chgrp - change group Author: Bert Reuling */
/* This program is also chown.c */
/*
* 89Dec07 Blayne Puklich Modified so that it checks its BASENAME
* rather than the whole argv[0] to see who it should be.
* Added slash(), which comes from dosread.c.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include <pwd.h>
#include <grp.h>
#include <stdio.h>
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
char *slash( /* char *str */ );
main(argc, argv)
int argc;
char *argv[];
{
int i, uid, gid, owner, status = 0;
struct passwd *pwd, *getpwuid(), *getpwnam();
struct group *grp, *getgrgid(), *getgrnam();
struct stat st;
char *name = slash(argv[0]);
if (strcmp(name, "chown") == 0)
owner = TRUE;
else if (strcmp(name, "chgrp") == 0)
owner = FALSE;
else {
fprintf(stderr, "%s: should be named \"chown\" or \"chgrp\"\n", name);
exit(1);
}
if (argc < 3) {
fprintf(stderr,
"Usage: %s %s file ...\n", name, (owner) ? "owner" : "group");
exit(1);
}
if (isdigit(argv[1][0])) {
if (owner)
pwd = getpwuid(atoi(argv[1]));
else
grp = getgrgid(atoi(argv[1]));
} else {
if (owner)
pwd = getpwnam(argv[1]);
else
grp = getgrnam(argv[1]);
}
if (owner && (pwd == (struct passwd *) 0)) {
fprintf(stderr, "%s: unknown user\n", name);
exit(1);
}
if (!owner && (grp == (struct group *) 0)) {
fprintf(stderr, "%s: unknown group\n", name);
exit(1);
}
for (i = 2; i < argc; i++) {
if (stat(argv[i], &st) != -1) {
if (owner) {
uid = pwd->pw_uid; /* new owner */
gid = st.st_gid; /* old group */
} else {
uid = st.st_uid; /* old owner */
gid = grp->gr_gid; /* new group */
}
if (chown(argv[i], uid, gid) == -1) {
fprintf(stderr, "%s: not changed\n", argv[i]);
status++;
}
} else {
perror(argv[i]);
status++;
}
}
exit(status);
}
/* Stolen from dosread.c 89Dec07 Blayne Puklich */
char *slash(str)
register char *str;
{
register char *result = str;
while (*str)
if (*str++ == '/') result = str;
return result;
}