File:  [ELWIX - Embedded LightWeight unIX -] / embedtools / src / Attic / updimg.c
Revision 1.1.2.8: download - view: text, annotated - select for diffs - revision graph
Thu Apr 28 07:52:01 2011 UTC (13 years, 3 months ago) by misho
Branches: tools1_0
added fix for basename
portability reason

/*************************************************************************
 * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
 *  by Michael Pounov <misho@aitbg.com>
 *
 * $Author: misho $
 * $Id: updimg.c,v 1.1.2.8 2011/04/28 07:52:01 misho Exp $
 *
 *************************************************************************/
#include "global.h"
#include "upd.h"
#include "tftp.h"


sl_config cfg;
int Verbose, Mode;
extern char compiled[], compiledby[], compilehost[];


static void Usage()
{
	printf(	" Update Image tool for embedded systems on CompactFlash\n"
		"=== %s === %s@%s ===\n\n"
		"  Syntax: updimg [-v] <modes> <image_name> [operate_dir]\n\n"
		"\t-v\t\tVerbose ...\n\n"
		"\t-D\t\tRun tftp server and watch for updates (image_name==ip:port)\n"
		"\t-a\t\tMake image active for next boot\n"
		"\t-i <tftp_dir>\tInstall new image\n"
		"\t-r\t\tRollback old backuped image\n"
		"\t-t <tftp_dir>\tExport for TFTP download\n"
		"\t-b\t\tBackup image\n"
		"\t-d\t\tClean backuped image\n"
		"\n", compiled, compiledby, compilehost);
}

// -----------------------------------

int main(int argc, char **argv)
{
	char ch, *pos, szImg[MAXPATHLEN], szTFTP[MAXPATHLEN];
	int mode;
	struct hostent *host;
	struct sockaddr_in sin;

	while ((ch = getopt(argc, argv, "hvdbt:ai:rD")) != -1)
		switch (ch) {
			case 'D':
				Mode |= 0x40;
				break;
			case 'a':
				Mode |= 0x1;
				break;
			case 't':
				Mode |= 0x8;
				strlcpy(szTFTP, optarg, MAXPATHLEN);
				break;
			case 'r':
				if (Mode & 0x10) {
					printf("Error:: can`t set rollback mode because find set install ...\n");
					return 1;
				} else
					Mode |= 0x20;
				break;
			case 'i':
				if (Mode & 0x20) {
					printf("Error:: can`t set install mode because find set rollback ...\n");
					return 1;
				} else
					Mode |= 0x10;
				strlcpy(szTFTP, optarg, MAXPATHLEN);
				break;
			case 'b':
				if (Mode & 0x4) {
					printf("Error:: can`t set backup mode because find set clean ...\n");
					return 1;
				} else
					Mode |= 0x2;
				break;
			case 'd':
				if (Mode & 0x2) {
					printf("Error:: can`t set clean mode because find set backup ...\n");
					return 1;
				} else
					Mode |= 0x4;
				break;
			case 'v':
				Verbose++;
				break;
			case 'h':
			default:
				Usage();
				return 1;
		}
	argc -= optind;
	argv += optind;
	if (!Mode) {
		printf("Error:: Mode not specified !!!\n\n");
		Usage();
		return 1;
	}
	if (!argc) {
		printf("Error:: Image filename not specified !!!\n\n");
		Usage();
		return 1;
	} else
		strlcpy(szImg, basename(*argv), MAXPATHLEN);
	if (0x40 & Mode) {
		if (0x40 != Mode) {
			printf("Error:: Daemon mode can`t be specified with others ...\n");
			return 1;
		}

		pos = strchr(szImg, ':');
		if (!pos)
			sin.sin_port = htons(DEFAULT_TFTP);
		else {
			*pos++ = 0;
			sin.sin_port = htons(atoi(pos));
			if (!sin.sin_port)
				sin.sin_port = htons(DEFAULT_TFTP);
		}
		host = gethostbyname(szImg);
		if (!host) {
			printf("Error:: in resolv host %s #%d - %s\n", szImg, h_errno, hstrerror(h_errno));
			return 1;
		} else
			memcpy(&sin.sin_addr.s_addr, host->h_addr, host->h_length);

		strlcpy(szTFTP, !argv[1] ? DEFAULT_TFTPDIR : argv[1], MAXPATHLEN);
		chdir(argv[1]);
		VERB(2) printf("Info(2):: Host %s Port %d in Dir %s\n", 
				inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), szTFTP);
	} else
		if (argc > 1) {
			chdir(argv[1]);
			VERB(5) printf("Info(5):: Change to dir %s\n", argv[1]);
		}

	openlog("updimg", LOG_CONS, 0);

	for (mode = 0x40; mode; mode >>= 1)
		switch (Mode & mode) {
			case 0x1:
				Activate(szImg);
				break;
			case 0x2:
				Backup(szImg);
				break;
			case 0x4:
				Clean(szImg);
				break;
			case 0x8:
				tFTP(szImg, szTFTP);
				break;
			case 0x10:
				Install(szImg, szTFTP);
				break;
			case 0x20:
				Rollback(szImg);
				break;
			case 0x40:
				Daemonize(sin, szTFTP);
				break;
		}

	closelog();
	return 0;
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>