Annotation of embedtools/src/updimg.c, revision 1.1.2.8
1.1.2.7 misho 1: /*************************************************************************
2: * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
3: * by Michael Pounov <misho@aitbg.com>
4: *
5: * $Author: misho $
1.1.2.8 ! misho 6: * $Id: updimg.c,v 1.1.2.7 2010/03/24 16:46:39 misho Exp $
1.1.2.7 misho 7: *
8: *************************************************************************/
1.1.2.1 misho 9: #include "global.h"
1.1.2.2 misho 10: #include "upd.h"
1.1.2.6 misho 11: #include "tftp.h"
1.1.2.1 misho 12:
13:
14: sl_config cfg;
15: int Verbose, Mode;
16: extern char compiled[], compiledby[], compilehost[];
17:
18:
19: static void Usage()
20: {
21: printf( " Update Image tool for embedded systems on CompactFlash\n"
22: "=== %s === %s@%s ===\n\n"
23: " Syntax: updimg [-v] <modes> <image_name> [operate_dir]\n\n"
24: "\t-v\t\tVerbose ...\n\n"
1.1.2.6 misho 25: "\t-D\t\tRun tftp server and watch for updates (image_name==ip:port)\n"
1.1.2.1 misho 26: "\t-a\t\tMake image active for next boot\n"
1.1.2.4 misho 27: "\t-i <tftp_dir>\tInstall new image\n"
1.1.2.1 misho 28: "\t-r\t\tRollback old backuped image\n"
1.1.2.3 misho 29: "\t-t <tftp_dir>\tExport for TFTP download\n"
1.1.2.1 misho 30: "\t-b\t\tBackup image\n"
31: "\t-d\t\tClean backuped image\n"
32: "\n", compiled, compiledby, compilehost);
33: }
34:
35: // -----------------------------------
36:
37: int main(int argc, char **argv)
38: {
1.1.2.6 misho 39: char ch, *pos, szImg[MAXPATHLEN], szTFTP[MAXPATHLEN];
1.1.2.1 misho 40: int mode;
1.1.2.6 misho 41: struct hostent *host;
42: struct sockaddr_in sin;
1.1.2.1 misho 43:
1.1.2.6 misho 44: while ((ch = getopt(argc, argv, "hvdbt:ai:rD")) != -1)
1.1.2.1 misho 45: switch (ch) {
1.1.2.6 misho 46: case 'D':
47: Mode |= 0x40;
48: break;
1.1.2.1 misho 49: case 'a':
50: Mode |= 0x1;
51: break;
52: case 't':
53: Mode |= 0x8;
1.1.2.3 misho 54: strlcpy(szTFTP, optarg, MAXPATHLEN);
1.1.2.1 misho 55: break;
56: case 'r':
1.1.2.4 misho 57: if (Mode & 0x10) {
1.1.2.1 misho 58: printf("Error:: can`t set rollback mode because find set install ...\n");
59: return 1;
60: } else
1.1.2.4 misho 61: Mode |= 0x20;
1.1.2.1 misho 62: break;
63: case 'i':
1.1.2.4 misho 64: if (Mode & 0x20) {
1.1.2.1 misho 65: printf("Error:: can`t set install mode because find set rollback ...\n");
66: return 1;
67: } else
1.1.2.4 misho 68: Mode |= 0x10;
69: strlcpy(szTFTP, optarg, MAXPATHLEN);
1.1.2.1 misho 70: break;
71: case 'b':
1.1.2.4 misho 72: if (Mode & 0x4) {
1.1.2.1 misho 73: printf("Error:: can`t set backup mode because find set clean ...\n");
74: return 1;
75: } else
1.1.2.4 misho 76: Mode |= 0x2;
1.1.2.1 misho 77: break;
78: case 'd':
1.1.2.4 misho 79: if (Mode & 0x2) {
1.1.2.1 misho 80: printf("Error:: can`t set clean mode because find set backup ...\n");
81: return 1;
82: } else
1.1.2.4 misho 83: Mode |= 0x4;
1.1.2.1 misho 84: break;
85: case 'v':
86: Verbose++;
87: break;
88: case 'h':
89: default:
90: Usage();
91: return 1;
92: }
93: argc -= optind;
94: argv += optind;
95: if (!Mode) {
96: printf("Error:: Mode not specified !!!\n\n");
97: Usage();
98: return 1;
99: }
100: if (!argc) {
101: printf("Error:: Image filename not specified !!!\n\n");
102: Usage();
103: return 1;
104: } else
1.1.2.8 ! misho 105: strlcpy(szImg, basename(*argv), MAXPATHLEN);
1.1.2.6 misho 106: if (0x40 & Mode) {
107: if (0x40 != Mode) {
108: printf("Error:: Daemon mode can`t be specified with others ...\n");
109: return 1;
110: }
111:
112: pos = strchr(szImg, ':');
113: if (!pos)
114: sin.sin_port = htons(DEFAULT_TFTP);
115: else {
116: *pos++ = 0;
117: sin.sin_port = htons(atoi(pos));
118: if (!sin.sin_port)
119: sin.sin_port = htons(DEFAULT_TFTP);
120: }
121: host = gethostbyname(szImg);
122: if (!host) {
123: printf("Error:: in resolv host %s #%d - %s\n", szImg, h_errno, hstrerror(h_errno));
124: return 1;
125: } else
126: memcpy(&sin.sin_addr.s_addr, host->h_addr, host->h_length);
127:
128: strlcpy(szTFTP, !argv[1] ? DEFAULT_TFTPDIR : argv[1], MAXPATHLEN);
1.1.2.2 misho 129: chdir(argv[1]);
1.1.2.6 misho 130: VERB(2) printf("Info(2):: Host %s Port %d in Dir %s\n",
131: inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), szTFTP);
132: } else
133: if (argc > 1) {
134: chdir(argv[1]);
135: VERB(5) printf("Info(5):: Change to dir %s\n", argv[1]);
136: }
1.1.2.1 misho 137:
138: openlog("updimg", LOG_CONS, 0);
1.1.2.2 misho 139:
1.1.2.6 misho 140: for (mode = 0x40; mode; mode >>= 1)
1.1.2.1 misho 141: switch (Mode & mode) {
142: case 0x1:
1.1.2.2 misho 143: Activate(szImg);
1.1.2.1 misho 144: break;
145: case 0x2:
1.1.2.5 misho 146: Backup(szImg);
1.1.2.1 misho 147: break;
148: case 0x4:
1.1.2.4 misho 149: Clean(szImg);
1.1.2.1 misho 150: break;
151: case 0x8:
1.1.2.3 misho 152: tFTP(szImg, szTFTP);
1.1.2.1 misho 153: break;
154: case 0x10:
1.1.2.4 misho 155: Install(szImg, szTFTP);
1.1.2.1 misho 156: break;
157: case 0x20:
1.1.2.4 misho 158: Rollback(szImg);
1.1.2.1 misho 159: break;
1.1.2.6 misho 160: case 0x40:
161: Daemonize(sin, szTFTP);
162: break;
1.1.2.1 misho 163: }
164:
165: closelog();
166: return 0;
167: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>