On Mon, 24 Sep 2012 12:55:31 +0200 Sebastian Dransfeld <s...@tango.flipp.net> said:
> On 09/22/2012 08:29 PM, Enlightenment SVN wrote: > > Log: > > E17: Added secure delete option (experimental !). Wait for discomfitor to > > add it to EFM conf panel > > > > When removing a file, we store a E_FM_OP_DESTROY task, > > which overwrites file with 3 passes of (~)randomized > > data, and when we store a E_FM_OP_REMOVE task, to remove > > the randomized file. > > > > If it's a dir, skip E_FM_OP_DESTROY. > > > > Patch by Maxime Villard (rustyBSD) > > Isn't it better to mmap the file when writing? Instead of doing a > theoretically (if ((buf = malloc(st2.st_size)) == NULL)) huge malloc? better than mmap - just writ a fixed buffer of 0xff until file full in a loop. u dont need any of it mapped in at all. > S. > > > > > > > Author: caro > > Date: 2012-09-22 11:29:03 -0700 (Sat, 22 Sep 2012) > > New Revision: 77020 > > Trac: http://trac.enlightenment.org/e/changeset/77020 > > > > Modified: > > trunk/e/src/bin/e_fm_op.c trunk/e/src/bin/e_fm_op.h > > > > Modified: trunk/e/src/bin/e_fm_op.c > > =================================================================== > > --- trunk/e/src/bin/e_fm_op.c 2012-09-22 18:20:29 UTC (rev 77019) > > +++ trunk/e/src/bin/e_fm_op.c 2012-09-22 18:29:03 UTC (rev 77020) > > @@ -31,6 +31,7 @@ > > #include <utime.h> > > #include <errno.h> > > #include <limits.h> > > +#include <fcntl.h> > > > > #include <Ecore.h> > > #include <Ecore_File.h> > > @@ -45,6 +46,7 @@ > > #define READBUFSIZE 65536 > > #define COPYBUFSIZE 16384 > > #define REMOVECHUNKSIZE 4096 > > +#define NB_PASS 3 > > > > #define E_FREE(p) do { free(p); p = NULL; } while (0) > > > > @@ -102,6 +104,9 @@ > > static int _e_fm_op_symlink_atom(E_Fm_Op_Task *task); > > static int _e_fm_op_remove_atom(E_Fm_Op_Task *task); > > static int _e_fm_op_rename_atom(E_Fm_Op_Task *task); > > +static int _e_fm_op_destroy_atom(E_Fm_Op_Task *task); > > +static int _e_fm_op_random_buf(char *buf, ssize_t len); > > +static char _e_fm_op_random_char(); > > > > Ecore_Fd_Handler *_e_fm_op_stdin_handler = NULL; > > > > @@ -182,12 +187,21 @@ > > type = E_FM_OP_MOVE; > > else if (!strcmp(argv[1], "rm")) > > type = E_FM_OP_REMOVE; > > + else if (!strcmp(argv[1], "srm")) > > + type = E_FM_OP_SECURE_REMOVE; > > else if (!strcmp(argv[1], "lns")) > > type = E_FM_OP_SYMLINK; > > else if (!strcmp(argv[1], "mvf")) > > type = E_FM_OP_RENAME; > > else return 0; > > > > + if ((type == E_FM_OP_SECURE_REMOVE) || > > + (type == E_FM_OP_MOVE)) > > + { > > + _e_fm_op_work_queue = eina_list_append(_e_fm_op_work_queue, NULL); > > + _e_fm_op_separator = _e_fm_op_work_queue; > > + } > > + > > if ((type == E_FM_OP_COPY) || > > (type == E_FM_OP_SYMLINK) || > > (type == E_FM_OP_MOVE) || > > @@ -195,12 +209,6 @@ > > { > > if (argc < 4) goto quit; > > > > - if (type == E_FM_OP_MOVE) > > - { > > - _e_fm_op_work_queue = eina_list_append(_e_fm_op_work_queue, > > NULL); > > - _e_fm_op_separator = _e_fm_op_work_queue; > > - } > > - > > if ((argc >= 4) && (ecore_file_is_dir(argv[last]))) > > { > > char buf[PATH_MAX]; > > @@ -365,7 +373,7 @@ > > else > > goto quit; > > } > > - else if (type == E_FM_OP_REMOVE) > > + else if ((type == E_FM_OP_REMOVE) || (type == E_FM_OP_SECURE_REMOVE)) > > { > > E_Fm_Op_Task *task; > > > > @@ -742,6 +750,8 @@ > > _e_fm_op_copy_atom(task); > > else if (task->type == E_FM_OP_REMOVE) > > _e_fm_op_remove_atom(task); > > + else if (task->type == E_FM_OP_DESTROY) > > + _e_fm_op_destroy_atom(task); > > else if (task->type == E_FM_OP_COPY_STAT_INFO) > > _e_fm_op_copy_stat_info_atom(task); > > else if (task->type == E_FM_OP_SYMLINK) > > @@ -1466,6 +1476,34 @@ > > > > _e_fm_op_work_queue = eina_list_prepend(_e_fm_op_work_queue, > > rtask); } > > + else if (task->type == E_FM_OP_SECURE_REMOVE) > > + { > > + /* Overwrite task. */ > > + _e_fm_op_update_progress(NULL, 0, task->src.st.st_size); > > + ctask = _e_fm_op_task_new(); > > + > > + ctask->src.name = eina_stringshare_add(task->src.name); > > + memcpy(&(ctask->src.st), &(task->src.st), sizeof(struct stat)); > > + if (task->dst.name) > > + ctask->dst.name = eina_stringshare_add(task->dst.name); > > + ctask->type = E_FM_OP_DESTROY; > > + > > + _e_fm_op_work_queue = eina_list_prepend(_e_fm_op_work_queue, > > ctask); + > > + /* Remove task. */ > > + _e_fm_op_update_progress(NULL, 0, REMOVECHUNKSIZE); > > + rtask = _e_fm_op_task_new(); > > + > > + rtask->src.name = eina_stringshare_add(task->src.name); > > + memcpy(&(rtask->src.st), &(task->src.st), sizeof(struct stat)); > > + if (task->dst.name) > > + rtask->dst.name = eina_stringshare_add(task->dst.name); > > + rtask->type = E_FM_OP_REMOVE; > > + > > + _e_fm_op_work_queue = eina_list_append_relative_list > > (_e_fm_op_work_queue, rtask, _e_fm_op_separator); + > > + ctask->link = eina_list_next(_e_fm_op_separator); > > + } > > else if (task->type == E_FM_OP_MOVE) > > { > > /* Copy task. */ > > @@ -1633,3 +1671,99 @@ > > > > return 0; > > } > > + > > +/* EXPERIMENTAL */ > > +static int > > +_e_fm_op_destroy_atom(E_Fm_Op_Task *task) > > +{ > > + if (_e_fm_op_abort) goto finish; > > + static int fd = -1; > > + static char *buf = NULL; > > + > > + if (fd == -1) > > + { > > + E_FM_OP_DEBUG("Secure remove: %s\n", task->src.name); > > + struct stat st2; > > + > > + if (!S_ISREG(task->src.st.st_mode)) > > + goto finish; > > + > > + if (task->src.st.st_nlink > 1) > > + goto finish; > > + > > + if ((fd = open(task->src.name, O_WRONLY|O_NONBLOCK|O_NOFOLLOW, 0)) > > == -1) > > + goto finish; > > + > > + if (fstat(fd, &st2) == -1) > > + goto finish; > > + > > + if (st2.st_dev != task->src.st.st_dev || > > + st2.st_ino != task->src.st.st_ino || > > + !S_ISREG(st2.st_mode)) > > + goto finish; > > + > > + if ((buf = malloc(st2.st_size)) == NULL) > > + goto finish; > > + > > + task->src.st.st_size = st2.st_size; > > + } > > + > > + if (lseek(fd, SEEK_SET, 0) == -1) > > + goto finish; > > + > > + if (_e_fm_op_random_buf(buf, task->src.st.st_size) == -1) > > + memset(buf, 0xFF, task->src.st.st_size); > > + if (write(fd, buf, task->src.st.st_size) != task->src.st.st_size) > > + goto finish; > > + if (fsync(fd) == -1) > > + goto finish; > > + > > + task->dst.done++; > > + _e_fm_op_update_progress_report_simple > > ((double)task->dst.done/NB_PASS*100, "/dev/urandom", task->src.name); + > > + if (task->dst.done == NB_PASS) > > + goto finish; > > + > > + return 1; > > + > > +finish: > > + close(fd); > > + fd = -1; > > + E_FREE(buf); > > + task->finished = 1; > > + return 1; > > +} > > + > > +static int > > +_e_fm_op_random_buf(char *buf, ssize_t len) > > +{ > > + int f = -1; > > + ssize_t i; > > + > > + if ((f = open("/dev/urandom", O_RDONLY)) == -1) > > + { > > + for (i=0; i < len; i++) > > + { > > + buf[i] = _e_fm_op_random_char(); > > + } > > + return 0; > > + } > > + > > + if (read(f, buf, len) != len) > > + { > > + for (i=0; i < len; i++) > > + { > > + buf[i] = _e_fm_op_random_char(); > > + } > > + } > > + > > + close(f); > > + return 0; > > +} > > + > > +static char > > +_e_fm_op_random_char() > > +{ > > + srand((unsigned int)time(NULL)); > > + return (rand() % 256) + 'a'; > > +} > > > > Modified: trunk/e/src/bin/e_fm_op.h > > =================================================================== > > --- trunk/e/src/bin/e_fm_op.h 2012-09-22 18:20:29 UTC (rev 77019) > > +++ trunk/e/src/bin/e_fm_op.h 2012-09-22 18:29:03 UTC (rev 77020) > > @@ -50,7 +50,9 @@ > > E_FM_OP_UNMOUNT_ERROR, > > E_FM_OP_EJECT, > > E_FM_OP_EJECT_DONE, > > - E_FM_OP_EJECT_ERROR > > + E_FM_OP_EJECT_ERROR, > > + E_FM_OP_SECURE_REMOVE, > > + E_FM_OP_DESTROY > > } E_Fm_Op_Type; > > > > #else > > > > > > ------------------------------------------------------------------------------ > > How fast is your code? > > 3 out of 4 devs don\\\'t know how their code performs in production. > > Find out how slow your code is with AppDynamics Lite. > > http://ad.doubleclick.net/clk;262219672;13503038;z? > > http://info.appdynamics.com/FreeJavaPerformanceDownload.html > > _______________________________________________ > > enlightenment-svn mailing list > > enlightenment-...@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > > > > > ------------------------------------------------------------------------------ > Live Security Virtual Conference > Exclusive live event will cover all the ways today's security and > threat landscape has changed and how IT managers can respond. Discussions > will include endpoint security, mobile security and the latest in malware > threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ > _______________________________________________ > enlightenment-devel mailing list > enlightenment-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- The Rasterman (Carsten Haitzler) ras...@rasterman.com ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://ad.doubleclick.net/clk;258768047;13503038;j? http://info.appdynamics.com/FreeJavaPerformanceDownload.html _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel