home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 575 / okami13b / format.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-15  |  7.2 KB  |  286 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. Datum      Ver.    Änderung
  10. 20.10.90  1.1    Volume Label (-l)
  11. 14.01.91  1.2    Schwerer Fehler beseitigt: &argv[i][2] statt argv[i][2]
  12. 24.05.91  1.3    Fehlerabfragen; -V: Versionsnummer
  13. 25.07.91  1.4    MSDOS-kompatibler Bootsektor
  14.  
  15. **********************************************************************/
  16. static char _M_ID[]="@(#)format.c - Okami Format";
  17.  
  18. #include <stdio.h>
  19. #include <osbind.h>
  20. #include <ctype.h>
  21.  
  22. /* Die Datei cmpdat.h enthält das Kompilierungsdatum des Programms,
  23. ** wer diese Datei nicht hat, kann das include gegen das folgende
  24. ** define austauschen:
  25.     #define _CMP_DAT "????"
  26. ** und statt ???? das aktuelle Datum eintragen.
  27. */
  28. #include <cmpdat.h>
  29.  
  30. #define PRGNAME     "format"    /* eigentlich: argv[0]            */
  31. #define VERSION        "1.4"    /* Versionsnummer            */
  32. #define FLAG_NOBOOT (-99)    /* Flag für keinen Bootsektor anlegen    */
  33. #define FLAG_NOFMT  (-987)    /* Flag für nur Bootsektor anlegen    */
  34. #define MAGIC        0x87654321L /* Magische Zahl, hexhexhex        */
  35. #define SECSIZE     512     /* Bytes pro Sektor            */
  36. #define FMTBUFSIZE  0x3000    /* Formatierpuffer            */
  37.  
  38. /* VT52-Steuercodes */
  39. #define C_SAVE        "\033j"
  40. #define C_RESTORE    "\033k"
  41.  
  42. char TError[]="!!! Error";
  43.  
  44.  
  45. main(argc,argv)
  46. int argc;
  47. char *argv[];
  48. {
  49.   int    devno;            /* Laufwerksnummer: 0 A:, 1 B:        */
  50.   int    spt;            /* Sektoren pro Track            */
  51.   int    Sides;            /* Anzahl Seiten (1/2)            */
  52.   int    Tracks;         /* Anzahl Tracks            */
  53.   int    interlv;        /* Interleave-Faktor            */
  54.   int    virgin;         /* Virgin-Wort für Sektoren        */
  55.   long    SerNo;            /* Seriennummer für Bootsektor        */
  56.   int    Exec;            /* Bootsektor ausführbar        */
  57.   int    Quiet;            /* Flag Sicherheitsabfragen: 0 ja,1 nein */
  58.   char *VolLbl;            /* Diskettenname oder NULL        */
  59.  
  60.   int i;
  61.   
  62.   /* Standardwerte initialisieren */
  63.   devno   = 0;            /* Laufwerk A:                */
  64.   spt      = 9;            /* 9 Sektoren pro Track         */
  65.   Sides   = 2;            /* 2 Seiten pro Diskette        */
  66.   Tracks  = 80;         /* 79 Tracks pro Diskette        */
  67.   interlv = 1;            /* Kein Interleave            */
  68.   virgin  = 0xe5e5;        /* Normalerweise immer            */
  69.   SerNo   = 0x01000001L;    /* zufällige Seriennummer        */
  70.   Exec      = 0;            /* nicht ausführbar            */
  71.   Quiet   = 0;            /* mit Sicherheitsabfragen        */
  72.   VolLbl  = NULL;        /* kein Diskettenname            */
  73.   
  74.   if (argc==1)            /* keine Parameter angegeben        */
  75.   {
  76.     Format(devno,spt,Sides,Tracks,interlv,virgin,SerNo,Exec,Quiet);
  77.     exit(0);
  78.   }
  79.   
  80.   /* Parameter scannen */
  81.   for (i=1;i<argc;i++)
  82.   {
  83.     if (argv[i][0]=='-')        /* Flag */
  84.       switch(argv[i][1])
  85.       {
  86.         case 'V':            /* Versionsnummer    */
  87.       printf("Okami Format V%s\n",VERSION);
  88.       printf("compiled %s\n",_CMP_DAT);
  89.       exit(0);
  90.     case 's':            /* Sektoren pro Track    */
  91.       spt=atoi(&argv[i][2]);
  92.       break;
  93.     case 't':            /* Tracks pro Disk    */
  94.       Tracks=atoi(&argv[i][2]); 
  95.       break;
  96.     case '1':            /* Einseitig        */
  97.       Sides=1;
  98.       break;
  99.     case 'i':            /* Interleaf-Faktor    */
  100.       interlv=atoi(&argv[i][2]);
  101.       break;
  102.     case 'v':            /* Virgin-Wort        */
  103.       virgin=atoi(&argv[i][2]);
  104.       break;
  105.     case 'n':            /* Seriennummer     */
  106.       SerNo=atol(&argv[i][2]);
  107.       break;
  108.     case 'N':            /* kein Bootsektor    */
  109.       Exec=FLAG_NOBOOT;
  110.       break;
  111.     case 'B':            /* nur Bootsektor    */
  112.       Exec=FLAG_NOFMT;
  113.       break;
  114.     case 'x':            /* Bootsektor ausführbar*/
  115.       Exec=1;
  116.       break;
  117.     case 'q':            /* keine Sicherheitsabfragen */
  118.       Quiet=1;
  119.       break;
  120.     case 'l':            /* Diskettenname    */
  121.       VolLbl= &(argv[i][2]);
  122.       break;
  123.     default:            /* Falsches Flag    */
  124.       Usage(PRGNAME);
  125.       }
  126.     else                /* Laufwerksnummer    */
  127.       devno=tolower(argv[i][0])-'a';
  128.  
  129.   } /* for */
  130.  
  131.   Format(devno,spt,Sides,Tracks,interlv,virgin,SerNo,Exec,Quiet,VolLbl);
  132.   
  133.   exit(0);
  134. }
  135.  
  136.  
  137. Format(devno,spt,Sides,Tracks,interlv,virgin,SerNo,Exec,Quiet,VolLbl)
  138. int devno,spt,interlv,virgin,Exec,Quiet;
  139. register int Tracks,Sides;
  140. long SerNo;
  141. char *VolLbl;
  142. {
  143.   register int i,j;
  144.   register char *Buf;
  145.   int Erg;
  146.   
  147.   if (Exec!=FLAG_NOFMT)
  148.   {
  149.   
  150.     if (!Quiet)
  151.     {
  152.   
  153.       /* Parameter checken */
  154.       if (devno!=0 && devno!=1)
  155.       {   
  156.     printf("You are about to format drive %c.\n",(char)devno+'A');    
  157.     YesOrNo();
  158.       }
  159.     
  160.       if (virgin!=0xe5e5)
  161.       {
  162.     printf("You are about to format with a virgin of 0x%x.\n",virgin);
  163.     YesOrNo();
  164.       }
  165.     
  166.     
  167.       /* Letzte Warnung */
  168.       printf(
  169.       "LAST CHANCE TO STOP:\nYou are about to format the disk in drive %c.\n",
  170.       (char)devno+'A');
  171.     
  172.       YesOrNo();
  173.     
  174.     } /* if (!Quiet) */
  175.       
  176.     /* Los gehts */
  177.     
  178.     /* Speicher für Rückgabewert */
  179.     Buf=calloc(FMTBUFSIZE,sizeof(int));
  180.     if (Buf==NULL)
  181.     {
  182.       fprintf(stderr,"%s: Out of memory (need %d bytes)\n",PRGNAME,
  183.                         FMTBUFSIZE*sizeof(int));
  184.       exit(1);
  185.     }
  186.     
  187.     /* *** FORMATIEREN *** */
  188.     
  189.     printf("Formatting disk %c, %d side%s, %d tracks, %d sec/track\n%s",
  190.         (char)devno+'A',Sides,Sides==1?"":"s",Tracks,spt,C_SAVE);
  191.  
  192.     for (i=Tracks-1;i>=0;i--)
  193.       for (j=0;j<Sides;j++)
  194.       {
  195.     printf("%s%sSide %d Track %d  ",C_RESTORE,C_SAVE,j,i);
  196.     fflush(stdout);
  197.     Erg=Flopfmt((int *)Buf,0L,devno,spt,i,j,interlv,MAGIC,
  198.                             i>1 ? virgin : 0);
  199.     if (Erg!=0)
  200.     {
  201.       fprintf(stderr,"\n%s %d on side %d, track %d\n",TError,Erg,j,i);
  202.       free(Buf);
  203.       exit(1);
  204.     }
  205.       }       
  206.  
  207.     free(Buf);
  208.     fputs(C_RESTORE,stdout);
  209.  
  210.   } /* if (Formatieren) */ 
  211.  
  212.   /* *** BOOTSEKTOR *** */
  213.   
  214.   if (Exec!=FLAG_NOBOOT)
  215.   {
  216.     printf("Creating %sexecutable boot sector",Exec ? "" : "non-");
  217.     fflush(stdout);
  218.     Buf=malloc(SECSIZE);
  219.     Protobt(Buf,SerNo,(Sides-1)+(((Tracks/40)-1)<<1),Exec);
  220.     /* MSDOS-kompatibel */
  221.     Buf[0]=0xeb;
  222.     Buf[1]=0x34;
  223.     Buf[2]=0x90;
  224.     /*strncpy(Buf+4,"Okami",5);*/
  225.     Erg=Flopwr(Buf,0L,devno,1,0,0,1);
  226.     free(Buf);
  227.     if (Erg!=0)
  228.     {
  229.       fprintf(stderr,"\n%s %d writing bootsector\n",TError,Erg);
  230.       exit(1);
  231.     }
  232.   }
  233.  
  234.   fputc('\n',stdout);
  235.  
  236.   /* Diskettenname erzeugen */
  237.   if (VolLbl!=NULL && *VolLbl!='\0')
  238.   {
  239.     int Fd;
  240.     char Path[80+1];
  241.  
  242.     printf("Creating volume label");
  243.     fflush(stdout);
  244.     sprintf(Path,"%c:\\%s",devno+'A',VolLbl);
  245.     Fd = Fcreate(Path,1<<3);
  246.     if (Fd<0)
  247.       fprintf(stderr,"\n\t%s %d creating volume label\n",TError,Erg);
  248.     else
  249.       Fclose(Fd);
  250.     fputc('\n',stdout);
  251.   }
  252. }
  253.  
  254.  
  255. YesOrNo()
  256. {
  257.   int c;
  258.  
  259.   printf("Do you really want to do that? (y or n)\n");
  260.   c=fgetc(stdin);
  261.  
  262.   if (tolower(c)!='y')
  263.     exit(0); /* ja, es IST miserabler Stil, aber es ist einfach */
  264.  
  265. }
  266.  
  267.  
  268. Usage(PrgName)
  269. char PrgName[];
  270. {
  271.   fprintf(stderr,
  272.    "Usage: %s [-V]|[-s(Sec/Trk)] [-t(Trk/Dsk)] [-1] [-i(interlv)] \\\n%s",PrgName,
  273.    "       [-v(virgin)] [-n(SerNo)] [-(N|B)] [-x] [-q] [-l(VolLbl)] [Drive]");
  274.   fprintf(stderr,"\nDefaults: -s9 -t80 -i1 -v0xE5E5 A:\n\n");
  275.   fprintf(stderr,"-1: Format Single Sided\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
  276.          "-N: No Boot Sector",
  277.          "-B: Boot Sector only",
  278.          "-x: Executable Boot Sector",
  279.          "-q: No security requests",
  280.          "-l: Volume Label (default: none)",
  281.          "-V: just print version number",
  282.          "Drive: A or B (floppy disk drives only, no hard disks!)");
  283.  
  284.   exit(1);
  285. }
  286.