Hallo zusammen,
ich habe folgendes Problem und hoffe ihr könnt mir helfen.
Ich soll ein Programm schreiben, das beliebig große Dateien kopiert und zwar mit System Calls in C.
die kopierten Dateien sollen mit MD5-Hashwerten auf Gleichheit untersucht werden.
Hab das jetzt soweit programmiert bekomme aber immer wenn ich das Programm ausführen will einen Speicherzugriffsfehler(Speicherabzug geschrieben)
ich habe folgendes Problem und hoffe ihr könnt mir helfen.
Ich soll ein Programm schreiben, das beliebig große Dateien kopiert und zwar mit System Calls in C.
die kopierten Dateien sollen mit MD5-Hashwerten auf Gleichheit untersucht werden.
Hab das jetzt soweit programmiert bekomme aber immer wenn ich das Programm ausführen will einen Speicherzugriffsfehler(Speicherabzug geschrieben)
Code:
#include <stdio.h>
#include <stdlib.h>
#include <openssl/md5.h>
#include <fcntl.h>
#define MAXBYTES 1024
main(int argc, char *argv[]) {
//Deklaration der variablen zum Einlesen
int count;
int in;
char *input=argv[1];
//Oeffnen der zu lesenden Datei
in=open(input,O_RDONLY);
//Abfrage ob Datei geoeffnet werden konnte, wenn nicht Beendigung des Programms
if(in !=-1)
{
printf("Datei %s wurde geoeffnet!\n",input);
}
else
{
printf("Datei %s konnte nicht geoeffnet werden!\n",input);
return -1;
}
//Deklaration der Variablen zum Schreiben in die Ausgabe-Datei
int out;
char *output=argv[2];
//Abfrage ob die Datei, in welche geschrieben wird geoeffnet werden konnte, wenn nicht Neuerstellung der Datei
out=open(output,O_WRONLY);
if(out !=-1)
{
printf("Datei %s wurde zum Schreiben geoeffnet!\n",output);
}
else
{
FILE *tmp=fopen(output,"r");
fclose(tmp);
out=open(output,O_WRONLY);
printf("Datei %s musste zum Schreiben NEU erstellt werden!\n", output);
}
//Deklaration fuer die MD5-Hashwerte der zu lesenden Datei
char buffer[MAXBYTES];
unsigned char md[MD5_DIGEST_LENGTH];
MD5_CTX c;
//MD5 initialisieren
MD5_Init(&c);
//Umschreiben in die neue Datei und MD5-Hashwerte aktualisieren
for(;;)
{
count = read(in, buffer, MAXBYTES);
MD5_Update(&c,buffer,(unsigned long) count);
write(out, buffer, count);
if(count<=0)break;
}
MD5_Final(&md[0],&c);
//Ausgabe MD5 Hashwerte fuer zu lesende Datei
int i=0;
for(i;i<sizeof(md);i++)
{
printf("%d",md[i]);
}
close(in);
close(out);
//MD5-Hashwert fuer neu geschriebene Datei
int in2;
in2=open(output,O_RDONLY);
if(out==0)return -1;
// Variablen deklarieren
char buffer2[MAXBYTES];
int count2;
unsigned char md2[MD5_DIGEST_LENGTH];
MD5_CTX c2;
MD5_Init(&c2);
//erstellen des MD5-Hashwertes
while(count2<=0)
{
count2=read(in2,buffer2, MAXBYTES);
MD5_Update(&c2,buffer2,(unsigned long) count2);
}
MD5_Final(&md2[0],&c2);
printf("\n");
//Ausgabe des MD5-Hashwertes
for(i=0;i<sizeof(md2);i++)
{
printf("%d",md2[i]);
}
close(in2);
//Vergleich der beiden MD5-Haswerte und Ausgabe auf der Konsole
printf("\n");
for(i=0;i<sizeof(md);i++)
{
if(md[i]!=md2[i])
{
printf("MD5-Hashwerte sind NICHT identisch.\nFehler beim kopieren der Dateien.\n");
return -1;
}
}
printf("Kopieren der Dateien erfolgreich!\nMD5-Hashwerte identisch.\n");
return 0;
}