Symlink kopieren mit Kern-Funktionen?



  • Hallo ich versuche gerade unter Unix einen Dateikopierer zu bauen.
    Weiß jemand wie ich einen Symlink kopiere?
    Normale Dateien lassen sich kopieren.
    So sieht mein Programm bis jetzt aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/stat.h>
    
    int copyPipe(char* data, char* target){
    
    }
    
    int copyData(char* data, char* target){
    	int in, out, count;
    	char buffer[512], name[512];
    
    	//buffer leeren
    	memset(buffer,0,sizeof(buffer));
    
    	//String kopieren und quelle anhaengen
    	strcpy(name,target);
    	strcat(name,data);
    
    	//Quelldatei oeffnen
    	if((in = open(data, O_RDONLY))==-1){
    		printf("Fehler beim oeffnen der Zieldatei\n");
    		return EXIT_FAILURE;
    	}
    
    	//Zieldatei oeffnen / anlegen
    	if((out=open(name,O_RDWR|O_CREAT|O_TRUNC,S_IRWXU)) == -1) {
    	      printf("fehler beim oeffnen/anlegen der Zieldatei\n");
    	      return EXIT_FAILURE;
    	}
    
    	//inhalt der Quelldatei einlesen
    	while(count = read(in, buffer, sizeof(buffer))){
    		//Zieldatei beschreiben
    		if((write(out, buffer, sizeof(buffer))) == -1) {
    			printf("Fehler bei write\n");
    			return EXIT_FAILURE;
    		}
    	}
    
    	//Dateien schliessen
    	close(in);
    	close(out);
    	return EXIT_SUCCESS;
    }
    
    int main(int argc, const char *argv[]){
    
    	struct stat stat_buf;
    	int i;
    
    	//mit jedem Schleifendurchlauf wird eine Datei kopiert
    	for(i=1;i<argc-1;i++){
    		if ( lstat(argv[i], &stat_buf) == -1){
    			fprintf(stderr, "Datei nicht vorhanden\n");
    		}
    
    		//Datei 
    		else if ( S_ISREG(stat_buf.st_mode) ){
    			copyData(argv[i], argv[argc-1]);
    		}
    		//Link
    		else if ( S_ISLNK(stat_buf.st_mode) ){
    			copyData(argv[i], argv[argc-1]);
    		}
    
    		//Pipe
    		else if ( S_ISFIFO(stat_buf.st_mode) ){
    			copyPipe(argv[i], argv[argc-1]);
    		}
    
    		else{
    			fprintf(stderr, "Daten nicht kompatibel\n");
    		}
    	}
    	return 0;
    }
    

Anmelden zum Antworten