Dateien kopieren mit Systemcalls

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)

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;
}
 
Kompiliere dein Programm mit Debugging-Symbolen, lasse es im Debugger laufen und schau wo der Speicherzugriffsfehler ausgelöst wird. Damit lernst du auch gleich das Debuggen von Programmen. :)
 
Ok, habe ich gemacht und habe erstmal den Teil gelöscht, der den Fehler verursacht hat und zwar

Code:
FILE *tmp=fopen(output,"r");
		fclose(tmp);
		out=open(output,O_WRONLY);
 
Hey, ich bin es nochmal.
Also nachdem ich den Code rausgeworfen habe funktioniert das Programm, aber nun sind die verglichenen MD5-Hashwerte nicht identisch wenn die Datei, in welche geschrieben wird nicht existiert.
woran kann das liegen?

habe den Fehler jetzt soweit eingegrenzt, dass bei der Neuerstellung nicht mehr aus dem else-Block rausgegangen wird sondern darin verblieben wird und als Standardeingabe für die neuerstellte <Datei die Tastatur angewählt wird.
 
Zuletzt bearbeitet:
ich habe gerade noch probiert

Code:
open(output, O_WRONLY | O_CREAT | O_EXCL)

klappt aber auch noch nicht.

was meinst du mit korrekt allozieren??(hoffe "DU" ist ok)
 
Zuletzt bearbeitet:
output ist ein dynamisches Character-Array. Woher weiss dein Rechner wie gross dieses ist, wie viel Speicher er dafür also reservieren muss?

Schau dir mal Tutorials oder die Manpage zu malloc() an.
 
Hm?

char *output=argv[2];

argv ist char**, also ist argv[idx] char*, sehe da gerade kein Problem..... sofern argv auch drei lang ist...
 
ich poste nochmal den aktuellen code
Code:
#include <stdio.h>
#include <stdlib.h>
#include <openssl/md5.h>
#include <fcntl.h>
#define MAXBYTES 1024
int  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_CREAT | O_EXCL | O_WRONLY);
	printf("%d \n",out);
	if(out !=-1)
	{
		printf("Datei %s wurde zum Schreiben geoeffnet!\n",output);
	}
	else
	{	
		printf("Datei %s musste zum Schreiben NEU erstellt werden!\n", output);
		return -1;
	}
//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;
}


und zwar bei dem Öffnen der Dateien zum Schreiben verbleibt er immer in dem else-Block bzw. führt das Programm nicht weiter aus.
Warum ist das so?


bzw. ist das Problem, dass wenn die Datei in welche geschrieben werden soll nicht existiert wird die neu erstellt, aber Schreibgeschützt.
nur wenn ich vorher eine Datei erstelle und dann in die Schreibe läuft das Programm durch
 
Zuletzt bearbeitet:
Also, als erstes (ich gehe davon aus, dass gcc verwendet wird):

gcc bietet hilfreiche Checks:
zumindest: gcc -Wall -Wextra
"besser":
gcc -Wall -Wextra -pedantic -std=c99 (oder c89, oder gnuXX - je nach dem welche Standardeinhaltung erwünscht ist)
oder auch:
gcc -Wall -Wextra -Wstrict-prototypes -Wpointer-arith -Wcast-qual -pedantic -std=c99
Warning Options - Using the GNU Compiler Collection (GCC)
Das dürfte zahlreiche Hinweise auf mögliche Fehlerquellen liefern.

Dann gibt es noch errno:
errno.h - Wikipedia, the free encyclopedia
The GNU C Library - Error Reporting (Beispiel)

und zwar bei dem Öffnen der Dateien zum Schreiben verbleibt er immer in dem else-Block bzw. führt das Programm nicht weiter aus.
Warum ist das so?
=>
Code:
O_CREAT | O_EXCL | O_WRONLY
man open hat gesagt.:
O_CREAT
If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created;
...
O_EXCL
If O_CREAT and O_EXCL are set, open() shall fail if the file exists

bzw. ist das Problem, dass wenn die Datei in welche geschrieben werden soll nicht existiert wird die neu erstellt, aber Schreibgeschützt.
nur wenn ich vorher eine Datei erstelle und dann in die Schreibe läuft das Programm durch
=>
man open hat gesagt.:
O_CREAT
... Otherwise, the file shall be created; ... and the access permission bits (see <sys/stat.h>) of the file mode shall be set to the value of the third argument taken as type mode_t modified as follows: a bitwise AND is performed on the file-mode
=> Zugriffsrechte beim Erstellen der Datei nicht gesetzt => Verhalten ist undefiniert.
Einfach mal
stat output
bzw.
stat -c "%a" output
Ausgabe anschauen.

