/* See LICENSE file for copyright and license details. */
#include <errno.h>
#include <grp.h>
#include <pwd.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "util.h"

static void chownpwgr(const char *);

static bool rflag = false;
static struct passwd *pw = NULL;
static struct group *gr = NULL;
static int ret = EXIT_SUCCESS;

static void
usage(void)
{
	eprintf("usage: %s [-r] [owner][:[group]] file...\n", argv0);
}

int
main(int argc, char *argv[])
{
	char *owner, *group;

	ARGBEGIN {
	case 'R':
	case 'r':
		rflag = true;
		break;
	default:
		usage();
	} ARGEND;

	if(argc == 0)
		usage();

	owner = argv[0];
	argv++;
	argc--;
	if((group = strchr(owner, ':')))
		*group++ = '\0';

	if(owner && *owner) {
		errno = 0;
		pw = getpwnam(owner);
		if(errno != 0)
			eprintf("getpwnam %s:", owner);
		else if(!pw)
			eprintf("getpwnam %s: no such user\n", owner);
	}
	if(group && *group) {
		errno = 0;
		gr = getgrnam(group);
		if(errno != 0)
			eprintf("getgrnam %s:", group);
		else if(!gr)
			eprintf("getgrnam %s: no such group\n", group);
	}
	for(; argc > 0; argc--, argv++)
		chownpwgr(argv[0]);

	return ret;
}

void
chownpwgr(const char *path)
{
	if(chown(path, pw ? pw->pw_uid : (uid_t)-1,
	               gr ? gr->gr_gid : (gid_t)-1) == -1) {
		weprintf("chown %s:", path);
		ret = EXIT_FAILURE;
	}
	if(rflag)
		recurse(path, chownpwgr);
}