/* 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 = isDirectory(srcName, TRUE, NULL);
	else
		srcIsDir = isDirectory(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:
*/
