Part of Slepp's ProjectsPastebinTURLImagebinFilebin
Feedback -- English French German Japanese
Create Upload Newest Tools Donate
Sign In | Create Account

main.c
Saturday, March 29th, 2008 at 7:45:56pm UTC 

  1. /***************************************************************************
  2. *             __________               __   ___.
  3. *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
  4. *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
  5. *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
  6. *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
  7. *                     \/            \/     \/    \/            \/
  8. * $Id: ipodpatcher.c 12237 2007-02-08 21:31:38Z dave $
  9. *
  10. * Copyright (C) 2006-2007 Dave Chapman
  11. *
  12. * All files in this archive are subject to the GNU General Public License.
  13. * See the file COPYING in the source tree root for full license agreement.
  14. *
  15. * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
  16. * KIND, either express or implied.
  17. *
  18. ****************************************************************************/
  19.  
  20. #include <stdio.h>
  21. #include <unistd.h>
  22. #include <fcntl.h>
  23. #include <string.h>
  24. #include <stdlib.h>
  25. #include <inttypes.h>
  26. #include <sys/types.h>
  27. #include <sys/stat.h>
  28.  
  29. #include "ipodpatcher.h"
  30. #include "ipodio.h"
  31.  
  32. #define VERSION "2.0 with v2.0 bootloaders"
  33.  
  34. int verbose = 0;
  35.  
  36. enum {
  37.         NONE,
  38.         LIST_IMAGES,
  39. #ifdef WITH_BOOTOBJS
  40.         INTERACTIVE,
  41.         INSTALL,
  42. #endif
  43.         DELETE_BOOTLOADER,
  44.         ADD_BOOTLOADER,
  45.         READ_FIRMWARE,
  46.         WRITE_FIRMWARE,
  47.         READ_AUPD,
  48.         WRITE_AUPD,
  49.         READ_PARTITION,
  50.         WRITE_PARTITION,
  51.         FORMAT_PARTITION,
  52.         CONVERT_TO_FAT32
  53. };
  54.  
  55. void print_macpod_warning(void)
  56. {
  57.         printf("************************************************************************\n");
  58.         printf("*** WARNING FOR ROCKBOX USERS\n");
  59.         printf("*** You must convert this iPod to FAT32 format (aka a \"Winpod\")\n");
  60.         printf("*** if you want to run Rockbox.  Rockbox WILL NOT work on this iPod.\n");
  61.         printf("*** See http://www.rockbox.org/twiki/bin/view/Main/IpodConversionToFAT32\n");
  62.         printf("************************************************************************\n");
  63. }
  64.  
  65. void print_usage(void)
  66. {
  67.         fprintf(stderr,"Usage: ipodpatcher --scan\n");
  68. #ifdef __WIN32__
  69.         fprintf(stderr,"    or ipodpatcher [DISKNO] [action]\n");
  70. #else
  71.         fprintf(stderr,"    or ipodpatcher [device] [action]\n");
  72. #endif
  73.         fprintf(stderr,"\n");
  74.         fprintf(stderr,"Where [action] is one of the following options:\n");
  75. #ifdef WITH_BOOTOBJS
  76.         fprintf(stderr,"        --install\n");
  77. #endif
  78.         fprintf(stderr,"  -l,   --list\n");
  79.         fprintf(stderr,"  -r,   --read-partition     bootpartition.bin\n");
  80.         fprintf(stderr,"  -w,   --write-partition    bootpartition.bin\n");
  81.         fprintf(stderr,"  -rf,  --read-firmware      filename.ipod\n");
  82.         fprintf(stderr,"  -rfb, --read-firmware-bin  filename.bin\n");
  83.         fprintf(stderr,"  -wf,  --write-firmware     filename.ipod\n");
  84.         fprintf(stderr,"  -wfb, --write-firmware-bin filename.bin\n");
  85. #ifdef WITH_BOOTOBJS
  86.         fprintf(stderr,"  -we,  --write-embedded\n");
  87. #endif
  88.         fprintf(stderr,"  -a,   --add-bootloader     filename.ipod\n");
  89.         fprintf(stderr,"  -ab,  --add-bootloader-bin filename.bin\n");
  90.         fprintf(stderr,"  -d,   --delete-bootloader\n");
  91.         fprintf(stderr,"  -f,   --format\n");
  92.         fprintf(stderr,"  -c,   --convert\n");
  93.         fprintf(stderr,"        --read-aupd          filename.bin\n");
  94.         fprintf(stderr,"        --write-aupd         filename.bin\n");
  95.         fprintf(stderr,"\n");
  96.        
  97. #ifdef __WIN32__
  98.         fprintf(stderr,"DISKNO is the number (e.g. 2) Windows has assigned to your iPod's hard disk.\n");
  99.         fprintf(stderr,"The first hard disk in your computer (i.e. C:\\) will be disk 0, the next disk\n");
  100.         fprintf(stderr,"will be disk 1 etc.\n");
  101. #elif defined(linux) || defined (__linux)
  102.         fprintf(stderr,"\"device\" is the device node (e.g. /dev/sda) assigned to your iPod.\n");
  103. #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
  104.         fprintf(stderr,"\"device\" is the device node (e.g. /dev/da1) assigned to your iPod.\n");
  105. #elif defined(__APPLE__) && defined(__MACH__)
  106.         fprintf(stderr,"\"device\" is the device node (e.g. /dev/disk1) assigned to your iPod.\n");
  107. #endif
  108.         fprintf(stderr,"ipodpatcher will refuse to access a disk unless it can identify it as being\n");
  109.         fprintf(stderr,"an iPod. ipodpatcher will return -1 if no iPod is found or cannot be \n");
  110.         fprintf(stderr,"accessed, 0 if the requested action is successful, or 1 if unsuccessful.\n");
  111.         fprintf(stderr,"\n");
  112. }
  113.  
  114. void display_partinfo(struct ipod_t* ipod)
  115. {
  116.         int i;
  117.         double sectors_per_MB = (1024.0*1024.0)/ipod->sector_size;
  118.        
  119.         printf("[INFO] Part    Start Sector    End Sector   Size (MB)   Type\n");
  120.         for ( i = 0; i < 4; i++ ) {
  121.                 if (ipod->pinfo[i].start != 0) {
  122.                         printf("[INFO]    %d      %10ld    %10ld  %10.1f   %s (0x%02x)\n",
  123.                                         i,
  124.                                         (long int)ipod->pinfo[i].start,
  125.                                         (long int)ipod->pinfo[i].start+ipod->pinfo[i].size-1,
  126.                                         ipod->pinfo[i].size/sectors_per_MB,
  127.                                         get_parttype(ipod->pinfo[i].type),
  128.                                         (int)ipod->pinfo[i].type
  129.                                         );
  130.         }
  131.     }
  132. }
  133.  
  134. void exit_prompt()
  135. {
  136. #ifdef WITH_BOOTOBJS
  137.         char enter[4];
  138.         printf("\nPress ENTER to exit ipodpatcher :");
  139.         fgets(enter,4,stdin);
  140. #endif
  141. }
  142.  
  143. int main(int argc, char* argv[])
  144. {
  145.         char yesno[4];
  146.         int i;
  147.         int n;
  148.         int infile, outfile;
  149.         unsigned int inputsize;
  150.         char* filename;
  151.         int action = NONE;
  152.         int type;
  153.         struct ipod_t ipod;
  154.        
  155.         printf("ipodpatcher v" VERSION " - (C) Dave Chapman 2006-2007\n");
  156.         printf("This is free software; see the source for copying conditions.  There is NO\n");
  157.         printf("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
  158.        
  159.         if ((argc > 1) && ((strcmp(argv[1],"-h")==0) || (strcmp(argv[1],"--help")==0))) {
  160.                 print_usage();
  161.                 return 0;
  162.         }
  163.        
  164.         if (ipod_alloc_buffer(&sectorbuf,BUFFER_SIZE) < 0) {
  165.                 fprintf(stderr,"Failed to allocate memory buffer\n");
  166.                 return 1;
  167.     }
  168.        
  169.         if ((argc > 1) && (strcmp(argv[1],"--scan")==0)) {
  170.                 if (ipod_scan(&ipod) == 0) {
  171.                         fprintf(stderr,"[ERR]  No iPod found.\n");
  172.                         return -1;
  173.                 } else {
  174.                         return 0;
  175.                 }
  176.         }
  177.        
  178.         /* If the first parameter doesn't start with -, then we interpret it as a device */
  179.     if ((argc > 1) && (argv[1][0] != '-')) {
  180.                 ipod.diskname[0]=0;
  181. #ifdef __WIN32__
  182.                 snprintf(ipod.diskname,sizeof(ipod.diskname),"\\\\.\\PhysicalDrive%s",argv[1]);
  183. #else
  184.                 strncpy(ipod.diskname,argv[1],sizeof(ipod.diskname));
  185. #endif
  186.                 i = 2;
  187.         } else {
  188.                 /* Autoscan for ipods */
  189.                 n = ipod_scan(&ipod);
  190.                 if (n==0) {
  191.                         fprintf(stderr,"[ERR]  No iPod found: aborting!\n");
  192.                         fprintf(stderr,"[ERR]  Please connect your iPod and ensure it is in disk mode\n");
  193. #if defined(__APPLE__) && defined(__MACH__)
  194.                         fprintf(stderr,"[ERR]  Also ensure that iTunes is closed, and that your iPod is not mounted.\n");
  195. #elif defined(__WIN32__)
  196.                         fprintf(stderr,"[ERR]  You may also need to run ipodpatcher with admin access.\n");
  197. #else
  198.                         fprintf(stderr,"[ERR]  You may also need to run ipodpatcher as root.\n");
  199. #endif
  200.                         fprintf(stderr,"[ERR]  Please refer to the Rockbox manual if you continue to have problems.\n");
  201.                         exit_prompt();
  202.                         return -1;
  203.                 } else if (n > 1) {
  204.                         fprintf(stderr,"[ERR]  %d iPods found: aborting!\n",n);
  205.                         fprintf(stderr,"[ERR]  Please connect only one iPod and re-run ipodpatcher.\n");
  206.                         exit_prompt();
  207.                         return -1;
  208.                 }
  209.                
  210.                 i = 1;
  211.         }
  212.        
  213. #ifdef WITH_BOOTOBJS
  214.         action = INTERACTIVE;
  215. #else
  216.         action = NONE;
  217. #endif
  218.        
  219.         /* Parse args*/
  220.         while (i < argc) {
  221.                 char *arg = argv[i];
  222.                 if ((strcmp(arg,"-l")==0) || (strcmp(arg,"--list")==0)) {
  223.                         action = LIST_IMAGES;
  224. #ifdef WITH_BOOTOBJS
  225.                 } else if (strcmp(argv[i],"--install")==0) {
  226.                         action = INSTALL;
  227. #endif
  228.                 } else if ((strcmp(arg,"-d")==0) ||
  229.                                         (strcmp(arg,"--delete-bootloader")==0)) {
  230.                         action = DELETE_BOOTLOADER;
  231.                 } else if ((strcmp(arg,"-a")==0) ||
  232.                                         (strcmp(arg,"--add-bootloader")==0)) {
  233.                         action = ADD_BOOTLOADER;
  234.                         type = FILETYPE_DOT_IPOD;
  235.                         i++;
  236.                         if (i == argc) {
  237.                                 print_usage();
  238.                                 return 1;
  239.                                 }
  240.                         filename=argv[i];
  241.                 } else if ((strcmp(arg,"-ab")==0) ||
  242.                                         (strcmp(arg,"--add-bootloader-bin")==0)) {
  243.                         action = ADD_BOOTLOADER;
  244.                         type = FILETYPE_DOT_BIN;
  245.                         i++;
  246.                         if (i == argc) {
  247.                                 print_usage();
  248.                                 return 1;
  249.                         }
  250.                         filename=argv[i];
  251.                 } else if ((strcmp(arg,"-rf")==0) ||
  252.                                         (strcmp(arg,"--read-firmware")==0)) {
  253.                         action = READ_FIRMWARE;
  254.                         type = FILETYPE_DOT_IPOD;
  255.                         i++;
  256.                         if (i == argc) {
  257.                                 print_usage();
  258.                                 return 1;
  259.                         }
  260.                         filename=argv[i];
  261.                 } else if ((strcmp(arg,"-rfb")==0) ||
  262.                                         (strcmp(arg,"--read-firmware-bin")==0)) {
  263.                         action = READ_FIRMWARE;
  264.                         type = FILETYPE_DOT_BIN;
  265.                         i++;
  266.                         if (i == argc) {
  267.                                 print_usage();
  268.                                 return 1;
  269.                         }
  270.                         filename=argv[i];
  271. #ifdef WITH_BOOTOBJS
  272.                 } else if ((strcmp(arg,"-we")==0) ||
  273.                                         (strcmp(arg,"--write-embedded")==0)) {
  274.                         action = WRITE_FIRMWARE;
  275.                         type = FILETYPE_INTERNAL;
  276.                         filename="[embedded bootloader]"/* Only displayed for user */
  277. #endif
  278.                 } else if ((strcmp(arg,"-wf")==0) ||
  279.                                         (strcmp(arg,"--write-firmware")==0)) {
  280.                         action = WRITE_FIRMWARE;
  281.                         type = FILETYPE_DOT_IPOD;
  282.                         i++;
  283.                         if (i == argc) {
  284.                                 print_usage();
  285.                                 return 1;
  286.                         }
  287.                         filename=argv[i];
  288.                 } else if ((strcmp(arg,"-wfb")==0) ||
  289.                                         (strcmp(arg,"--write-firmware-bin")==0)) {
  290.                         action = WRITE_FIRMWARE;
  291.                         type = FILETYPE_DOT_BIN;
  292.                         i++;
  293.                         if (i == argc) {
  294.                                 print_usage();
  295.                                 return 1;
  296.                                 }
  297.                         filename=argv[i];
  298.                 } else if ((strcmp(arg,"-r")==0) ||
  299.                                         (strcmp(arg,"--read-partition")==0)) {
  300.                         action = READ_PARTITION;
  301.                         i++;
  302.                         if (i == argc) {
  303.                                 print_usage();
  304.                                 return 1;
  305.                         }
  306.                         filename=argv[i];
  307.                 } else if ((strcmp(arg,"-w")==0) ||
  308.                                         (strcmp(arg,"--write-partition")==0)) {
  309.                         action = WRITE_PARTITION;
  310.                         i++;
  311.                         if (i == argc) {
  312.                                 print_usage();
  313.                                 return 1;
  314.                         }
  315.                         filename=argv[i];
  316.                 } else if ((strcmp(arg,"-v")==0) ||
  317.                                         (strcmp(arg,"--verbose")==0)) {
  318.                         verbose=1;
  319.                 } else if ((strcmp(arg,"-f")==0) ||
  320.                    (strcmp(arg,"--format")==0)) {
  321.                         action = FORMAT_PARTITION;
  322.                 } else if (strcmp(arg,"--read-aupd")==0) {
  323.                         action = READ_AUPD;
  324.                         i++;
  325.                         if (i == argc) {
  326.                                 print_usage();
  327.                                 return 1;
  328.                                 }
  329.                         filename=argv[i];
  330.         } else if (strcmp(arg,"--write-aupd")==0) {
  331.                         action = WRITE_AUPD;
  332.                         i++;
  333.                         if (i == argc) {
  334.                                 print_usage();
  335.                                 return 1;
  336.                                 }
  337.                         filename=argv[i];
  338.                 } else if ((strcmp(arg,"-c")==0) ||
  339.                                         (strcmp(arg,"--convert")==0)) {
  340.                         action = CONVERT_TO_FAT32;
  341.                 } else {
  342.                         print_usage();
  343.                         return 1;
  344.                 }
  345.                 i++;
  346.         }
  347.        
  348.         if (ipod.diskname[0]==0) {
  349.                 print_usage();
  350.                 return 1;
  351.         }
  352.        
  353.         if (ipod_open(&ipod, 0) < 0) {
  354.                 return -1;
  355.         }
  356.        
  357.         fprintf(stderr,"[INFO] Reading partition table from %s\n",ipod.diskname);
  358.         fprintf(stderr,"[INFO] Sector size is %d bytes\n",ipod.sector_size);
  359.        
  360.         if (read_partinfo(&ipod,0) < 0) {
  361.                 return -1;
  362.     }
  363.        
  364.         display_partinfo(&ipod);
  365.        
  366.         if (ipod.pinfo[0].start==0) {
  367.                 fprintf(stderr,"[ERR]  No partition 0 on disk:\n");
  368.                 return -1;
  369.         }
  370.        
  371.         read_directory(&ipod);
  372.        
  373.         if (ipod.nimages <= 0) {
  374.                 fprintf(stderr,"[ERR]  Failed to read firmware directory - nimages=%d\n",ipod.nimages);
  375.                 return -1;
  376.         }
  377.        
  378.         if (getmodel(&ipod,(ipod.ipod_directory[0].vers>>8)) < 0) {
  379.                 fprintf(stderr,"[ERR] Unknown version number in firmware (%08x)\n", ipod.ipod_directory[0].vers);
  380.                 return 1;
  381.         }
  382.        
  383.         printf("[INFO] iPod model: %s (\"%s\")\n",ipod.modelstr, ipod.macpod ? "Macpod" : "Winpod");
  384.        
  385.         if (ipod.ipod_directory[0].vers == 0x10000) {
  386.                 fprintf(stderr,"[ERR]  *** ipodpatcher does not support the 2nd Generation Nano! ***\n");
  387.                 exit_prompt();
  388.                 return 1;
  389.         }
  390.        
  391.         if (ipod.macpod) {
  392.                 print_macpod_warning();
  393.         }
  394.        
  395.         /* Execute the action */
  396.         if (action > LIST_IMAGES) {
  397.                 if (ipod_reopen_rw(&ipod) < 0) {
  398.                         return -1;
  399.                 }
  400.         }
  401.         switch (action) {
  402.                 case LIST_IMAGES:
  403.                         list_images(&ipod);
  404.                         break;
  405. #ifdef WITH_BOOTOBJS
  406.                 case INTERACTIVE:
  407.                         printf("Enter i to install the Rockbox bootloader, u to uninstall\n or "
  408.                                         "c to cancel and do nothing (i/u/c) :");
  409.                         if (fgets(yesno,4,stdin)) {
  410.                                 if (yesno[0]=='i') {
  411.                                         if (add_bootloader(&ipod, NULL, FILETYPE_INTERNAL)==0) {
  412.                                                 fprintf(stderr,"[INFO] Bootloader installed successfully.\n");
  413.                                         } else {
  414.                                                 fprintf(stderr,"[ERR]  --install failed.\n");
  415.                                                 return 1;
  416.                                         }
  417.                                 } else if (yesno[0]=='u') {
  418.                                         if (delete_bootloader(&ipod)==0) {
  419.                                                 fprintf(stderr,"[INFO] Bootloader removed.\n");
  420.                                         } else {
  421.                                                 fprintf(stderr,"[ERR]  Bootloader removal failed.\n");
  422.                                                 return 1;
  423.                                         }
  424.                                 } else {
  425.                                         fprintf(stderr,"[INFO] Installation cancelled.\n");
  426.                                         return 1;
  427.                                 }
  428.                         }
  429.                         exit_prompt();
  430.                         break;
  431.                
  432.                 case INSTALL:
  433.                         if (add_bootloader(&ipod, NULL, FILETYPE_INTERNAL)==0) {
  434.                                 fprintf(stderr,"[INFO] Bootloader installed successfully.\n");
  435.                         } else {
  436.                                 fprintf(stderr,"[ERR]  --install failed.\n");
  437.                                 return 1;
  438.                         }
  439.                         break;
  440. #endif
  441.                 case DELETE_BOOTLOADER:
  442.                         if (ipod.ipod_directory[0].entryOffset==0) {
  443.                                 fprintf(stderr,"[ERR]  No bootloader detected.\n");
  444.                                 return 1;
  445.                         } else {
  446.                                 if (delete_bootloader(&ipod)==0) {
  447.                                         fprintf(stderr,"[INFO] Bootloader removed.\n");
  448.                                 } else {
  449.                                         fprintf(stderr,"[ERR]  --delete-bootloader failed.\n");
  450.                                         return 1;
  451.                                 }
  452.                         }
  453.                         break;
  454.                
  455.                 case ADD_BOOTLOADER:
  456.                         if (add_bootloader(&ipod, filename, type)==0) {
  457.                                 fprintf(stderr,"[INFO] Bootloader %s written to device.\n",filename);
  458.                         } else {
  459.                                 fprintf(stderr,"[ERR]  --add-bootloader failed.\n");
  460.                                 return 1;
  461.                         }
  462.                         break;
  463.                
  464.                 case READ_FIRMWARE:
  465.                         if (read_firmware(&ipod, filename, type)==0) {
  466.                                 fprintf(stderr,"[INFO] Firmware read to file %s.\n",filename);
  467.                         } else {
  468.                                 fprintf(stderr,"[ERR]  --read-firmware failed.\n");
  469.                                 return 1;
  470.                         }
  471.                         break;
  472.                
  473.                 case WRITE_FIRMWARE:
  474.                         if (write_firmware(&ipod, filename,type)==0) {
  475.                                 fprintf(stderr,"[INFO] Firmware %s written to device.\n",filename);
  476.                         } else {
  477.                                 fprintf(stderr,"[ERR]  --write-firmware failed.\n");
  478.                                 return 1;
  479.                         }
  480.                         break;
  481.                
  482.                 case READ_AUPD:
  483.                         if (read_aupd(&ipod, filename)==0) {
  484.                                 fprintf(stderr,"[INFO] AUPD image read to file %s.\n",filename);
  485.                         } else {
  486.                                 fprintf(stderr,"[ERR]  --read-aupd failed.\n");
  487.                                 return 1;
  488.                         }
  489.                         break;
  490.                
  491.                 case WRITE_AUPD:
  492.                         if (write_aupd(&ipod, filename)==0) {
  493.                                 fprintf(stderr,"[INFO] AUPD image %s written to device.\n",filename);
  494.                         } else {
  495.                                 fprintf(stderr,"[ERR]  --write-aupd failed.\n");
  496.                                 return 1;
  497.                         }
  498.                         break;
  499.                
  500.                 case READ_PARTITION:
  501.                         outfile = open(filename,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,S_IREAD|S_IWRITE);
  502.                         if (outfile < 0) {
  503.                                 perror(filename);
  504.                                 return 1;
  505.                         }
  506.                         if (read_partition(&ipod, outfile)==0) {
  507.                                 fprintf(stderr,"[INFO] Partition extracted to %s.\n",filename);
  508.                         } else {
  509.                                 fprintf(stderr,"[ERR]  --read-partition failed.\n");
  510.                                 return 1;
  511.                         }
  512.                         close(outfile);
  513.                         break;
  514.                
  515.                 case WRITE_PARTITION:
  516.                         infile = open(filename,O_RDONLY|O_BINARY);
  517.                         if (infile < 0) {
  518.                                 perror(filename);
  519.                                 return 1;
  520.                         }
  521.                         /* Check filesize is <= partition size */
  522.                         inputsize=filesize(infile);
  523.                         if (inputsize > 0) {
  524.                                 if (inputsize <= (ipod.pinfo[0].size*ipod.sector_size)) {
  525.                                         fprintf(stderr,"[INFO] Input file is %u bytes\n",inputsize);
  526.                                         if (write_partition(&ipod,infile)==0) {
  527.                                                 fprintf(stderr,"[INFO] %s restored to partition\n",filename);
  528.                                         } else {
  529.                                                 fprintf(stderr,"[ERR]  --write-partition failed.\n");
  530.                                                 return 1;
  531.                                         }
  532.                                 } else {
  533.                                         fprintf(stderr,"[ERR]  File is too large for firmware partition: aborting!\n");
  534.                                         return 1;
  535.                                 }
  536.                         }
  537.                         close(infile);
  538.                         break;
  539.                
  540.                 case FORMAT_PARTITION:
  541.                         printf("WARNING!!! YOU ARE ABOUT TO USE AN EXPERIMENTAL FEATURE.\n");
  542.                         printf("ALL DATA ON YOUR IPOD WILL BE ERASED.\n");
  543.                         printf("Are you sure you want to format your iPod? (y/n):");
  544.                         if (fgets(yesno,4,stdin)) {
  545.                                 if (yesno[0]=='y') {
  546.                                         if (format_partition(&ipod,1) < 0) {
  547.                                                 fprintf(stderr,"[ERR]  Format failed.\n");
  548.                                                 return 1;
  549.                                         }
  550.                                 } else {
  551.                                         fprintf(stderr,"[INFO] Format cancelled.\n");
  552.                                         return 1;
  553.                                 }
  554.                         }
  555.                         break;
  556.                
  557.                 case CONVERT_TO_FAT32:
  558.                         if (!ipod.macpod) {
  559.                                 fprintf(stderr,"[ERR]  iPod is already FAT32: aborting!\n");
  560.                         } else {
  561.                                 printf("WARNING!!! YOU ARE ABOUT TO USE AN EXPERIMENTAL FEATURE.\n");
  562.                                 printf("ALL DATA ON YOUR IPOD WILL BE ERASED.\n");
  563.                                 printf("Are you sure you want to convert your iPod to FAT32? (y/n):");
  564.                                 if (fgets(yesno,4,stdin)) {
  565.                                         if (yesno[0]=='y') {
  566.                                                 if (write_dos_partition_table(&ipod) < 0) {
  567.                                                         fprintf(stderr,"[ERR]  Partition conversion failed.\n");
  568.                                                         return 1;
  569.                                                 }
  570.                                                 if (format_partition(&ipod,1) < 0) {
  571.                                                         fprintf(stderr,"[ERR]  Format failed.\n");
  572.                                                         return 1;
  573.                                                 }
  574.                                         } else {
  575.                                                 fprintf(stderr,"[INFO] Format cancelled.\n");
  576.                                                 return 1;
  577.                                         }
  578.                                 }
  579.                         }
  580.                         break;
  581.                 default:
  582.                         break;
  583.         }
  584.        
  585.         ipod_close(&ipod);
  586.         return 0; /* If nothing went wrong, assume success */
  587.        
  588. }

Update the Post

Either update this post and resubmit it with changes, or make a new post.

You may also comment on this post.

update paste below
details of the post (optional)

Note: Only the paste content is required, though the following information can be useful to others.

Save name / title?

(space separated, optional)



Please note that information posted here will expire by default in one month. If you do not want it to expire, please set the expiry time above. If it is set to expire, web search engines will not be allowed to index it prior to it expiring. Items that are not marked to expire will be indexable by search engines. Be careful with your passwords. All illegal activities will be reported and any information will be handed over to the authorities, so be good.

comments powered by Disqus
worth-right
worth-right
worth-right