|
|
@@ -1,13 +1,44 @@
|
|
|
+#include <sys/sendfile.h>
|
|
|
+#include <sys/types.h>
|
|
|
+#include <sys/stat.h>
|
|
|
+#include <string.h>
|
|
|
+#include <errno.h>
|
|
|
+#include <fcntl.h>
|
|
|
#include "sandbox.h"
|
|
|
|
|
|
+struct s_file_wrapper {
|
|
|
+ struct s_sandboxenv *env;
|
|
|
+ t_fileinfo *current_file;
|
|
|
+ int outfd;
|
|
|
+};
|
|
|
+
|
|
|
+int apply_page(void **_page, void *_wrapper)
|
|
|
+{
|
|
|
+ struct s_file_wrapper *wrapper = (struct s_file_wrapper *) _wrapper;
|
|
|
+ t_filepage *page = (t_filepage *)*_page;
|
|
|
+ size_t bwritten;
|
|
|
+
|
|
|
+ lseek(wrapper->outfd, page->offset_start, SEEK_SET);
|
|
|
+ bwritten = sendfile(wrapper->outfd, wrapper->current_file->local_fd, NULL, page->len);
|
|
|
+ if (bwritten != page->len)
|
|
|
+ fprintf(wrapper->env->errorOutput, "Error: write error to %s\n", wrapper->current_file->filename);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
int apply_file(void **_data, void *_env)
|
|
|
{
|
|
|
- struct s_sandboxenv *env = * (struct s_sandboxenv **) _env;
|
|
|
- t_fileinfo *fi = (t_fileinfo *) _data;
|
|
|
+ struct s_sandboxenv *env = (struct s_sandboxenv *) _env;
|
|
|
+ t_fileinfo *fi = (t_fileinfo *) *_data;
|
|
|
+ struct s_file_wrapper wrapper;
|
|
|
|
|
|
-#warning todo
|
|
|
- (void) fi;
|
|
|
- (void) env;
|
|
|
+ lseek(fi->local_fd, 0, SEEK_SET);
|
|
|
+ wrapper.env = env;
|
|
|
+ wrapper.current_file = fi;
|
|
|
+ wrapper.outfd = open(fi->filename, O_WRONLY, 0644);
|
|
|
+ if (wrapper.outfd == -1)
|
|
|
+ fprintf(env->errorOutput, "Error: write error to %s (%s)\n", fi->filename, strerror(errno));
|
|
|
+ else
|
|
|
+ sllist_foreach(fi->modif_write, apply_page, &wrapper);
|
|
|
return 0;
|
|
|
}
|
|
|
|