blob: 46db4081a918811eb11e022163bc36e67eedb086 [file] [log] [blame]
Eric Andersen9f0fedb2001-04-24 18:07:19 +00001/* vi: set sw=4 ts=4: */
2/*
Eric Andersenbdfd0d72001-10-24 05:00:29 +00003 * Mini chgrp implementation for busybox
Eric Andersen9f0fedb2001-04-24 18:07:19 +00004 *
Eric Andersenc7bda1c2004-03-15 08:29:22 +00005 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
Eric Andersen9f0fedb2001-04-24 18:07:19 +00006 *
Bernhard Reutner-Fischerb1629b12006-05-19 19:29:19 +00007 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
Eric Andersen9f0fedb2001-04-24 18:07:19 +00008 */
9
Manuel Novoa III cad53642003-03-19 09:13:01 +000010/* BB_AUDIT SUSv3 defects - unsupported options -h, -H, -L, and -P. */
11/* BB_AUDIT GNU defects - unsupported options -h, -c, -f, -v, and long options. */
12/* BB_AUDIT Note: gnu chgrp does not support -H, -L, or -P. */
13/* http://www.opengroup.org/onlinepubs/007904975/utilities/chgrp.html */
14
Eric Andersen9f0fedb2001-04-24 18:07:19 +000015#include <stdlib.h>
Eric Andersen9f0fedb2001-04-24 18:07:19 +000016#include <unistd.h>
17#include "busybox.h"
Eric Andersen9f0fedb2001-04-24 18:07:19 +000018
Eric Andersen85e5e722003-07-22 08:56:55 +000019/* Don't use lchown glibc older then 2.1.x */
Eric Andersenc57a75d2001-04-25 17:12:33 +000020#if (__GLIBC__ <= 2) && (__GLIBC_MINOR__ < 1)
Eric Andersen9f0fedb2001-04-24 18:07:19 +000021#define lchown chown
22#endif
23
Eric Andersen9f0fedb2001-04-24 18:07:19 +000024static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
25{
Manuel Novoa III cad53642003-03-19 09:13:01 +000026 if (lchown(fileName, statbuf->st_uid, *((long *) junk)) == 0) {
Eric Andersen9f0fedb2001-04-24 18:07:19 +000027 return (TRUE);
28 }
Manuel Novoa III cad53642003-03-19 09:13:01 +000029 bb_perror_msg("%s", fileName); /* Avoid multibyte problems. */
Eric Andersen9f0fedb2001-04-24 18:07:19 +000030 return (FALSE);
31}
32
33int chgrp_main(int argc, char **argv)
34{
Manuel Novoa III cad53642003-03-19 09:13:01 +000035 long gid;
Manuel Novoa III 4eff1812003-03-19 09:42:02 +000036 int recursiveFlag;
Manuel Novoa III cad53642003-03-19 09:13:01 +000037 int retval = EXIT_SUCCESS;
Eric Andersen9f0fedb2001-04-24 18:07:19 +000038
Manuel Novoa III cad53642003-03-19 09:13:01 +000039 recursiveFlag = bb_getopt_ulflags(argc, argv, "R");
40
41 if (argc - optind < 2) {
42 bb_show_usage();
Eric Andersen9f0fedb2001-04-24 18:07:19 +000043 }
44
Manuel Novoa III cad53642003-03-19 09:13:01 +000045 argv += optind;
46
47 /* Find the selected group */
Bernhard Reutner-Fischerd5bd1372005-09-20 21:06:17 +000048 gid = get_ug_id(*argv, bb_xgetgrnam);
Manuel Novoa III cad53642003-03-19 09:13:01 +000049 ++argv;
Eric Andersen9f0fedb2001-04-24 18:07:19 +000050
51 /* Ok, ready to do the deed now */
Manuel Novoa III cad53642003-03-19 09:13:01 +000052 do {
Eric Andersenc7bda1c2004-03-15 08:29:22 +000053 if (! recursive_action (*argv, recursiveFlag, FALSE, FALSE,
Manuel Novoa III cad53642003-03-19 09:13:01 +000054 fileAction, fileAction, &gid)) {
55 retval = EXIT_FAILURE;
Eric Andersen9f0fedb2001-04-24 18:07:19 +000056 }
Manuel Novoa III cad53642003-03-19 09:13:01 +000057 } while (*++argv);
Eric Andersen9f0fedb2001-04-24 18:07:19 +000058
Manuel Novoa III cad53642003-03-19 09:13:01 +000059 return retval;
Eric Andersen9f0fedb2001-04-24 18:07:19 +000060}