Changeset 32656


Ignore:
Timestamp:
Jul 10, 2017, 3:00:02 PM (2 weeks ago)
Author:
brainslayer
Message:

flashing support for dir882/dir878

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/router/httpd/modules/upgrade.c

    r32650 r32656  
    334334#endif
    335335#if defined(HAVE_DIR860) || defined(HAVE_DIR859)
     336                        if (brand == ROUTER_DIR882) {
     337                                unsigned int *uboot_magic = (unsigned int *)buf;
     338                                if (*uboot_magic == HOST_TO_BE32(0x27051956)) {
     339                                        char *write_argv_buf[8];
     340                                        write_argv_buf[0] = "mtd";
     341                                        write_argv_buf[1] = "-f";
     342                                        write_argv_buf[2] = "write";
     343                                        write_argv_buf[3] = upload_fifo;
     344                                        write_argv_buf[4] = "linux";
     345                                        write_argv_buf[5] = NULL;
     346                                        if (!mktemp(upload_fifo) || mkfifo(upload_fifo, S_IRWXU) < 0 || (ret = _evalpid(write_argv_buf, NULL, 0, &pid))
     347                                            || !(fifo = fopen(upload_fifo, "w"))) {
     348                                                if (!ret)
     349                                                        ret = errno;
     350                                                goto err;
     351                                        }
     352                                        goto write_data;
     353                                }
     354
     355                        } else {
     356
    336357#define SEAMA_MAGIC             0x5EA3A417
    337358
    338                         typedef struct seama_hdr seamahdr_t;
    339                         struct seama_hdr {
    340                                 unsigned int magic;     /* should always be SEAMA_MAGIC. */
    341                                 unsigned short reserved;        /* reserved for  */
    342                                 unsigned short metasize;        /* size of the META data */
    343                                 unsigned int size;      /* size of the image */
    344                         } __attribute__((packed));
    345                         seamahdr_t *seama = (seamahdr_t *) buf;
    346 
    347                         if (seama->magic == HOST_TO_BE32(SEAMA_MAGIC)) {
    348                                 unsigned int skip = HOST_TO_BE16(seama->metasize) + sizeof(seamahdr_t);
    349                                 fprintf(stderr, "found seama header, skip seal header of %d bytes\n", skip);
    350                                 if (skip > count)
    351                                         goto err;
     359                                typedef struct seama_hdr seamahdr_t;
     360                                struct seama_hdr {
     361                                        unsigned int magic;     /* should always be SEAMA_MAGIC. */
     362                                        unsigned short reserved;        /* reserved for  */
     363                                        unsigned short metasize;        /* size of the META data */
     364                                        unsigned int size;      /* size of the image */
     365                                } __attribute__((packed));
     366                                seamahdr_t *seama = (seamahdr_t *) buf;
     367
     368                                if (seama->magic == HOST_TO_BE32(SEAMA_MAGIC)) {
     369                                        unsigned int skip = HOST_TO_BE16(seama->metasize) + sizeof(seamahdr_t);
     370                                        fprintf(stderr, "found seama header, skip seal header of %d bytes\n", skip);
     371                                        if (skip > count)
     372                                                goto err;
    352373#ifdef HAVE_DIR869
    353374#define signature "signature=wrgac54_dlink.2015_dir869"
     
    357378#define signature "signature=wrgac13_dlink.2013gui_dir860lb"
    358379#endif
    359                                 if (memcmp(buf + sizeof(seamahdr_t), signature, sizeof(signature))) {
    360                                         fprintf(stderr, "firmware signature must be %s\n", signature);
    361                                         goto err;
    362                                 }
    363 
    364                                 count -= skip;
    365                                 memcpy(buf, buf + skip, count);
    366                                 char *write_argv_buf[8];
    367                                 write_argv_buf[0] = "mtd";
    368                                 write_argv_buf[1] = "-f";
    369                                 write_argv_buf[2] = "write";
    370                                 write_argv_buf[3] = upload_fifo;
    371                                 write_argv_buf[4] = "linux";
    372                                 write_argv_buf[5] = NULL;
    373                                 if (!mktemp(upload_fifo) || mkfifo(upload_fifo, S_IRWXU) < 0 || (ret = _evalpid(write_argv_buf, NULL, 0, &pid))
    374                                     || !(fifo = fopen(upload_fifo, "w"))) {
    375                                         if (!ret)
    376                                                 ret = errno;
    377                                         goto err;
    378                                 }
    379                                 goto write_data;
    380 
     380                                        if (memcmp(buf + sizeof(seamahdr_t), signature, sizeof(signature))) {
     381                                                fprintf(stderr, "firmware signature must be %s\n", signature);
     382                                                goto err;
     383                                        }
     384
     385                                        count -= skip;
     386                                        memcpy(buf, buf + skip, count);
     387                                        char *write_argv_buf[8];
     388                                        write_argv_buf[0] = "mtd";
     389                                        write_argv_buf[1] = "-f";
     390                                        write_argv_buf[2] = "write";
     391                                        write_argv_buf[3] = upload_fifo;
     392                                        write_argv_buf[4] = "linux";
     393                                        write_argv_buf[5] = NULL;
     394                                        if (!mktemp(upload_fifo) || mkfifo(upload_fifo, S_IRWXU) < 0 || (ret = _evalpid(write_argv_buf, NULL, 0, &pid))
     395                                            || !(fifo = fopen(upload_fifo, "w"))) {
     396                                                if (!ret)
     397                                                        ret = errno;
     398                                                goto err;
     399                                        }
     400                                        goto write_data;
     401
     402                                }
    381403                        }
    382404#endif
Note: See TracChangeset for help on using the changeset viewer.