Annotation of embedtools/src/updimg.c, revision 1.1.2.7

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 $
        !             6:  * $Id: dpatch.c,v 1.1.2.1 2010/03/24 16:43:01 misho Exp $
        !             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.2   misho     105:                basename_r(*argv, szImg);
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>