Newsgroup: it.comp.os.linux.development
Titolo: Problema scrittura floppy con write

Salve NG,
Stavo cercando di copiare un floppy con write, ma non riesco a copiare i 
primi 512 byte (ossia la parte dove giace la formattazione) mentre con read 
riesco a vederli. Ecco il codice:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define MAXARRAY 3000000
#define MAXBYTEFLOPPY 1474560
// public variables
unsigned char szBuffer[MAXARRAY];
size_t TotBuffer;
int Copia;
int fdFloppy;
FILE *USCITA;
int StartRead;
int StopRead;
// functions
int CommandLine(int argc, char *argv[]);
int CopiaFloppy(void);
//////////////////////////////////////////////////
/////////////////////////////////////////////////
int main(int argc, char *argv[])
{
 int contatore;
 int contTab, contRet;
 int contOff;
StartRead = 0;
 //unsigned char szBuffer[TotBuffer+1]
 TotBuffer = MAXBYTEFLOPPY; /
 Copia = 0; //nessuna copia
// verifica la riga di comandi
 if (CommandLine(argc, argv) != 0)  {
        return(0);
 }
 StopRead = TotBuffer;
 /* open floppy disk
  */
 if( ( fdFloppy = open("/dev/fd0", O_RDONLY) ) == -1 ) {
  printf("Cannot open floppy disk drive\n");
  return 0;
 }
 lseek(fdFloppy, 0, SEEK_SET);
 read(fdFloppy, szBuffer, TotBuffer);
 /* close floppy disk
  */
 if( close(fdFloppy) == -1)
  printf("Cannot close drive\n");
 if(Copia ==1) {
        CopiaFloppy();
 }
 contTab=0;
 contRet=0;
 contOff=StartRead;
 // scrive l'intestazione
 fprintf(USCITA,"\nOFFSET  0 1 2 3  4 5 6 7  8 9 A B  C D E F\n");
 for(contatore=StartRead;contatore<StopRead; contatore++) {
        if(contRet == 0) {
                 fprintf(USCITA,"%06x ",contOff);
        }
        fprintf(USCITA,"%02x",szBuffer[contatore]);
        contTab++;
        contRet++;
        contOff++;
        if(contTab == 4) {
                fprintf(USCITA," ");
                contTab =0;
        }
        if(contRet == 16) {
                fprintf(USCITA,"\n");
                contRet =0;
        }
 }
 printf("\n");
  return 0;
}
///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
int CommandLine(int argc, char *argv[])  {
 static char optstring[] = "f:hb:c";  
 int Opzioni_Riga;
 time_t Data_Odierna;
 const char *Path_Device;
 USCITA = stdout;
   // verifica le opzioni passate da riga di comando
     while (( Opzioni_Riga = getopt (argc, argv, optstring)) != -1 )
     switch (Opzioni_Riga)  {
                case 'f' :
                        // il file dove mandare l'output video
                       if((USCITA = fopen(optarg,"a"))   == NULL)  {
                                USCITA = stdout;
                       }
                       else   {
                                 // ottieni la data odierna
                               /* time(&Data_Odierna); */
                                // scrivi la data corrente
                              /*  
fprintf(USCITA,"%s",ctime(&Data_Odierna)); */
                       }
                       printf("%s \n", "Opzione -f elaborata");
                break;
                case 'h' :
                      // messaggio di help
                printf("%s \n", "Opzione -h elaborata");
              printf("Usare:\n\t-h\tQuesto help\n");
            printf("\t-f\tFile dove salvare la mappa in esadecimale\n");
                      printf("\t-b\tNumero di bytes da leggere\n");
                      printf("\t-c\tCrea copia del floppy\n");
                      return (1);
                break;
                case 'b' :
                       // byte da leggere
                       printf("Opzione -b '%s'  elaborata\n", optarg);
                       TotBuffer = atoi(optarg);
                break;
                case 'c' :
                      // crea copia
                      printf("%s \n", "Opzione -c elaborata");
                      Copia =1;
                break;
                default:
                      printf("Opzione sconosciuta \n");
    }
        return(0);
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
int CopiaFloppy(void)  {
 int Risposta, contatore;
 printf("\nInserire un floppy vuoto !!!\n");
 printf("Copiare (s/n) ? ");
 Risposta = getchar();
if(Risposta == 's') {
 /* open floppy disk */
 if( ( fdFloppy = open("/dev/fd0", O_RDONLY) ) == -1 ) {
  printf("Cannot open floppy disk drive\n");
  return 0;
 }
 /* scrivi il floppy */
   for(contatore=StartRead;contatore<StopRead; contatore++) {
      lseek(fdFloppy, 0, SEEK_SET);
      write(fdFloppy, szBuffer,1);
      printf("\rScritto %d bytes",contatore);
   }
 /* close floppy disk */
 if( close(fdFloppy) == -1)
  printf("Cannot close drive\n");
}
 return(0);
}
-- 
______________________________
chi va pian va san e va lontan

  }
Mi rispondo da solo :P
Vi pare che posso scrivere con write un file aperto con O_RDONLY ?
Devo cambiare gli occhiali :))))
Grazie, Nicola.
