* Copyright (c) 1988 Regents of the University of California.
* %sccs.include.redist.c%
"@(#) Copyright (c) 1988 Regents of the University of California.\n\
static char sccsid
[] = "@(#)chown.c 5.15 (Berkeley) %G%";
int ischown
, uid
, gid
, fflag
, rflag
, retval
;
char curpath
[MAXPATHLEN
], *reset
, *index(), *rindex();
myname
= (cp
= rindex(*argv
, '/')) ? cp
+ 1 : *argv
;
ischown
= myname
[2] == 'o';
while ((ch
= getopt(argc
, argv
, "Rf")) != EOF
)
if (cp
= index(*argv
, '.')) {
if (reset
= index(*argv
, '/'))
if (reset
&& chdir(curpath
)) {
struct group
*gr
, *getgrnam();
gid
= -1; /* argument was "uid." */
for (gname
= s
; *s
&& isdigit(*s
); ++s
);
if (!(gr
= getgrnam(gname
))) {
(void)fprintf(stderr
, "%s: unknown group id: %s\n",
struct passwd
*pwd
, *getpwnam();
uid
= -1; /* argument was ".gid" */
for (beg
= s
; *s
&& isdigit(*s
); ++s
);
if (!(pwd
= getpwnam(beg
))) {
"chown: unknown user id: %s\n", beg
);
register struct dirent
*dp
;
if (chown(file
, uid
, gid
)) {
if ((buf
.st_mode
& S_IFMT
) == S_IFDIR
) {
if (chdir(file
) < 0 || !(dirp
= opendir("."))) {
for (dp
= readdir(dirp
); dp
; dp
= readdir(dirp
)) {
if (dp
->d_name
[0] == '.' && (!dp
->d_name
[1] ||
dp
->d_name
[1] == '.' && !dp
->d_name
[2]))
static int euid
= -1, ngroups
= -1;
/* check for chown without being root */
if (errno
!= EPERM
|| uid
!= -1 && euid
== -1 && (euid
= geteuid())) {
/* check group membership; kernel just returns EPERM */
if (gid
!= -1 && ngroups
== -1) {
ngroups
= getgroups(NGROUPS
, groups
);
while (--ngroups
>= 0 && gid
!= groups
[ngroups
]);
"%s: you are not a member of group %s.\n",
(void)fprintf(stderr
, "%s: %s: %s\n", myname
, s
, strerror(errno
));
(void)fprintf(stderr
, "usage: %s [-Rf] %s file ...\n", myname
,
ischown
? "owner[.group]" : "group");