copy command for unix

basically what I do is trying to copy a file into a sub directory. Instead of cp1 tmp tmp2, i try to do a command cp1 tmp /subDir. It supposes to copy tmp into subDir directory. What i did is creat("/subDir/tmp", COPYMODE), and it wouldn't work. Hopefully someone understand me LOL... can anyone help? thanks in advance.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/** cp1.c
 *     version 1 of cp - uses read and write with tunable buffer size
 *
 *     usage: cp1 src dest
 *
 */
#include        <stdio.h>
#include        <unistd.h>
#include        <fcntl.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<dirent.h>
#include<string.h>

#define BUFFERSIZE      4096
#define COPYMODE        0644

void oops(char *, char *);
char * make_destfilename(char*,char*);

main(int ac, char *av[])
{
        int     in_fd, out_fd, n_chars;
        char    buf[BUFFERSIZE];
        char * destfilename;
						/* check args 	*/
        if ( ac != 3 ){
                fprintf( stderr, "usage: %s source destination\n", *av);
                exit(1);
        }
        destfilename = make_destfilename(av[1],av[2]);
						/* open files	*/

        if ( (in_fd=open(av[1], O_RDONLY)) == -1 )
                oops("Cannot open ", av[1]);

        if ( (out_fd=creat( destfilename, COPYMODE)) == -1 )
                oops( "Cannot creat", av[2]);
	
						/* copy files	*/

        while ( (n_chars = read(in_fd , buf, BUFFERSIZE)) > 0 )
                if ( write( out_fd, buf, n_chars ) != n_chars )
                        oops("Write error to ", av[2]);
	if ( n_chars == -1 )
			oops("Read error from ", av[1]);

						/* close files	*/

        if ( close(in_fd) == -1 || close(out_fd) == -1 )
                oops("Error closing files","");
}

void oops(char *s1, char *s2)
{
        fprintf(stderr,"Error: %s ", s1);
        perror(s2);
        exit(1);
}
char * make_destfilename(char * src, char * dest)
{
        char * newDir;
        struct stat info;

        if(stat(dest,&info) == -1)
                 retrun dest;
        if(S_ISDIR(info.st_mode) ){
              newDir = (char *) malloc((str(src) + strlen(dest) + 1
                             *sizeof(char));
        sprintf(newDir, "%s/%s", dest, src);
        return newDir;
}

return dest;

}
creat("/subDir/tmp", COPYMODE) is a syscall call.
nevermind, i got it hehehe
creat() is deprecated, open() creates files when necessary and appropriate.In fact, creat probably calls open in some implementations, so it may even be slower...

Of course, that's assuming you're using Linux. It could be different on OpenSolaris, *BSD or whatever...
You could speed it up using asio. As it stands, you wait for each read and each write to complete.

The copied file doesn't have the same timestamp as the original.
Is asio asyncronous I/O? Why would that help? Does it stop the process from blocking?
Yes. It allows you to kick off the i/o and check for completion later without resorting to multithreading.
Topic archived. No new replies allowed.