/* mksdcard.c
**
** Copyright 2007, The Android Open Source Project
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are met:
**     * Redistributions of source code must retain the above copyright
**       notice, this list of conditions and the following disclaimer.
**     * Redistributions in binary form must reproduce the above copyright
**       notice, this list of conditions and the following disclaimer in the
**       documentation and/or other materials provided with the distribution.
**     * Neither the name of Google Inc. nor the names of its contributors may
**       be used to endorse or promote products derived from this software
**       without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY Google Inc. ``AS IS'' AND ANY EXPRESS OR
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
** EVENT SHALL Google Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/* a simple and portable program used to generate a blank FAT32 image file
 *
 * usage: mksdcard [-l label] <size> <filename>
 */

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

/* believe me, you *don't* want to change these constants !! */
#define  BYTES_PER_SECTOR    512
#define  RESERVED_SECTORS    32
#define  BACKUP_BOOT_SECTOR  6
#define  NUM_FATS            2

/* sectors_per_disk is encoded as a signed int */
#define MAX_SECTORS_PER_DISK 0x7FFFFFFF
#define MAX_DISK_SIZE ((Wide)MAX_SECTORS_PER_DISK * BYTES_PER_SECTOR)

typedef long long      Wide;   /* might be something else if you don't use GCC */
typedef unsigned char  Byte;
typedef Byte*          Bytes;

#define  BYTE_(p,i)      (((Bytes)(p))[(i)])

#define  POKEB(p,v)     BYTE_(p,0) = (Byte)(v)
#define  POKES(p,v)   ( BYTE_(p,0) = (Byte)(v), BYTE_(p,1) = (Byte)((v) >> 8) )
#define  POKEW(p,v)   ( BYTE_(p,0) = (Byte)(v), BYTE_(p,1) = (Byte)((v) >> 8), BYTE_(p,2) = (Byte)((v) >> 16), BYTE_(p,3) = (Byte)((v) >> 24) )

static Byte  s_boot_sector   [ BYTES_PER_SECTOR ];   /* boot sector */
static Byte  s_fsinfo_sector [ BYTES_PER_SECTOR ];   /* FS Info sector */
static Byte  s_fat_head      [ BYTES_PER_SECTOR ];   /* first FAT sector */
// static Byte  s_zero_sector   [ BYTES_PER_SECTOR ];   /* empty sector */

// For handling Unicode paths
#ifdef _WIN32
    #define WIDE_CHAR   wchar_t
    #define ARGC        wargc
    #define ARGV        wargv
    #define STRINGPRINT "%S"
#else
    #define WIDE_CHAR   char
    #define ARGC        argc
    #define ARGV        argv
    #define STRINGPRINT "%s"
#endif

/* this is the date and time when creating the disk */
static int
get_serial_id( void )
{
    unsigned short  lo, hi;
    time_t          now = time(NULL);
    struct tm       tm  = gmtime( &now )[0];

    lo  = (unsigned short)(tm.tm_mday + ((tm.tm_mon+1) << 8) + (tm.tm_sec << 8));
    hi  = (unsigned short)(tm.tm_min + (tm.tm_hour << 8) + (tm.tm_year + 1900));

    return lo + (hi << 16);
}

static int
get_sectors_per_cluster( Wide  disk_size )
{
    Wide  disk_MB = disk_size/(1024*1024);

    if (disk_MB < 260)
        return 1;

    if (disk_MB < 8192)
        return 4;

    if (disk_MB < 16384)
        return 8;

    if (disk_MB < 32768)
        return 16;

    return 32;
}

static int
get_sectors_per_fat( Wide  disk_size, int  sectors_per_cluster )
{
    Wide   divider;

    /* weird computation from MS - see fatgen103.doc for details */
    disk_size -= RESERVED_SECTORS * BYTES_PER_SECTOR;  /* don't count 32 reserved sectors */
    disk_size /= BYTES_PER_SECTOR;       /* disk size in sectors */
    divider = ((256 * sectors_per_cluster) + NUM_FATS) / 2;

    return (int)( (disk_size + (divider-1)) / divider );
}