Also open Aufruf, bei dem die Datei erstellt werden soll, mal ändern:
http://www.kernel.org/doc/man-pages/online/pages/man2/stat.2.html
Permission Bits - The GNU C Library (oder man schreibt direkt den Mode als 0644)
Code:
open(output, O_CREAT | O_WRONLY, S_IRUSR | S_IRUSR, S_IRGRP | S_IWGRP | S_IROTH)
Ferner:
Md5 sind als Hexdump imho praktischer ;) => printf("%X ", md);
md5sum output Ausgabe könnte zur Kontrolle auch hilfreich sein.


indent -bap -bli0 -fca war mein Freund ;)
Code:
[color=#007020]#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <openssl/md5.h>
[/color]
[color=#007020]#define MAXBYTES 1024
[/color]
[color=#902000]int[/color]
[color=#06287e]main[/color] ([color=#902000]int[/color] argc, [color=#902000]char[/color] [color=#666666]*[/color]argv[])
{
  [color=#60a0b0][i]// Deklaration der variablen zum Einlesen
[/i][/color]  [color=#902000]int[/color] count;
  [color=#902000]int[/color] in;
  [color=#007020][b]if[/b][/color] (argc [color=#666666]<[/color] [color=#40a070]3[/color])
  {
    printf ([color=#4070a0]"Usage: mycopy input_file output_file\n"[/color]);
    [color=#007020][b]return[/b][/color] [color=#666666]-[/color][color=#40a070]1[/color];
  }
  [color=#902000]char[/color] [color=#666666]*[/color]input [color=#666666]=[/color] argv[[color=#40a070]1[/color]];
  [color=#60a0b0][i]// Oeffnen der zu lesenden Datei
[/i][/color]  in [color=#666666]=[/color] open (input, O_RDONLY);
  [color=#60a0b0][i]// Abfrage ob Datei geoeffnet werden konnte, wenn nicht Beendigung des
[/i][/color]  [color=#60a0b0][i]// Programms
[/i][/color]  [color=#007020][b]if[/b][/color] (in [color=#666666]!=[/color] [color=#666666]-[/color][color=#40a070]1[/color])
  {
    printf ([color=#4070a0]"Datei %s wurde geoeffnet![/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color], input);
  }
  [color=#007020][b]else[/b][/color]
  {
    printf ([color=#4070a0]"Datei %s konnte nicht geoeffnet werden![/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color], input);
    [color=#007020][b]return[/b][/color] [color=#666666]-[/color][color=#40a070]1[/color];
  }
  [color=#60a0b0][i]// Deklaration der Variablen zum Schreiben in die Ausgabe-Datei
[/i][/color]  [color=#902000]int[/color] out;
  [color=#902000]char[/color] [color=#666666]*[/color]output [color=#666666]=[/color] argv[[color=#40a070]2[/color]];
  [color=#60a0b0][i]// Abfrage ob die Datei, in welche geschrieben wird geoeffnet werden
[/i][/color]  [color=#60a0b0][i]// konnte, wenn nicht Neuerstellung der Datei
[/i][/color]  out [color=#666666]=[/color]
    open (output, O_CREAT [color=#666666]|[/color] O_WRONLY,
	  S_IRUSR [color=#666666]|[/color] S_IRUSR [color=#666666]|[/color] S_IRGRP [color=#666666]|[/color] S_IWGRP [color=#666666]|[/color] S_IROTH);
  [color=#007020][b]if[/b][/color] (out [color=#666666]!=[/color] [color=#666666]-[/color][color=#40a070]1[/color])
  {
    printf ([color=#4070a0]"Datei %s wurde zum Schreiben geoeffnet![/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color], output);
  }
  [color=#007020][b]else[/b][/color]
  {
    fprintf (stderr, [color=#4070a0]"Couldn't open file %s; %s[/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color], output, strerror (errno));
    [color=#007020][b]return[/b][/color] [color=#666666]-[/color][color=#40a070]1[/color];
  }
  [color=#60a0b0][i]// Deklaration fuer die MD5-Hashwerte der zu lesenden Datei 
[/i][/color]  [color=#902000]char[/color] buffer[MAXBYTES];
  [color=#902000]unsigned[/color] [color=#902000]char[/color] md[MD5_DIGEST_LENGTH];
  MD5_CTX c;
  [color=#60a0b0][i]// MD5 initialisieren
[/i][/color]  MD5_Init ([color=#666666]&[/color]c);

  [color=#60a0b0][i]// Umschreiben in die neue Datei und MD5-Hashwerte aktualisieren
[/i][/color]  [color=#007020][b]for[/b][/color] (;;)
  {
    count [color=#666666]=[/color] read (in, buffer, MAXBYTES);
    MD5_Update ([color=#666666]&[/color]c, buffer, ([color=#902000]unsigned[/color] [color=#902000]long[/color]) count);
    write (out, buffer, count);
    [color=#007020][b]if[/b][/color] (count [color=#666666]<=[/color] [color=#40a070]0[/color])
      [color=#007020][b]break[/b][/color];
  }

  MD5_Final ([color=#666666]&[/color]md[[color=#40a070]0[/color]], [color=#666666]&[/color]c);
  [color=#60a0b0][i]// Ausgabe MD5 Hashwerte fuer zu lesende Datei
[/i][/color]  [color=#902000]unsigned[/color] i;
  [color=#007020][b]for[/b][/color] (i [color=#666666]=[/color] [color=#40a070]0[/color]; i [color=#666666]<[/color] [color=#007020][b]sizeof[/b][/color] (md); i[color=#666666]++[/color])
  {
    printf ([color=#4070a0]"%X "[/color], md[i]);
  }
  close (in);
  close (out);

  [color=#60a0b0][i]// MD5-Hashwert fuer neu geschriebene Datei
[/i][/color]  [color=#902000]int[/color] in2;
  in2 [color=#666666]=[/color] open (output, O_RDONLY);
  [color=#007020][b]if[/b][/color] (out [color=#666666]==[/color] [color=#40a070]0[/color])
    [color=#007020][b]return[/b][/color] [color=#666666]-[/color][color=#40a070]1[/color];
  [color=#60a0b0][i]// Variablen deklarieren
[/i][/color]  [color=#902000]char[/color] buffer2[MAXBYTES];
  [color=#902000]int[/color] count2;
  [color=#902000]unsigned[/color] [color=#902000]char[/color] md2[MD5_DIGEST_LENGTH];
  MD5_CTX c2;
  MD5_Init ([color=#666666]&[/color]c2);
  [color=#60a0b0][i]// erstellen des MD5-Hashwertes
[/i][/color]  [color=#007020][b]while[/b][/color] (count2 [color=#666666]<=[/color] [color=#40a070]0[/color])
  {
    count2 [color=#666666]=[/color] read (in2, buffer2, MAXBYTES);
    MD5_Update ([color=#666666]&[/color]c2, buffer2, ([color=#902000]unsigned[/color] [color=#902000]long[/color]) count2);

  }
  MD5_Final ([color=#666666]&[/color]md2[[color=#40a070]0[/color]], [color=#666666]&[/color]c2);
  printf ([color=#4070a0]"[/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color]);

  [color=#60a0b0][i]// Ausgabe des MD5-Hashwertes
[/i][/color]  [color=#007020][b]for[/b][/color] (i [color=#666666]=[/color] [color=#40a070]0[/color]; i [color=#666666]<[/color] [color=#007020][b]sizeof[/b][/color] (md2); i[color=#666666]++[/color])
  {
    printf ([color=#4070a0]"%X "[/color], md2[i]);
  }
  close (in2);
  [color=#60a0b0][i]// Vergleich der beiden MD5-Haswerte und Ausgabe auf der Konsole
[/i][/color]  printf ([color=#4070a0]"[/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color]);
  [color=#007020][b]for[/b][/color] (i [color=#666666]=[/color] [color=#40a070]0[/color]; i [color=#666666]<[/color] [color=#007020][b]sizeof[/b][/color] (md); i[color=#666666]++[/color])
  {
    [color=#007020][b]if[/b][/color] (md[i] [color=#666666]!=[/color] md2[i])
    {
      printf
	([color=#4070a0]"MD5-Hashwerte sind NICHT identisch.[/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]Fehler beim kopieren der Dateien.[/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color]);
      [color=#007020][b]return[/b][/color] [color=#666666]-[/color][color=#40a070]1[/color];
    }
  }
  printf ([color=#4070a0]"Kopieren der Dateien erfolgreich![/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]MD5-Hashwerte identisch.[/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color]);

  [color=#007020][b]return[/b][/color] [color=#40a070]0[/color];
}
------------------------
Bitte bearbeiten Sie die folgende Aufgabe selbstständig :evil:
Code:
while(count2<=0)
	{
		count2=read(in2,buffer2, MAXBYTES);
		MD5_Update(&c2,buffer2,(unsigned long) count2);

was passiert, wenn die Dateigröße kein Vielfaches von MAXBYTES ist?
 
Guten Abend alle zusammen,
ich möchte mich bei Euch für die ganzen hilfreichen Tipps und auch für die Lösungshilfen bedanken.
DANKE!

ich habe heute noch die Aufgaben weiterbearbeitet und bin für mich zu einem Ergebnis gekommen.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <openssl/md5.h>
#include <fcntl.h>
#include <unistd.h>
#define MAXBYTES 1024
int  main(int argc, char *argv[]) {
	

//Deklaration der variablen
	int count;
	int in;
	char *input=argv[1];
	int out;
        char *output=argv[2];
	char buffer[MAXBYTES];
        unsigned char md[MD5_DIGEST_LENGTH];
        MD5_CTX c;
	char buffer2[MAXBYTES];
        int count2;
        unsigned char md2[MD5_DIGEST_LENGTH];
        MD5_CTX c2;
	int in2;	
//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;
	}
//Abfrage ob die Datei, in welche geschrieben wird geoeffnet werden konnte, wenn nicht Neuerstellung der Datei
	out=open(output,O_CREAT | O_EXCL | O_RDWR | O_TRUNC,S_IRWXU);
	perror("open");	
	if(out !=-1)
	{
		printf("Datei %s wurde zum Schreiben geoeffnet!\n",output);
	}
	else
	{	
		printf("Datei %s musste zum Schreiben NEU erstellt werden!\n", output);
	}
//MD5 initialisieren
	MD5_Init(&c);
//	printf("MD5-INIT");
//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,&c);
//Ausgabe MD5 Hashwerte fuer zu lesende Datei
	int i=0;
	for(i=0;i<sizeof(md);i++)
	{
		printf("%02x",md[i]);
	}
printf("\n");
	close(in);
	close(out);

//MD5-Hashwert fuer neu geschriebene Datei
	in2=open(output,O_RDONLY);
	if(out==0)return -1;
	MD5_Init(&c2);
//erstellen des MD5-Hashwertes
	for(;;)
	{
		count2=read(in2,buffer2, MAXBYTES);
		MD5_Update(&c2,buffer2,(unsigned long) count2);
		if(count2<=0)break;		
	}
	MD5_Final(md2,&c2);
	printf("\n");

//Ausgabe des MD5-Hashwertes
	for(i=0;i<sizeof(md2);i++)
	{
		printf("%02x",md2[i]);
	}
	printf("\n");
	close(in2);
//Vergleich der beiden MD5-Haswerte und Ausgabe auf der Konsole
	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;
}

natürlich darf jeder noch weitere Verbesserungsvorschläge posten wenn er möchte.

Nochmals DANKE

Gruß Daniel:):)
 
Zuletzt bearbeitet von einem Moderator:
Kurz:
Code:
gcc md5copy.c 
Fehler: »S_IRWXU« nicht deklariert

zumindest ohne
Code:
#include <sys/stat.h>

dann:
Code:
out=open(output,O_CREAT | O_EXCL | O_RDWR | O_TRUNC,S_IRWXU);
if(out !=-1)
	{
		printf("Datei %s wurde zum Schreiben geoeffnet!\n",output);
	}
	else
	{	
		printf("Datei %s musste zum Schreiben NEU erstellt werden!\n", output);
	}
Was passiert, wenn die Datei bereits existiert? Wird diese tatsächlich neu erstellt?
einfach mal:
./my_copy file1 file1_copy
und dann
./my_copy file2 file1_copy
ausprobieren und sich fragen, warum die MD5 Summen nicht übereinstimmen ;)

Code:
	for(;;)
	{
		count = read(in, buffer, MAXBYTES);	
		MD5_Update(&c,buffer,(unsigned long) count);
		write(out, buffer, count);
		if(count<=0)break;
	}
Ist es denn eine gute Idee, zuerst Daten einzulesen, dann zu verarbeiten, dann zu schreiben und erst zum Schluss zu prüfen, ob der Einlesevorgang tatsächlich erfolgreich war?
Was passiert bei einem Fehler - also z.B wenn -1 zurückgegeben wird?
write signatur:
write(int fd, const void *buf, size_t count);
size_t => ein unsigned integer;
einfach mal testen
Code:
printf("%u", -1);
Wobei natürlich
Code:
int MD5_Update(MD5_CTX *c, const void *data, unsigned long len);
=> MD5_Update(bla, data, -1);
schon vorher für einen Segfault sorgen dürfte :)
 
:) du siehst, gar nicht so schwer. Die System Calls sind eine sehr einfache Möglichkeit, wenn man sich Tippbefehle ersparen möchte.
 
Zurück
Oben