copy command for unix

Apr 19, 2010 at 6:17pm
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;

}
Apr 19, 2010 at 6:18pm
creat("/subDir/tmp", COPYMODE) is a syscall call.
Apr 19, 2010 at 6:58pm
nevermind, i got it hehehe
Apr 19, 2010 at 7:28pm
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...
Apr 20, 2010 at 11:08am
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.
Apr 20, 2010 at 12:02pm
Is asio asyncronous I/O? Why would that help? Does it stop the process from blocking?
Apr 20, 2010 at 1:24pm
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.