summaryrefslogtreecommitdiff
path: root/Year_2/OS/hw
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2021-07-05 17:23:29 +0200
committerSanto Cariotti <santo@dcariotti.me>2021-07-05 17:23:29 +0200
commit0b28848f9b6584a44054f4e46871b1878ada44b8 (patch)
tree307cfc95f8e1a8988d607e4ee9d955cd01685ce5 /Year_2/OS/hw
parent4930af7dadf8745caace621cde57fe114d879881 (diff)
os: add homework 1
Diffstat (limited to 'Year_2/OS/hw')
-rw-r--r--Year_2/OS/hw/hw1.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/Year_2/OS/hw/hw1.c b/Year_2/OS/hw/hw1.c
new file mode 100644
index 0000000..814b840
--- /dev/null
+++ b/Year_2/OS/hw/hw1.c
@@ -0,0 +1,90 @@
+/*
+ Homework n.1
+
+ Scrivere un programma in linguaggio C che permetta di copiare un numero
+ arbitrario di file regolari su una directory di destinazione preesistente.
+
+ Il programma dovra' accettare una sintassi del tipo:
+ $ homework-1 file1.txt path/file2.txt "nome con spazi.pdf" directory-destinazione
+*/
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int copyfile(int*, int*);
+
+int main(int argc, char* argv[0])
+{
+ int fd, fd_dst;
+ int i;
+ unsigned long size;
+ char dst[1024];
+ char buffer[1024];
+ char *p1, *p2;
+
+ if (argc < 3) {
+ fprintf(stderr, "Use %s <src1> [<src2>..] <dst>", argv[0]);
+ exit(1);
+ }
+
+ i = 1;
+ strncpy(dst, argv[argc - 1], 1024);
+ size = strlen(dst);
+ strncpy(dst + size, "/", 1024 - size);
+ size++;
+ while (i < argc - 1) {
+ /* Open the source file */
+ if ((fd = open(argv[i], O_RDONLY)) == -1) {
+ perror(argv[i]);
+ exit(1);
+ }
+
+ /* Open the destination file */
+ strncpy(buffer, dst, size);
+ p1 = p2 = argv[i++];
+ while (*p2 != '\0') {
+ if (*p2 == '/')
+ p1 = p2 + 1;
+ p2++;
+ }
+ strncpy(buffer + size, p1, 1024 - size);
+
+ if ((fd_dst = open(buffer, O_CREAT | O_TRUNC | O_WRONLY, 0644)) == -1) {
+ perror(argv[argc - 1]);
+ exit(1);
+ }
+
+ /* Ignore the return value, the last number of bytes returned. Result is
+ * always = 0 */
+ copyfile(&fd, &fd_dst);
+ close(fd);
+ close(fd_dst);
+ printf("`%s` written successfully\n", buffer);
+ }
+
+ return 0;
+}
+
+int copyfile(int* src, int* dst)
+{
+ int n;
+ char* buffer[1024];
+
+ do {
+ if ((n = read(*src, buffer, 1024)) == -1) {
+ perror("Error reading the source file");
+ exit(1);
+ }
+
+ if (write(*dst, buffer, n) == -1) {
+ perror("Error writing the destination file");
+ exit(1);
+ }
+ } while (n > 0);
+
+ return n;
+}