static void
boot_sector_init( Bytes  boot, Bytes  info, Wide   disk_size, const char*  label )
{
    int   sectors_per_cluster = get_sectors_per_cluster(disk_size);
    int   sectors_per_fat    = get_sectors_per_fat(disk_size, sectors_per_cluster);
    int   sectors_per_disk   = (int)(disk_size / BYTES_PER_SECTOR);
    int   serial_id          = get_serial_id();
    int   free_count;

    if (label == NULL)
        label = "SDCARD";

    POKEB(boot, 0xeb);
    POKEB(boot+1, 0x5a);
    POKEB(boot+2, 0x90);
    strcpy( (char*)boot + 3, "MSWIN4.1" );
    POKES( boot + 0x0b, BYTES_PER_SECTOR );    /* sector size */
    POKEB( boot + 0xd, sectors_per_cluster );  /* sectors per cluster */
    POKES( boot + 0xe, RESERVED_SECTORS );     /* reserved sectors before first FAT */
    POKEB( boot + 0x10, NUM_FATS );            /* number of FATs */
    POKES( boot + 0x11, 0 );                   /* max root directory entries for FAT12/FAT16, 0 for FAT32 */
    POKES( boot + 0x13, 0 );                   /* total sectors, 0 to use 32-bit value at offset 0x20 */
    POKEB( boot + 0x15, 0xF8 );                /* media descriptor, 0xF8 == hard disk */
    POKES( boot + 0x16, 0 );                   /* Sectors per FAT for FAT12/16, 0 for FAT32 */
    POKES( boot + 0x18, 9 );                   /* Sectors per track (whatever) */
    POKES( boot + 0x1a, 2 );                   /* Number of heads (whatever) */
    POKEW( boot + 0x1c, 0 );                   /* Hidden sectors */
    POKEW( boot + 0x20, sectors_per_disk );    /* Total sectors */

    /* extension */
    POKEW( boot + 0x24, sectors_per_fat );       /* Sectors per FAT */
    POKES( boot + 0x28, 0 );         /* FAT flags */
    POKES( boot + 0x2a, 0 );         /* version */
    POKEW( boot + 0x2c, 2 );         /* cluster number of root directory start */
    POKES( boot + 0x30, 1 );         /* sector number of FS information sector */
    POKES( boot + 0x32, BACKUP_BOOT_SECTOR );         /* sector number of a copy of this boot sector */
    POKEB( boot + 0x40, 0x80 );      /* physical drive number */
    POKEB( boot + 0x42, 0x29 );      /* extended boot signature ?? */
    POKEW( boot + 0x43, serial_id ); /* serial ID */
    strncpy( (char*)boot + 0x47, label, 11 );  /* Volume Label */
    memcpy( boot + 0x52, "FAT32   ", 8 );  /* FAT system type, padded with 0x20 */

    POKEB( boot + BYTES_PER_SECTOR-2, 0x55 );    /* boot sector signature */
    POKEB( boot + BYTES_PER_SECTOR-1, 0xAA );

    /* FSInfo sector */
    free_count = sectors_per_disk - 32 - 2*sectors_per_fat;

    POKEW( info + 0,   0x41615252 );
    POKEW( info + 484, 0x61417272 );
    POKEW( info + 488, free_count );   /* number of free clusters */
    POKEW( info + 492, 3 );            /* next free clusters, 0-1 reserved, 2 is used for the root dir */
    POKEW( info + 508, 0xAA550000 );
}

static void
fat_init( Bytes  fat )
{
    POKEW( fat,     0x0ffffff8 );  /* reserve cluster 1, media id in low byte */
    POKEW( fat + 4, 0x0fffffff );  /* reserve cluster 2 */
    POKEW( fat + 8, 0x0fffffff );  /* end of clust chain for root dir */
}


static int
write_sector( FILE*  file, Bytes  sector )
{
    int result = fwrite( sector, 1, BYTES_PER_SECTOR, file ) != BYTES_PER_SECTOR;
    if (result) {
      fprintf(stderr, "Failed to write sector of %d bytes: %s\n", BYTES_PER_SECTOR, strerror(errno));
    }
    return result;
}

static int
write_empty( FILE*   file, Wide  count )
{
    static  Byte  empty[256*1024];
    memset(empty, 0, sizeof(empty));

    count *= BYTES_PER_SECTOR;
    while (count > 0) {
        int  len = sizeof(empty);
        if (len > count)
          len = count;
        if ( fwrite( empty, 1, len, file ) != (size_t)len ) {
            fprintf(stderr, "Failed to write %d bytes: %s\n", len, strerror(errno));
            return 1;
        }

        count -= len;
    }
    return 0;
}

static void usage (void)
{
    fprintf(stderr, "mksdcard: create a blank FAT32 image to be used with the Android emulator\n" );
    fprintf(stderr, "usage: mksdcard [-l label] <size> <file>\n\n");
    fprintf(stderr, "  if <size> is a simple integer, it specifies a size in bytes\n" );
    fprintf(stderr, "  if <size> is an integer followed by 'K', it specifies a size in KiB\n" );
    fprintf(stderr, "  if <size> is an integer followed by 'M', it specifies a size in MiB\n" );
    fprintf(stderr, "  if <size> is an integer followed by 'G', it specifies a size in GiB\n" );
    fprintf(stderr, "\nMinimum size is 9M. The Android emulator cannot use smaller images.\n" );
    fprintf(stderr, "Maximum size is %lld bytes, %lldK, %lldM or %lldG\n",
            MAX_DISK_SIZE, MAX_DISK_SIZE >> 10, MAX_DISK_SIZE >> 20, MAX_DISK_SIZE >> 30);
    exit(1);
}

