Annotation of fwmaker/src/cmds.c, revision 1.1

1.1     ! misho       1: #include "global.h"
        !             2: #include "cmds.h"
        !             3: #include "image.h"
        !             4: 
        !             5: 
        !             6: int
        !             7: cmd_Show(void *lb, int idx, char **args)
        !             8: {
        !             9:        ETRACE();
        !            10: 
        !            11:        printf("FW Image file: %s\n", image);
        !            12:        printf("FW Image size: %zu\n", imgsiz);
        !            13:        printf("FW Image descriptor: %d\n\n", imgfd);
        !            14: 
        !            15:        printf("MTD loaded: 0x%zx\n", mtd.mtd_fsiz);
        !            16:        printf("MTD file: %s\n", mtd.mtd_file);
        !            17:        printf("MTD offset: 0x%lx\n", mtd.mtd_offset);
        !            18:        printf("MTD size: 0x%zx\n", mtd.mtd_size);
        !            19: 
        !            20:        return 0;
        !            21: }
        !            22: 
        !            23: static int
        !            24: dialog(void *lb, const char *prompt, char *str, int len)
        !            25: {
        !            26:        int ret = 0;
        !            27:        char *p;
        !            28: 
        !            29:        if (!str || len < 1)
        !            30:                return -1;
        !            31: 
        !            32:        cli_Printf(lb, "%s", prompt);
        !            33:        p = cliInputLine(lb, -1);
        !            34:        if (p) {
        !            35:                cli_freeInput(lb);
        !            36:                strlcpy(str, p, len);
        !            37:                e_free(p);
        !            38: 
        !            39:                if ((p = strpbrk(str, "\r\n")))
        !            40:                        *p = 0;
        !            41:        }
        !            42: 
        !            43:        return ret;
        !            44: }
        !            45: 
        !            46: static void
        !            47: loadparams(void *lb, char ** const args)
        !            48: {
        !            49:        char str[STRSIZ];
        !            50: 
        !            51:        memset(&mtd, 0, sizeof mtd);
        !            52:        if (!args[1]) {
        !            53:                if (!dialog(lb, "Offset=", str, sizeof str))
        !            54:                        mtd.mtd_offset = (off_t) strtol(str, NULL, 0);
        !            55:        } else
        !            56:                mtd.mtd_offset = (off_t) strtol(args[1], NULL, 0);
        !            57:        EVERBOSE(3, "mtd.offset=0x%lx", mtd.mtd_offset);
        !            58:        if (!args[2]) {
        !            59:                if (!dialog(lb, "Size=", str, sizeof str))
        !            60:                        mtd.mtd_size = (size_t) strtol(str, NULL, 0);
        !            61:        } else
        !            62:                mtd.mtd_size = (size_t) strtol(args[2], NULL, 0);
        !            63:        EVERBOSE(3, "mtd.size=0x%zx", mtd.mtd_size);
        !            64: }
        !            65: 
        !            66: static int
        !            67: openfile(int flgs)
        !            68: {
        !            69:        int fd;
        !            70: 
        !            71:        fd = open(mtd.mtd_file, flgs, 0644);
        !            72:        if (fd == -1) {
        !            73:                ESYSERR(0);
        !            74:                return -1;
        !            75:        }
        !            76:        if (lseek(imgfd, mtd.mtd_offset, SEEK_SET) == -1) {
        !            77:                ESYSERR(0);
        !            78:                close(fd);
        !            79:                return -1;
        !            80:        }
        !            81: 
        !            82:        EVERBOSE(1, "mtd_file %s opened #%d", mtd.mtd_file, fd);
        !            83:        return fd;
        !            84: }
        !            85: 
        !            86: static void
        !            87: closefile(int fd)
        !            88: {
        !            89:        EVERBOSE(1, "mtd_file closed #%d", fd);
        !            90:        close(fd);
        !            91: }
        !            92: 
        !            93: int
        !            94: cmd_Mtd(void *lb, int idx, char **args)
        !            95: {
        !            96:        char str[MAXPATHLEN];
        !            97:        struct stat st;
        !            98:        int fd, wlen = 0, rlen = 0;
        !            99:        u_char buf[BUFSIZ] = { 0 };
        !           100: 
        !           101:        ETRACE();
        !           102: 
        !           103:        args++;
        !           104:        if (!args[0]) {
        !           105:                printf("Help: mtd [read|write|erase] <mtd_offset> <mtd_size> [mtd_bin_file]\n");
        !           106:                return -1;
        !           107:        } else if (!strncmp(args[0], "write", strlen(args[0]))) {
        !           108:                loadparams(lb, args);
        !           109:                if (!args[3]) {
        !           110:                        if (!dialog(lb, "File=", str, sizeof str))
        !           111:                                strlcpy(mtd.mtd_file, str, sizeof mtd.mtd_file);
        !           112:                } else
        !           113:                        strlcpy(mtd.mtd_file, args[3], sizeof mtd.mtd_file);
        !           114:                EVERBOSE(3, "mtd.file=%s", mtd.mtd_file);
        !           115: 
        !           116:                if (stat(mtd.mtd_file, &st) == -1) {
        !           117:                        ESYSERR(0);
        !           118:                        memset(&mtd, 0, sizeof mtd);
        !           119:                        return -1;
        !           120:                } else
        !           121:                        mtd.mtd_fsiz = st.st_size;
        !           122:                EVERBOSE(3, "mtd.fsiz=%lu", mtd.mtd_fsiz);
        !           123:                if (mtd.mtd_size < mtd.mtd_fsiz) {
        !           124:                        printf("Error:: MTD file is bigger then reserved space!\n");
        !           125:                        memset(&mtd, 0, sizeof mtd);
        !           126:                        return -1;
        !           127:                }
        !           128:                if (imgfd < 3) {
        !           129:                        printf("Error:: image isn't present!\n");
        !           130:                        memset(&mtd, 0, sizeof mtd);
        !           131:                        return -1;
        !           132:                }
        !           133:                if (imgsiz < mtd.mtd_offset + mtd.mtd_size) {
        !           134:                        printf("Error:: requested region for write is out of image size\n");
        !           135:                        memset(&mtd, 0, sizeof mtd);
        !           136:                        return -1;
        !           137:                }
        !           138: 
        !           139:                fd = openfile(O_RDONLY);
        !           140:                if (fd == -1) {
        !           141:                        memset(&mtd, 0, sizeof mtd);
        !           142:                        return -1;
        !           143:                }
        !           144:                while ((rlen = read(fd, buf, sizeof buf)) > 0)
        !           145:                        if ((rlen = write(imgfd, buf, rlen)) == -1)
        !           146:                                break;
        !           147:                        else
        !           148:                                wlen += rlen;
        !           149:                if (rlen == -1) {
        !           150:                        ESYSERR(0);
        !           151:                        memset(&mtd, 0, sizeof mtd);
        !           152:                } else if (!rlen)
        !           153:                        printf("MTD partition size=%d was written to image\n", wlen);
        !           154:                closefile(fd);
        !           155:        } else if (!strncmp(args[0], "read", strlen(args[0]))) {
        !           156:                loadparams(lb, args);
        !           157:                if (!args[3]) {
        !           158:                        if (!dialog(lb, "File=", str, sizeof str))
        !           159:                                strlcpy(mtd.mtd_file, str, sizeof mtd.mtd_file);
        !           160:                } else
        !           161:                        strlcpy(mtd.mtd_file, args[3], sizeof mtd.mtd_file);
        !           162:                EVERBOSE(3, "mtd.file=%s", mtd.mtd_file);
        !           163: 
        !           164:                if (imgfd < 3) {
        !           165:                        printf("Error:: image isn't present!\n");
        !           166:                        memset(&mtd, 0, sizeof mtd);
        !           167:                        return -1;
        !           168:                }
        !           169:                if (imgsiz < mtd.mtd_offset + mtd.mtd_size) {
        !           170:                        printf("Error:: requested region for read is out of image size\n");
        !           171:                        memset(&mtd, 0, sizeof mtd);
        !           172:                        return -1;
        !           173:                }
        !           174: 
        !           175:                fd = openfile(O_WRONLY | O_CREAT);
        !           176:                if (fd == -1) {
        !           177:                        memset(&mtd, 0, sizeof mtd);
        !           178:                        return -1;
        !           179:                }
        !           180:                while (wlen < mtd.mtd_size &&
        !           181:                                (rlen = read(imgfd, buf, MIN(mtd.mtd_size - wlen, sizeof buf))) > 0)
        !           182:                        if ((rlen = write(fd, buf, rlen)) == -1)
        !           183:                                break;
        !           184:                        else
        !           185:                                wlen += rlen;
        !           186:                if (rlen == -1) {
        !           187:                        ESYSERR(0);
        !           188:                        memset(&mtd, 0, sizeof mtd);
        !           189:                } else
        !           190:                        printf("MTD image partition size=%d was transferred file\n", wlen);
        !           191:                closefile(fd);
        !           192:        } else if (!strncmp(args[0], "erase", strlen(args[0]))) {
        !           193:                loadparams(lb, args);
        !           194: 
        !           195:                if (imgfd < 3) {
        !           196:                        printf("Error:: image isn't present!\n");
        !           197:                        memset(&mtd, 0, sizeof mtd);
        !           198:                        return -1;
        !           199:                }
        !           200:                if (imgsiz < mtd.mtd_offset + mtd.mtd_size) {
        !           201:                        printf("Error:: requested region for erase is out of image size\n");
        !           202:                        memset(&mtd, 0, sizeof mtd);
        !           203:                        return -1;
        !           204:                }
        !           205:                if (lseek(imgfd, mtd.mtd_offset, SEEK_SET) == -1) {
        !           206:                        ESYSERR(0);
        !           207:                        memset(&mtd, 0, sizeof mtd);
        !           208:                        return -1;
        !           209:                }
        !           210:                while (wlen < mtd.mtd_size)
        !           211:                        if ((rlen = write(imgfd, buf, MIN(mtd.mtd_size - wlen, sizeof buf))) == -1)
        !           212:                                break;
        !           213:                        else
        !           214:                                wlen += rlen;
        !           215:                if (rlen == -1) {
        !           216:                        ESYSERR(0);
        !           217:                        memset(&mtd, 0, sizeof mtd);
        !           218:                } else
        !           219:                        printf("MTD image partition size=%d was erased\n", wlen);
        !           220:        } else {
        !           221:                printf("Error:: unknown command '%s'\n", args[0]);
        !           222:                return -1;
        !           223:        }
        !           224: 
        !           225:        return 0;
        !           226: }
        !           227: 
        !           228: int
        !           229: cmd_Image(void *lb, int idx, char **args)
        !           230: {
        !           231:        ETRACE();
        !           232: 
        !           233:        args++;
        !           234:        if (!args[0]) {
        !           235:                printf("Help: image [mount|umount|erase|name <file>|init <size>]\n");
        !           236:                return -1;
        !           237:        } else if (!strncmp(args[0], "mount", strlen(args[0]))) {
        !           238:                if (imgfd > 2) {
        !           239:                        printf("Error:: Image is already mounted ...\n");
        !           240:                        return -1;
        !           241:                }
        !           242:                imageOpen(0);
        !           243:        } else if (!strncmp(args[0], "umount", strlen(args[0]))) {
        !           244:                imageClose();
        !           245:        } else if (!strcmp(args[0], "erase")) {
        !           246:                if (imgfd > 2) {
        !           247:                        printf("Error:: Image is mounted, cannot be erased ...\n");
        !           248:                        return -1;
        !           249:                }
        !           250:                unlink(image);
        !           251:                EVERBOSE(1, "Erase image %s\n", image);
        !           252:        } else if (!strncmp(args[0], "name", strlen(args[0]))) {
        !           253:                if (imgfd > 2) {
        !           254:                        printf("Error:: Image is mounted, cannot be renamed ...\n");
        !           255:                        return -1;
        !           256:                }
        !           257:                if (!args[1]) {
        !           258:                        printf("Error:: name isn't found!\n");
        !           259:                        return -1;
        !           260:                }
        !           261:                strlcpy(image, args[1], sizeof image);
        !           262:        } else if (!strncmp(args[0], "init", strlen(args[0]))) {
        !           263:                if (imgfd > 2) {
        !           264:                        printf("Error:: Image is already mounted, cannot be inited ...\n");
        !           265:                        return -1;
        !           266:                }
        !           267:                if (!args[1]) {
        !           268:                        printf("Error:: size isn't found!\n");
        !           269:                        return -1;
        !           270:                }
        !           271:                if (imageOpen(O_CREAT) > 2) {
        !           272:                        imgsiz = (size_t) strtol(args[1], NULL, 0);
        !           273:                        if (ftruncate(imgfd, imgsiz) == -1) {
        !           274:                                ESYSERR(0);
        !           275:                                imageClose();
        !           276:                                unlink(image);
        !           277:                                return -1;
        !           278:                        } else
        !           279:                                EVERBOSE(1, "Image '%s' created with size=%lu\n", image, imgsiz);
        !           280:                }
        !           281:        } else {
        !           282:                printf("Error:: unknown command '%s'\n", args[0]);
        !           283:                return -1;
        !           284:        }
        !           285: 
        !           286:        return 0;
        !           287: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>