--- embedtools/src/Attic/updimg.c 2009/11/13 13:55:28 1.1 +++ embedtools/src/Attic/updimg.c 2011/06/08 12:45:41 1.2 @@ -0,0 +1,167 @@ +/************************************************************************* + * (C) 2010 AITNET - Sofia/Bulgaria - + * by Michael Pounov + * + * $Author: misho $ + * $Id: updimg.c,v 1.2 2011/06/08 12:45:41 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] [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 \tInstall new image\n" + "\t-r\t\tRollback old backuped image\n" + "\t-t \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; +}