- struct group *grp;
- struct passwd *pwd;
- int recursiveFlag=FALSE;
- char *groupName;
-
-
- chownApp = (strcmp(*argv, "chown")==0)? TRUE : FALSE;
-
- if (argc < 2) {
- fprintf(stderr, "Usage: %s %s", *argv,
- (chownApp==TRUE)? chown_usage : chgrp_usage);
- exit( FALSE);
- }
- invocationName=*argv;
- argc--;
- argv++;
-
- /* Parse options */
- while (**argv == '-') {
- while (*++(*argv)) switch (**argv) {
- case 'R':
- recursiveFlag = TRUE;
- break;
- default:
- fprintf(stderr, "Unknown option: %c\n", **argv);
- exit( FALSE);
- }
- argc--;
- argv++;
- }
-
- /* Find the selected group */
- groupName = strchr(*argv, '.');
- if ( chownApp==TRUE && groupName )
- *groupName++ = '\0';
- else
- groupName = *argv;
- grp = getgrnam(groupName);
- if (grp == NULL) {
- fprintf(stderr, "%s: Unknown group name: %s\n", invocationName, groupName);
- exit( FALSE);
- }
- gid = grp->gr_gid;
-
- /* Find the selected user (if appropriate) */
- if (chownApp==TRUE) {
- pwd = getpwnam(*argv);
- if (pwd == NULL) {
- fprintf(stderr, "%s: Unknown user name: %s\n", invocationName, *argv);
- exit( FALSE);
+ int retval = EXIT_SUCCESS;
+ int opt, flags;
+ struct param_t param;
+
+ param.ugid.uid = -1;
+ param.ugid.gid = -1;
+ param.chown_func = chown;
+
+ opt_complementary = "-2";
+ opt = getopt32(argv, OPT_STR);
+ argv += optind;
+
+ /* This matches coreutils behavior (almost - see below) */
+ if (OPT_NODEREF
+ /* || (OPT_RECURSE && !OPT_TRAVERSE_TOP): */
+ IF_DESKTOP( || (opt & (BIT_RECURSE|BIT_TRAVERSE_TOP)) == BIT_RECURSE)
+ ) {
+ param.chown_func = lchown;