/* vi: set sw=4 ts=4: */
/*
 * deluser (remove lusers from the system ;) for TinyLogin
 *
 * Copyright (C) 1999 by Lineo, inc. and John Beppu
 * Copyright (C) 1999,2000,2001 by John Beppu <beppu@codepoet.org>
 * Unified with delgroup by Tito Ragusa <farmatito@tiscali.it>
 *
 * Licensed under GPL version 2, see file LICENSE in this tarball for details.
 *
 */

#include "busybox.h"

static void del_line_matching(const char *login, const char *filename)
{
	char *line;
	FILE *passwd;
	int len = strlen(login);
	int found = 0;
	llist_t *plist = NULL;

	passwd = fopen_or_warn(filename, "r");
	if (!passwd) return;

	while ((line = xmalloc_fgets(passwd))) {
		if (!strncmp(line, login, len)
		 && line[len] == ':'
		) {
			found++;
			free(line);
		} else {
			llist_add_to_end(&plist, line);
		}
	}

	if (!ENABLE_FEATURE_CLEAN_UP) {
		if (!found) {
			bb_error_msg("can't find '%s' in '%s'", login, filename);
			return;
		}
		passwd = fopen_or_warn(filename, "w");
		if (passwd)
			while ((line = llist_pop(&plist)))
				fputs(line, passwd);
	} else {
		if (!found) {
			bb_error_msg("can't find '%s' in '%s'", login, filename);
			goto clean_up;
		}
		fclose(passwd);
		passwd = fopen_or_warn(filename, "w");
		if (passwd) {
 clean_up:
			while ((line = llist_pop(&plist))) {
				if (found) fputs(line, passwd);
				free(line);
			}
			fclose(passwd);
		}
	}
}

int deluser_main(int argc, char **argv)
{
	if (argc != 2)
		bb_show_usage();

	if (ENABLE_DELUSER
	 && (!ENABLE_DELGROUP || applet_name[3] == 'u')
	) {
		del_line_matching(argv[1], bb_path_passwd_file);
		if (ENABLE_FEATURE_SHADOWPASSWDS)
			del_line_matching(argv[1], bb_path_shadow_file);
	}
	del_line_matching(argv[1], bb_path_group_file);
	if (ENABLE_FEATURE_SHADOWPASSWDS)
		del_line_matching(argv[1], bb_path_gshadow_file);

	return EXIT_SUCCESS;
}

/* $Id: deluser.c,v 1.4 2003/07/14 20:20:45 andersen Exp $ */
