/************************************************************************* * (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; }