Subversion Repositories freemyipod

Rev

Rev 694 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <libusb-1.0/libusb.h>

#include "usb.h"
#include "dfu.h"
#include "crc32.h"
#include "misc.h"
#include "ipoddfu.h"

int main(int argc, char *argv[]) {
        int res = 0;
        unsigned char reattach = 0, *data;
        FILE *fp;
        long int size;
        unsigned int checksum;
                
        if (2 != argc) {
                fprintf(stderr, "usage: %s <file>\n", argv[0]);
                
                return 1;
        }
        
        fp = fopen(argv[1], "r");
        
        if (!fp) {
                perror("fopen");
                
                return 1;
        }
        
        size = fgetsize(fp);
        
        if (-1L == size) {
                return 1;
        }
        
        data = (unsigned char *) malloc(size + 4);
        
        if ((unsigned long int) size != fread(data, sizeof(unsigned char), size, fp)) {
                perror("fread");
                
                return 1;
        }
        
        if (fclose(fp)) {
                perror("fclose");
                
                return 1;
        }
        
        crc32_init();
        
        checksum = crc32(data, size, CRC32_DEFAULT_SEED);
        
        memcpy(data + size, &checksum, 4);
        
        res = usb_init();
        
        if (LIBUSB_SUCCESS == res) {
                res = usb_find(&reattach);
        }
        
        if (LIBUSB_SUCCESS == res) {
                res = dfu_send((unsigned long int) size + 4, data);
        }
        
        if (data) {
                free(data);
        }
        
        if (0 != res) {
                print_error(res);
        }
        
        if (usb_handle) {
                usb_close(reattach);
        }
        
        if (usb_ctx) {
                usb_exit();
        }
        
        if (res < 0) {
                res = -res;
        }
        
        return res;
}