1 /* 2 * copy.c 3 * 4 * Kopiert eine Datei. 5 * Verwendet elementare Ein-/Ausgabe nach POSIX-Standard. 6 * 7 * Author H.Drachenfels 8 * Erstellt am: 9.11.2023 9 */
10
11 #define _POSIX_C_SOURCE 1
12
13 #include <stdio.h> // fprintf
14 #include <string.h> // strerror
15
16 #include <fcntl.h> // open, O_RDONLY, O_WRONLY, O_CREAT, O_EXCL
17 #include <sys/stat.h> // mode_t, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
18 #include <unistd.h> // read, write, fsync
19 #include <errno.h> // errno
20
21 int main(int argc, char *argv[])
22 {
23 if (argc != 3)
24 {
25 fprintf(stderr, "Aufruf: %s Quelle Ziel\n", argv[0]);
26 return 1;
27 }
28
29 int in = open(argv[1], O_RDONLY); // Dateindeskriptor Quelle
30 if (in == -1)
31 {
32 fprintf(stderr,
33 "Quelle %s kann nicht geoeffnet werden (errno %d: %s)\n",
34 argv[1], errno, strerror(errno));
35 return 1;
36 }
37
38 const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; // rw-r--r--
39 int out = open(argv[2], O_WRONLY | O_CREAT | O_EXCL, mode); // Dateiseskriptor Ziel
40 if (out == -1)
41 {
42 fprintf(stderr,
43 "Ziel %s kann nicht erzeugt werden (errno %d: %s)\n",
44 argv[2], errno, strerror(errno));
45 return 1;
46 }
47
48 int n;
49 unsigned char b;
50 while ((n = read(in, &b, 1)) > 0)
51 {
52 int m = write(out, &b, 1);
53 if (m != 1)
54 {
55 fprintf(stderr,
56 "Schreibfehler (errno %d: %s)\n", errno, strerror(errno));
57 return 1;
58 }
59 }
60
61 if (n < 0)
62 {
63 fprintf(stderr,
64 "Lesefehler (errno %d: %s)\n", errno, strerror(errno));
65 return 1;
66 }
67
68 if (fsync(out) < 0) // Puffer leeren (flush)
69 {
70 fprintf(stderr,
71 "Schreibfehler (errno %d: %s)\n", errno, strerror(errno));
72 return 1;
73 }
74
75 if (close(out) < 0)
76 {
77 fprintf(stderr,
78 "Ziel %s kann nicht geschlossen werden (errno %d: %s)\n",
79 argv[2], errno, strerror(errno));
80 return 1;
81 }
82
83 if (close(in) < 0)
84 {
85 fprintf(stderr,
86 "Quelle %s kann nicht geschlossen werden (errno %d: %s)\n",
87 argv[1], errno, strerror(errno));
88 return 1;
89 }
90
91 return 0;
92 }
93