This patch from Lars Kellogg-Stedman, fixes the behavior of

chown to be consistant with GNU chown, so that it follows
symlinks (who cares about the perms on a link anyways?) unless
the -h option is supplied.
 -Erik
This commit is contained in:
Eric Andersen 2001-05-11 15:55:41 +00:00
parent eb5f433736
commit 2b02ab9606
2 changed files with 22 additions and 6 deletions

14
chown.c
View File

@ -36,9 +36,11 @@
static long uid;
static long gid;
static int (*chown_func)() = chown;
static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
{
if (lchown(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
if (chown_func(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
return (TRUE);
}
perror(fileName);
@ -48,21 +50,27 @@ static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
int chown_main(int argc, char **argv)
{
int opt;
int recursiveFlag = FALSE;
int recursiveFlag = FALSE,
noderefFlag = FALSE;
char *groupName=NULL;
char *p=NULL;
/* do normal option parsing */
while ((opt = getopt(argc, argv, "R")) > 0) {
while ((opt = getopt(argc, argv, "Rh")) > 0) {
switch (opt) {
case 'R':
recursiveFlag = TRUE;
break;
case 'h':
noderefFlag = TRUE;
break;
default:
show_usage();
}
}
if (noderefFlag) chown_func = lchown;
if (argc > optind && argc > 2 && argv[optind]) {
/* First, check if there is a group name here */
groupName = strchr(argv[optind], '.');

View File

@ -36,9 +36,11 @@
static long uid;
static long gid;
static int (*chown_func)() = chown;
static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
{
if (lchown(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
if (chown_func(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
return (TRUE);
}
perror(fileName);
@ -48,21 +50,27 @@ static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
int chown_main(int argc, char **argv)
{
int opt;
int recursiveFlag = FALSE;
int recursiveFlag = FALSE,
noderefFlag = FALSE;
char *groupName=NULL;
char *p=NULL;
/* do normal option parsing */
while ((opt = getopt(argc, argv, "R")) > 0) {
while ((opt = getopt(argc, argv, "Rh")) > 0) {
switch (opt) {
case 'R':
recursiveFlag = TRUE;
break;
case 'h':
noderefFlag = TRUE;
break;
default:
show_usage();
}
}
if (noderefFlag) chown_func = lchown;
if (argc > optind && argc > 2 && argv[optind]) {
/* First, check if there is a group name here */
groupName = strchr(argv[optind], '.');