/*************************************************************************
* (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
* by Michael Pounov <misho@aitbg.com>
*
* $Author: misho $
* $Id: updimg.c,v 1.1.2.7 2010/03/24 16:46:39 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
basename_r(*argv, szImg);
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>