/* vi: set sw=4 ts=4: */
/*
 * Mini ln implementation for busybox
 *
 * Copyright (C) 1999,2000 by Lineo, inc.
 * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 */

#include "busybox.h"
#define BB_DECLARE_EXTERN
#define bb_need_not_a_directory
#include "messages.c"

#include <stdio.h>
#include <dirent.h>
#include <errno.h>

#define LN_SYMLINK		1
#define LN_FORCE			2
#define LN_NODEREFERENCE	4

/*
 * linkDestName is where the link points to,
 * linkSrcName is the name of the link to be created.
 */
static int fs_link(const char *link_DestName, const char *link_SrcName, const int flag)
{
	int status;
	int srcIsDir;
	char *srcName;

	if (link_DestName==NULL)
		return(FALSE);

	srcName = (char *) malloc(strlen(link_SrcName)+strlen(link_DestName)+1);

	if (link_SrcName==NULL)
		strcpy(srcName, link_DestName);
	else
		strcpy(srcName, link_SrcName);

	if (flag&LN_NODEREFERENCE)
		srcIsDir = is_directory(srcName, TRUE, NULL);
	else
		srcIsDir = is_directory(srcName, FALSE, NULL);	
	
	if ((srcIsDir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) {
		strcat(srcName, "/");
		strcat(srcName, link_DestName);
	}
	
	if (flag&LN_FORCE)
		unlink(srcName);
		
	if (flag&LN_SYMLINK)
		status = symlink(link_DestName, srcName);
	else
		status = link(link_DestName, srcName);

	if (status != 0) {
		perror(srcName);
		return(FALSE);
	}
	return(TRUE);
}

extern int ln_main(int argc, char **argv)
{
	int status = EXIT_SUCCESS;
	int flag = 0;
	int opt;
	
	/* Parse any options */
	while ((opt=getopt(argc, argv, "sfn")) != -1) {
		switch(opt) {
			case 's':
				flag |= LN_SYMLINK;
				break;
			case 'f':
				flag |= LN_FORCE;
				break;
			case 'n':
				flag |= LN_NODEREFERENCE;
				break;
			default:
				usage(ln_usage);
		}
	}
	while(optind<(argc-1)) {
		if (fs_link(argv[optind], argv[argc-1], flag)==FALSE)
			status = EXIT_FAILURE;
		optind++;
	}
	return(status);
}

/*
Local Variables:
c-file-style: "linux"
c-basic-offset: 4
tab-width: 4
End:
*/