int  main( int argc, char**  argv )
{
    Wide              disk_size;
    int               sectors_per_fat;
    int               sectors_per_disk;
    WIDE_CHAR*        end;
    const WIDE_CHAR*  label = NULL;
    FILE*             f = NULL;

#ifdef _WIN32
    int          wargc;
    WIDE_CHAR**  wargv;
    WIDE_CHAR**  unused_environment;
    WIDE_CHAR**  unused_startupinfo;

    __wgetmainargs(&wargc, &wargv, &unused_environment, 0, &unused_startupinfo);
#endif

    for ( ; ARGC > 1 && ARGV[1][0] == '-'; ARGC--, ARGV++ )
    {
        WIDE_CHAR*  arg = ARGV[1] + 1;
        switch (arg[0]) {
            case 'l':
                if (arg[1] != 0)
                    arg += 2;
                else {
                    ARGC--;
                    ARGV++;
                    if (ARGC <= 1)
                        usage();
                    arg = ARGV[1];
                }
                label = arg;
                break;

            default:
                usage();
        }
    }

    if (ARGC != 3)
        usage();

#ifdef _WIN32
    disk_size = wcstoll( ARGV[1], &end, 10 );
#else
    disk_size = strtoll( ARGV[1], &end, 10 );
#endif

    if (disk_size <= 0 || errno == EINVAL || errno == ERANGE) {
        fprintf(stderr, "Invalid argument size '" STRINGPRINT "'\n\n", ARGV[1]);
        usage();
    }

    if (*end == 'K')
        disk_size *= 1024;
    else if (*end == 'M')
        disk_size *= 1024*1024;
    else if (*end == 'G')
        disk_size *= 1024*1024*1024;

    if (disk_size < 9*1024*1024) {
        fprintf(stderr, "Invalid argument: size '" STRINGPRINT "' is too small.\n\n", ARGV[1]);
        usage();
    } else if (disk_size > MAX_DISK_SIZE) {
        fprintf(stderr, "Invalid argument: size '" STRINGPRINT "' is too large.\n\n", ARGV[1]);
        usage();
    }

    sectors_per_disk = disk_size / BYTES_PER_SECTOR;
    sectors_per_fat  = get_sectors_per_fat( disk_size, get_sectors_per_cluster( disk_size ) );

    boot_sector_init( s_boot_sector, s_fsinfo_sector, disk_size, NULL );
    fat_init( s_fat_head );

#ifdef _WIN32
    f = _wfopen( ARGV[2], L"wb" );
#else
    f = fopen( ARGV[2], "wb" );
#endif
    if ( !f ) {
      fprintf(stderr, "Could not create file '" STRINGPRINT "': %s\n", ARGV[2], strerror(errno));
      goto FailWrite;
    }

   /* here's the layout:
    *
    *  boot_sector
    *  fsinfo_sector
    *  empty
    *  backup boot sector
    *  backup fsinfo sector
    *  RESERVED_SECTORS - 4 empty sectors (if backup sectors), or RESERVED_SECTORS - 2 (if no backup)
    *  first fat
    *  second fat
    *  zero sectors
   */

    if ( write_sector( f, s_boot_sector ) ) goto FailWrite;
    if ( write_sector( f, s_fsinfo_sector ) ) goto FailWrite;
    if ( BACKUP_BOOT_SECTOR > 0 ) {
        if ( write_empty( f, BACKUP_BOOT_SECTOR - 2 ) ) goto FailWrite;
        if ( write_sector( f, s_boot_sector ) ) goto FailWrite;
        if ( write_sector( f, s_fsinfo_sector ) ) goto FailWrite;
        if ( write_empty( f, RESERVED_SECTORS - 2 - BACKUP_BOOT_SECTOR ) ) goto FailWrite;
    }
    else if ( write_empty( f, RESERVED_SECTORS - 2 ) ) goto FailWrite;

    if ( write_sector( f, s_fat_head ) ) goto FailWrite;
    if ( write_empty( f, sectors_per_fat-1 ) ) goto FailWrite;

    if ( write_sector( f, s_fat_head ) ) goto FailWrite;
    if ( write_empty( f, sectors_per_fat-1 ) ) goto FailWrite;

    if ( write_empty( f, sectors_per_disk - RESERVED_SECTORS - 2*sectors_per_fat ) ) goto FailWrite;

    fclose(f);
    return 0;

FailWrite:
    if (f != NULL) {
      fclose(f);
#ifdef _WIN32
      _wunlink( ARGV[2] );
#else
      unlink( ARGV[2] );
#endif
      fprintf(stderr, "File '" STRINGPRINT "' was not created.\n", ARGV[2]);
    }
    return 1;
}
