=================================================================== RCS file: /cvs/djgpp/djgpp/src/utils/djsplit.c,v retrieving revision 1.1 retrieving revision 1.2 diff -p -u -r1.1 -r1.2 --- djgpp/src/utils/djsplit.c 1998/07/12 15:29:54 1.1 +++ /cvs/djgpp/djgpp/src/utils/djsplit.c 2001/01/20 09:20:38 1.2 @@ -5,13 +5,17 @@ #include #include #include +#include +#include +#include #include static void usage(void) { - fprintf(stderr,"Usage: djsplit [inputFile] [chunkSize] [outputBase]\n"); + fprintf(stderr,"Usage: djsplit [-t] [inputFile] [chunkSize] [outputBase]\n"); fprintf(stderr, "chunksize is bytes or kbytes (ex: 1440k), creates .000, .001, etc\n"); + fprintf(stderr, " -t means don't set the chunks' time stamp and modes as for original file\n"); exit(1); } @@ -24,6 +28,20 @@ p_open(char *ob, int p) return open(partname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666); } +static void +p_set_modes(char *ob, int p, struct stat *stbuf) +{ + char partname[FILENAME_MAX]; + struct utimbuf timbuf; + + sprintf(partname, "%s.%03d", ob, p); + timbuf.actime = stbuf->st_atime; + timbuf.modtime = stbuf->st_mtime; + utime(partname, &timbuf); + chown(partname, stbuf->st_uid, stbuf->st_gid); + chmod(partname, stbuf->st_mode); +} + char *buf; int bufsize; @@ -34,8 +52,10 @@ main(int argc, char **argv) int partnum; int inf, f; char *endp; + struct stat stbuf; + int preserve_file_time = 1; - if (argc != 4) + if (argc != 4 && argc != 5) usage(); inf = open(argv[1], O_RDONLY|O_BINARY); @@ -57,6 +77,17 @@ main(int argc, char **argv) } printf("buf size: %d\n", bufsize); + if (strcmp(argv[2], "-t") == 0) + { + preserve_file_time = 0; + ++argv; + } + else if (fstat(inf, &stbuf) != 0) + { + perror("Couldn't fstat, file's time and modes won't be preserved"); + preserve_file_time = 0; + } + chunksize = strtol(argv[2], &endp, 0); if (chunksize < 1) usage(); @@ -85,6 +116,7 @@ main(int argc, char **argv) { close(f); close(inf); + p_set_modes(argv[3], partnum, &stbuf); exit(0); } @@ -94,6 +126,7 @@ main(int argc, char **argv) if (left == 0) { close(f); + p_set_modes(argv[3], partnum, &stbuf); partnum++; f = p_open(argv[3], partnum); left = chunksize;