home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 522 / okami12 / format.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-17  |  6.2 KB  |  254 lines

  1. /**********************************************************************
  2.  
  3.     Programm zum Formatieren von Disketten
  4.  
  5.           wr 18.04.90-02.06.90
  6.              
  7.       zum Aufruf als TTP oder von der Okami-Shell
  8.  
  9. Änderungen:
  10.  
  11. 20.10.90  Volume Label (-l)
  12.  
  13. **********************************************************************/
  14.  
  15. #include <stdio.h>
  16. #include <osbind.h>
  17. #include <ctype.h>
  18.  
  19. #define PRGNAME     "format"    /* eigentlich: argv[0]            */
  20. #define FLAG_NOBOOT (-99)    /* Flag für keinen Bootsektor anlegen    */
  21. #define FLAG_NOFMT  (-987)    /* Flag für nur Bootsektor anlegen    */
  22. #define MAGIC        0x87654321L /* Magische Zahl, hexhexhex        */
  23. #define SECSIZE     512     /* Bytes pro Sektor            */
  24. #define FMTBUFSIZE  0x3000    /* Formatierpuffer            */
  25.  
  26. /* VT52-Steuercodes */
  27. #define C_SAVE        "\033j"
  28. #define C_RESTORE    "\033k"
  29.  
  30.  
  31.  
  32. main(argc,argv)
  33. int argc;
  34. char *argv[];
  35. {
  36.   int    devno;            /* Laufwerksnummer: 0 A:, 1 B:        */
  37.   int    spt;            /* Sektoren pro Track            */
  38.   int    Sides;            /* Anzahl Seiten (1/2)            */
  39.   int    Tracks;         /* Anzahl Tracks            */
  40.   int    interlv;        /* Interleave-Faktor            */
  41.   int    virgin;         /* Virgin-Wort für Sektoren        */
  42.   long    SerNo;            /* Seriennummer für Bootsektor        */
  43.   int    Exec;            /* Bootsektor ausführbar        */
  44.   int    Quiet;            /* Flag Sicherheitsabfragen: 0 ja,1 nein */
  45.   char *VolLbl;            /* Diskettenname oder NULL        */
  46.  
  47.   int i;
  48.   
  49.   /* Standardwerte initialisieren */
  50.   devno   = 0;            /* Laufwerk A:                */
  51.   spt      = 9;            /* 9 Sektoren pro Track         */
  52.   Sides   = 2;            /* 2 Seiten pro Diskette        */
  53.   Tracks  = 80;         /* 79 Tracks pro Diskette        */
  54.   interlv = 1;            /* Kein Interleave            */
  55.   virgin  = 0xe5e5;        /* Normalerweise immer            */
  56.   SerNo   = 0x01000001L;    /* zufällige Seriennummer        */
  57.   Exec      = 0;            /* nicht ausführbar            */
  58.   Quiet   = 0;            /* mit Sicherheitsabfragen        */
  59.   VolLbl  = NULL;        /* kein Diskettenname            */
  60.   
  61.   if (argc==1)            /* keine Parameter angegeben        */
  62.   {
  63.     Format(devno,spt,Sides,Tracks,interlv,virgin,SerNo,Exec,Quiet);
  64.     exit(0);
  65.   }
  66.   
  67.   /* Parameter scannen */
  68.   for (i=1;i<argc;i++)
  69.   {
  70.     if (argv[i][0]=='-')        /* Flag */
  71.       switch(argv[i][1])
  72.       {
  73.     case 's':            /* Sektoren pro Track    */
  74.       spt=atoi(argv[i][2]);
  75.       break;
  76.     case 't':            /* Tracks pro Disk    */
  77.       Tracks=atoi(argv[i][2]); 
  78.       break;
  79.     case '1':            /* Einseitig        */
  80.       Sides=1;
  81.       break;
  82.     case 'i':            /* Interleaf-Faktor    */
  83.       interlv=atoi(argv[i][2]);
  84.       break;
  85.     case 'v':            /* Virgin-Wort        */
  86.       virgin=atoi(argv[i][2]);
  87.       break;
  88.     case 'n':            /* Seriennummer     */
  89.       SerNo=atol(argv[i][2]);
  90.       break;
  91.     case 'N':            /* kein Bootsektor    */
  92.       Exec=FLAG_NOBOOT;
  93.       break;
  94.     case 'B':            /* nur Bootsektor    */
  95.       Exec=FLAG_NOFMT;
  96.       break;
  97.     case 'x':            /* Bootsektor ausführbar*/
  98.       Exec=1;
  99.       break;
  100.     case 'q':            /* keine Sicherheitsabfragen */
  101.       Quiet=1;
  102.       break;
  103.     case 'l':            /* Diskettenname    */
  104.       VolLbl= &(argv[i][2]);
  105.       break;
  106.     default:            /* Falsches Flag    */
  107.       Usage(PRGNAME);
  108.       }
  109.     else                /* Laufwerksnummer    */
  110.       devno=tolower(argv[i][0])-'a';
  111.  
  112.   } /* for */
  113.  
  114.   Format(devno,spt,Sides,Tracks,interlv,virgin,SerNo,Exec,Quiet,VolLbl);
  115.   
  116.   exit(0);
  117. }
  118.  
  119.  
  120. Format(devno,spt,Sides,Tracks,interlv,virgin,SerNo,Exec,Quiet,VolLbl)
  121. int devno,spt,interlv,virgin,Exec,Quiet;
  122. register int Tracks,Sides;
  123. long SerNo;
  124. char *VolLbl;
  125. {
  126.   register int i,j;
  127.   register char *Buf;
  128.   
  129.   if (Exec!=FLAG_NOFMT)
  130.   {
  131.   
  132.     if (!Quiet)
  133.     {
  134.   
  135.       /* Parameter checken */
  136.       if (devno!=0 && devno!=1)
  137.       {   
  138.     printf("You are about to format drive %c.\n",(char)devno+'A');    
  139.     YesOrNo();
  140.       }
  141.     
  142.       if (virgin!=0xe5e5)
  143.       {
  144.     printf("You are about to format with a virgin of 0x%x.\n",virgin);
  145.     YesOrNo();
  146.       }
  147.     
  148.     
  149.       /* Letzte Warnung */
  150.       printf(
  151.       "LAST CHANCE TO STOP:\nYou are about to format the disk in drive %c.\n",
  152.       (char)devno+'A');
  153.     
  154.       YesOrNo();
  155.     
  156.     } /* if (!Quiet) */
  157.       
  158.     /* Los gehts */
  159.     
  160.     /* Speicher für Rückgabewert */
  161.     Buf=calloc(FMTBUFSIZE,sizeof(int));
  162.     if (Buf==NULL)
  163.     {
  164.       fprintf("%s: Out of memory (need %d bytes)\n",PRGNAME,
  165.                         FMTBUFSIZE*sizeof(int));
  166.       exit(0);
  167.     }
  168.     
  169.     /* *** FORMATIEREN *** */
  170.     
  171.     printf("Formatting disk %c, %d side(s), %d tracks, %d sec/track\n%s",
  172.                 (char)devno+'A',Sides,Tracks,spt,C_SAVE);
  173.       
  174.     for (i=Tracks-1;i>=0;i--)
  175.       for (j=0;j<Sides;j++)
  176.       {
  177.     printf("%s%sSide %d Track 0x%02x",C_RESTORE,C_SAVE,j,i);
  178.     fflush(stdout);
  179.     Flopfmt((int *)Buf,0L,devno,spt,i,j,interlv,MAGIC,
  180.                             i>1 ? virgin : 0);
  181.                 /* (Sektor 0 und 1 nullen wegen FAT) */
  182.       }       
  183.  
  184.     free(Buf);
  185.     fputs(C_RESTORE,stdout);
  186.  
  187.   } /* if (Formatieren) */ 
  188.  
  189.   /* *** BOOTSEKTOR *** */
  190.   
  191.   if (Exec!=FLAG_NOBOOT)
  192.   {
  193.     printf("Creating %sexecutable boot sector",Exec ? "" : "non-");
  194.     fflush(stdout);
  195.     Buf=malloc(SECSIZE);
  196.     Protobt(Buf,SerNo,(Sides-1)+(((Tracks/40)-1)<<1),Exec);
  197.     Flopwr(Buf,0L,devno,1,0,0,1);
  198.     free(Buf);
  199.   }
  200.  
  201.   fputc('\n',stdout);
  202.  
  203.   /* Diskettenname erzeugen */
  204.   if (VolLbl!=NULL && *VolLbl!='\0')
  205.   {
  206.     int Fd;
  207.     char Path[80+1];
  208.  
  209.     printf("Creating volume label\n");
  210.     sprintf(Path,"%c:\\%s",devno+'A',VolLbl);
  211.     Fd = Fcreate(Path,0);
  212.     if (Fd<0)
  213.       printf("*** Error: cannot create volume label\n");
  214.     else
  215.     {
  216.       Fclose(Fd);
  217.       Fattrib(Path,1,1<<3);
  218.     }
  219.   }
  220. }
  221.  
  222.  
  223. YesOrNo()
  224. {
  225.   register int c;    /* Warum register? Warum nicht?         */
  226.  
  227.   printf("Do you really want to do that? (y or n)\n");
  228.   c=fgetc(stdin);
  229.  
  230.   if (tolower(c)!='y')
  231.     exit(0); /* ja, es IST miserabler Stil, aber es ist einfach */
  232.  
  233. }
  234.  
  235.  
  236. Usage(PrgName)
  237. char PrgName[];
  238. {
  239.   fprintf(stderr,
  240.    "Usage: %s [-s(Sec/Trk)] [-t(Trk/Dsk)] [-1] [-i(interlv)] \\\n%s",PrgName,
  241.    "       [-v(virgin)] [-n(SerNo)] [-(N|B)] [-x] [-q] [-l(VolLbl)] [Drive]");
  242.   fprintf(stderr,"\nDefaults: -s9 -t80 -i1 -v0xE5E5 A:\n\n");
  243.   fprintf(stderr,"-1: Format Single Sided\n%s\n%s\n%s\n%s\n%s\n%s\n",
  244.          "-N: No Boot Sector",
  245.          "-B: Boot Sector only",
  246.          "-x: Executable Boot Sector",
  247.          "-q: No security requests",
  248.          "-l: Volume Label (default: none)",
  249.          "Drive: A or B (floppy disk drives only, no hard disks!)");
  250.   
  251.   exit(0);
  252. }
  253.  
  254.