Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_fm.c e_fm_main.c 


Log Message:


fops are now almsot all in e_fm slave. need to put mounting in there too later.

===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm.c,v
retrieving revision 1.142
retrieving revision 1.143
diff -u -3 -r1.142 -r1.143
--- e_fm.c      12 Apr 2007 14:34:03 -0000      1.142
+++ e_fm.c      14 Apr 2007 16:28:13 -0000      1.143
@@ -1426,7 +1426,8 @@
                  finf.rlnk = rlnk;
                  
                  evdir = ecore_file_get_dir(path);
-                 if ((sd->id == e->ref_to) && (!strcmp(dir, evdir)))
+                 if ((sd->id == e->ref_to) && 
+                     ((!strcmp(evdir, "") || (!strcmp(dir, evdir)))))
                    {
                       if (e->response == 0)/*live changes*/
                         {
@@ -1457,16 +1458,19 @@
                                      if (sd->busy_count == 1)
                                        edje_object_signal_emit(sd->overlay, 
"e,state,busy,start", "e");
                                   }
-                                file = ecore_file_get_file(path);
-                                if ((!strcmp(file, ".order")))
-                                  sd->order_file = 1;
-                                else
-                                  {
-                                     if (!((file[0] == '.') && 
-                                           (!sd->show_hidden_files)))
-                                       _e_fm2_file_add(l->data, file,
-                                                       sd->order_file, 
-                                                       NULL, 0, &finf);
+                                if (path[0] != 0)
+                                  {                       
+                                     file = ecore_file_get_file(path);
+                                     if ((!strcmp(file, ".order")))
+                                       sd->order_file = 1;
+                                     else
+                                       {
+                                          if (!((file[0] == '.') && 
+                                                (!sd->show_hidden_files)))
+                                            _e_fm2_file_add(l->data, file,
+                                                            sd->order_file, 
+                                                            NULL, 0, &finf);
+                                       }
                                   }
                                 if (e->response == 2)/* end of scan */
                                   {
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm_main.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- e_fm_main.c 12 Apr 2007 14:34:03 -0000      1.7
+++ e_fm_main.c 14 Apr 2007 16:28:13 -0000      1.8
@@ -9,6 +9,7 @@
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/param.h>
+#include <utime.h>
 #include <math.h>
 #include <fnmatch.h>
 #include <limits.h>
@@ -39,20 +40,6 @@
 #define DEF_ROUND_TRIP 0.05
 #define DEF_ROUND_TRIP_TOLERANCE 0.01
 
-typedef enum _E_Fop_Type
-{
-   E_FOP_NONE,
-   E_FOP_DEL,
-   E_FOP_TRASH,
-   E_FOP_RENAME,
-   E_FOP_MV,
-   E_FOP_CP,
-   E_FOP_MKDIR,
-   E_FOP_MOUNT,
-   E_FOP_UMOUNT,
-   E_FOP_LAST
-} E_Fop_Type;
-
 typedef struct _E_Dir E_Dir;
 typedef struct _E_Fop E_Fop;
 
@@ -62,6 +49,7 @@
    const char         *dir;
    Ecore_File_Monitor *mon;
    int                 mon_ref;
+   E_Dir              *mon_real;
    Evas_List          *fq;
    Ecore_Idler        *idler;
    int                 dot_order;
@@ -73,9 +61,10 @@
 struct _E_Fop
 {
    int                 id;
-   E_Fop_Type          type;
    const char         *src;
    const char         *dst;
+   Ecore_Idler        *idler;
+   void               *data;
 };
 
 /* local subsystem functions */
@@ -94,12 +83,17 @@
 static void _e_file_mon_list_sync(E_Dir *ed);
 
 static int _e_cb_file_mon_list_idler(void *data);
+static int _e_cb_fop_rm_idler(void *data);
+static int _e_cb_fop_trash_idler(void *data);
+static int _e_cb_fop_mv_idler(void *data);
+static int _e_cb_fop_cp_idler(void *data);
 static char *_e_str_list_remove(Evas_List **list, char *str);
 
 /* local subsystem globals */
 static Ecore_Ipc_Server *_e_ipc_server = NULL;
 
 static Evas_List *_e_dirs = NULL;
+static Evas_List *_e_fops = NULL;
 static int _e_sync_num = 0;
 
 /* externally accessible functions */
@@ -208,9 +202,9 @@
          {
             E_Dir *ed, *ped = NULL;
             DIR *dir;
-            
             Evas_List *l;
             
+            /* look for any previous dir entries monitoring this dir */
             for (l = _e_dirs; l; l = l->next)
               {
                  E_Dir *ed;
@@ -218,13 +212,17 @@
                  ed = l->data;
                  if ((ed->mon) && (!strcmp(ed->dir, e->data)))
                    {
+                      /* found a previous dir - save it in ped */
                       ped = ed;
                       break;
                    }
               }
+            /* open the dir to list */
             dir = opendir(e->data);
             if (!dir)
               {
+                 /* we can't open the dir - tell E the dir is deleted as
+                  * we can't look in it */
                  _e_file_mon_dir_del(e->ref, e->data);
               }
             else
@@ -235,19 +233,28 @@
                  char buf[4096];
                  FILE *f;
                  
+                 /* create a new dir entry */
                  ed = calloc(1, sizeof(E_Dir));
                  ed->id = e->ref;
                  ed->dir = evas_stringshare_add(e->data);
                  if (!ped)
                    {
+                      /* if no previous monitoring dir exists - this one 
+                       * becomes the master monitor enty */
                       printf("MON %s\n", ed->dir);
                       ed->mon = ecore_file_monitor_add(ed->dir, 
_e_cb_file_monitor, ed);
                       ed->mon_ref = 1;
                    }
                  else
-                   ped->mon_ref++;
+                   {
+                      printf("REF ORIG\n");
+                      /* an existing monitor exists - ref it up */
+                      ed->mon_real = ped;
+                      ped->mon_ref++;
+                   }
                  _e_dirs = evas_list_append(_e_dirs, ed);
                  
+                 /* read everything except a .order, . and .. */
                  while ((dp = readdir(dir)))
                    {
                       if ((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, 
"..")))
@@ -256,6 +263,7 @@
                       files = evas_list_append(files, strdup(dp->d_name));
                    }
                  closedir(dir);
+                 /* if there was a .order - we need to parse it */
                  if (dot_order)
                    {
                       snprintf(buf, sizeof(buf), "%s/.order", (char *)e->data);
@@ -266,6 +274,8 @@
                            int len;
                            char *s;
                            
+                           /* inset files in order if the existed in file 
+                            * list before */
                            while (fgets(buf, sizeof(buf), f))
                              {
                                 len = strlen(buf);
@@ -274,6 +284,7 @@
                                 if (s) f2 = evas_list_append(f2, s);
                              }
                            fclose(f);
+                           /* append whats left */
                            while (files)
                              {
                                 f2 = evas_list_append(f2, files->data);
@@ -289,9 +300,12 @@
                  /* FIXME: maybe one day we can sort files here and handle
                   * .order file stuff here - but not today
                   */
+                 /* note that we had a .order at all */
                  ed->dot_order = dot_order;
                  if (dot_order)
                    {
+                      /* if we did - tell the E about this FIRST - it will
+                       * decide what to do if it first sees a .order or not */
                       if (!strcmp(e->data, "/"))
                         snprintf(buf, sizeof(buf), "/.order");
                       else
@@ -301,6 +315,9 @@
                       else
                         _e_file_add(ed->id, buf, 1);
                    }
+                 /* send empty file - indicate empty dir */
+                 if (!files) _e_file_add(ed->id, "", 2);
+                 /* and in an idler - list files, statting them etc. */
                  ed->fq = files;
                  ed->idler = ecore_idler_add(_e_cb_file_mon_list_idler, ed);
                  ed->sync_num = DEF_SYNC_NUM;
@@ -315,39 +332,65 @@
               {
                  E_Dir *ed;
             
+                 /* look for the dire entry to stop monitoring */
                  ed = l->data;
                  if ((e->ref == ed->id) && (!strcmp(ed->dir, e->data)))
                    {
-                      if (ed->mon)
+                      /* if this is not the real monitoring node - unref the
+                       * real one */
+                      if (ed->mon_real)
                         {
-                           if (ed->mon_ref > 1)
+                           printf("UNREF ORIG\n");
+                           /* unref original monitor node */
+                           ed->mon_real->mon_ref--;
+                           if (ed->mon_real->mon_ref == 0)
                              {
-                                for (ll = _e_dirs; ll; ll = ll->next)
+                                printf("FREE ORIG\n");
+                                /* original is at 0 ref - free it */
+                                evas_stringshare_del(ed->mon_real->dir);
+                                if (ed->mon_real->idler)
+                                  ecore_idler_del(ed->mon_real->idler);
+                                while (ed->mon_real->fq)
                                   {
-                                     E_Dir *ped;
-                                     
-                                     ped = ll->data;
-                                     if ((!ped->mon) &&
-                                         (!strcmp(ped->dir, ed->dir)))
-                                       {
-                                          ped->mon = ed->mon;
-                                          ped->mon_ref = ed->mon_ref - 1;
-                                          goto contdel;
-                                       }
+                                     free(ed->mon_real->fq->data);
+                                     ed->mon_real->fq = 
evas_list_remove_list(ed->mon_real->fq, ed->mon_real->fq);
                                   }
+                                free(ed->mon_real);
+                                ed->mon_real = NULL;
+                             }
+                           printf("FREE THIS\n");
+                           /* free this node */
+                           evas_stringshare_del(ed->dir);
+                           if (ed->idler) ecore_idler_del(ed->idler);
+                           while (ed->fq)
+                             {
+                                free(ed->fq->data);
+                                ed->fq = evas_list_remove_list(ed->fq, ed->fq);
                              }
-                           printf("UNMON %s\n", ed->dir);
-                           ecore_file_monitor_del(ed->mon);
+                           free(ed);
                         }
-                      contdel:
-                      evas_stringshare_del(ed->dir);
-                      if (ed->idler) ecore_idler_del(ed->idler);
-                      while (ed->fq)
+                      /* this is a core monitoring node - remove ref */
+                      else
                         {
-                           free(ed->fq->data);
-                           ed->fq = evas_list_remove_list(ed->fq, ed->fq);
+                           printf("UNREF\n");
+                           ed->mon_ref--;
+                           /* we are the last ref - free */
+                           if (ed->mon_ref == 0)
+                             {
+                                printf("UNMON %s\n", ed->dir);
+                                ecore_file_monitor_del(ed->mon);
+                                evas_stringshare_del(ed->dir);
+                                if (ed->idler) ecore_idler_del(ed->idler);
+                                while (ed->fq)
+                                  {
+                                     free(ed->fq->data);
+                                     ed->fq = evas_list_remove_list(ed->fq, 
ed->fq);
+                                  }
+                                free(ed);
+                             }
                         }
-                      free(ed);
+                      printf("REMOVE FROM LIST\n");
+                      /* remove from dirs list anyway */
                       _e_dirs = evas_list_remove_list(_e_dirs, l);
                       break;
                    }
@@ -356,48 +399,84 @@
        break;
       case 3: /* fop delete file/dir */
          {
-            ecore_file_recursive_rm(e->data);
-            /* FIXME: send back file del if src is monitored */
+            E_Fop *fop;
+            
+            fop = calloc(1, sizeof(E_Fop));
+            if (fop)
+              {
+                 fop->id = e->ref;
+                 fop->src = evas_stringshare_add(e->data);
+                 _e_fops = evas_list_append(_e_fops, fop);
+                 fop->idler = ecore_idler_add(_e_cb_fop_rm_idler, fop);
+              }
          }
        break;
       case 4: /* fop trash file/dir */
          {
-            ecore_file_recursive_rm(e->data);
-            /* FIXME: send back file del if src is monitored */
+            E_Fop *fop;
+            
+            fop = calloc(1, sizeof(E_Fop));
+            if (fop)
+              {
+                 fop->id = e->ref;
+                 fop->src = evas_stringshare_add(e->data);
+                 _e_fops = evas_list_append(_e_fops, fop);
+                 fop->idler = ecore_idler_add(_e_cb_fop_trash_idler, fop);
+              }
          }
        break;
       case 5: /* fop rename file/dir */
-       /* FIXME: send back file del + add if dir is monitored */
-       break;
-      case 6: /* fop mv file/dir */
          {
-            char buf[16384];
-             const char *src, *dst;
+            const char *src, *dst;
             
             src = e->data;
             dst = src + strlen(src) + 1;
-            snprintf(buf, sizeof(buf), "mv '%s' '%s'", src, dst); 
-            /* FIXME: this is so bad - implement wiht proper loops and 
syscalls */
-            system(buf);
+            ecore_file_mv(src, dst);
+            /* FIXME: send back if succeeded or failed - why */
+         }
+       break;
+      case 6: /* fop mv file/dir */
+         {
+            E_Fop *fop;
+            
+            fop = calloc(1, sizeof(E_Fop));
+            if (fop)
+              {
+                 const char *src, *dst;
+                 
+                 src = e->data;
+                 dst = src + strlen(src) + 1;
+                 fop->id = e->ref;
+                 fop->src = evas_stringshare_add(src);
+                 fop->dst = evas_stringshare_add(dst);
+                 _e_fops = evas_list_append(_e_fops, fop);
+                 fop->idler = ecore_idler_add(_e_cb_fop_mv_idler, fop);
+              }
          }
        break;
       case 7: /* fop cp file/dir */
          {
-            char buf[16384];
-             const char *src, *dst;
+            E_Fop *fop;
             
-            src = e->data;
-            dst = src + strlen(src) + 1;
-            snprintf(buf, sizeof(buf), "cp -a '%s' '%s'", src, dst); 
-            /* FIXME: this is so bad - implement wiht proper loops and 
syscalls */
-            system(buf);
+            fop = calloc(1, sizeof(E_Fop));
+            if (fop)
+              {
+                 const char *src, *dst;
+                 
+                 src = e->data;
+                 dst = src + strlen(src) + 1;
+                 fop->id = e->ref;
+                 fop->src = evas_stringshare_add(src);
+                 fop->dst = evas_stringshare_add(dst);
+                 _e_fops = evas_list_append(_e_fops, fop);
+                 fop->idler = ecore_idler_add(_e_cb_fop_cp_idler, fop);
+              }
          }
-       /* FIXME: send back file add if succeeded - and dest monitored */
        break;
       case 8: /* fop mkdir */
          {
             ecore_file_mkdir(e->data);
-            /* FIXME: send back file add if succeeded */
+            /* FIXME: send back if succeeded or failed - why */
          }
        break;
       case 9: /* fop mount fs */
@@ -485,7 +564,10 @@
             ed = l->data;
             drp = ecore_file_realpath(ed->dir);
             if (!strcmp(rp, drp))
-              _e_file_add(ed->id, path, 0);
+              {
+                 printf("file add %s\n", path);
+                 _e_file_add(ed->id, path, 0);
+              }
             free(drp);
          }
        free(rp);
@@ -541,13 +623,13 @@
    unsigned char *p, buf
      /* file add/change format is as follows:
       * 
-      8 stat_info[stat size] + broken_link[1] + path[n]\0 + lnk[n]\0 + 
rlnk[n]\0 */
+      * stat_info[stat size] + broken_link[1] + path[n]\0 + lnk[n]\0 + 
rlnk[n]\0 */
      [sizeof(struct stat) + 1 + 4096 + 4096 + 4096];
    
    lnk = ecore_file_readlink(buf);
    if (stat(path, &st) == -1)
      {
-       if (lnk) broken_lnk = 1;
+       if ((path[0] == 0) || (lnk)) broken_lnk = 1;
        else return;
      }
    if ((lnk) && (lnk[0] != '/')) rlnk = ecore_file_realpath(path);
@@ -664,6 +746,318 @@
    ed->sync_time = 0.0;
    ed->idler = NULL;
    return 0;
+}
+
+static int
+_e_cb_fop_rm_idler(void *data)
+{
+   E_Fop *fop;
+   struct Fop_Data {
+      DIR *dir;
+      const char *path;
+   } *fd, *fd2;
+   struct dirent *dp = NULL;
+   char buf[PATH_MAX], *lnk;
+   
+   fop = (E_Fop *)data;
+   if (!fop->data)
+     {
+       snprintf(buf, sizeof(buf), "%s", fop->src);
+       lnk = ecore_file_readlink(buf);
+       if (!lnk)
+         {
+            if (ecore_file_is_dir(buf))
+              {
+                 fd = calloc(1, sizeof(struct Fop_Data));
+                 if (fd)
+                   {
+                      fop->data = evas_list_prepend(fop->data, fd);
+                      fd->path = evas_stringshare_add(fop->src);
+                      fd->dir = opendir(fd->path);
+                   }
+              }
+            else
+              {
+                 ecore_file_unlink(buf); /* FIXME: handle err */
+              }
+         }
+       else
+         {
+            ecore_file_unlink(buf); /* FIXME: handle err */
+            free(lnk);
+         }
+       
+     }
+   fd = evas_list_data(fop->data);
+   if (!fd) goto stop;
+   if (fd->dir) dp = readdir(fd->dir);
+   else
+     {
+       /* FIXME: handle err */
+     }
+   if (dp)
+     {
+       if (!((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, ".."))))
+         {
+            snprintf(buf, sizeof(buf), "%s/%s", fd->path, dp->d_name);
+            lnk = ecore_file_readlink(buf);
+            if (!lnk)
+              {
+                 if (ecore_file_is_dir(buf))
+                   {
+                      fd2 = calloc(1, sizeof(struct Fop_Data));
+                      if (fd2)
+                        {
+                           fop->data = evas_list_prepend(fop->data, fd2);
+                           fd2->path = evas_stringshare_add(buf);
+                           fd2->dir = opendir(fd2->path);
+                        }
+                   }
+                 else
+                   {
+                      ecore_file_unlink(buf); /* FIXME: handle err */
+                   }
+              }
+            else
+              {
+                 ecore_file_unlink(buf); /* FIXME: handle err */
+                 free(lnk);
+              }
+         }
+     }
+   else
+     {
+       if (fd->dir) closedir(fd->dir);
+       rmdir(fd->path); /* FIXME: handle err */
+       evas_stringshare_del(fd->path);
+       free(fd);
+       fop->data = evas_list_remove(fop->data, fd);
+       if (!fop->data) goto stop;
+     }
+   return 1;
+   stop:
+   evas_stringshare_del(fop->src);
+   free(fop);
+   _e_fops = evas_list_remove(_e_fops, fop);
+   return 0;
+   /* FIXME: send back if succeeded or failed - why */
+}
+
+static int
+_e_cb_fop_trash_idler(void *data)
+{
+   /* FIXME: for now trash == rm - later move to trash */
+   return _e_cb_fop_rm_idler(data);
+}
+
+static int
+_e_cb_fop_mv_idler(void *data)
+{
+   E_Fop *fop;
+   struct Fop_Data {
+      DIR *dir;
+      const char *path, *path2;
+   } *fd, *fd2;
+   struct dirent *dp = NULL;
+   char buf[PATH_MAX], buf2[PATH_MAX], *lnk;
+   
+   fop = (E_Fop *)data;
+   if (!fop->data)
+     {
+       if (rename(fop->src, fop->dst) != 0)
+         {
+            if (errno == EXDEV)
+              {
+                 /* copy it */
+                 fop->idler = ecore_idler_add(_e_cb_fop_cp_idler, fop);
+                 return 0;
+              }
+            else
+              {
+                 /* FIXME: handle error */
+              }
+         }
+     }
+   evas_stringshare_del(fop->src);
+   evas_stringshare_del(fop->dst);
+   free(fop);
+   _e_fops = evas_list_remove(_e_fops, fop);
+   return 0;
+   /* FIXME: send back if succeeded or failed - why */
+}
+
+static int
+_e_cb_fop_cp_idler(void *data)
+{
+   E_Fop *fop;
+   struct Fop_Data {
+      DIR *dir;
+      const char *path, *path2;
+   } *fd, *fd2;
+   struct stat st;
+   struct utimbuf ut;
+   struct dirent *dp = NULL;
+   char buf[PATH_MAX], buf2[PATH_MAX], *lnk;
+   
+   fop = (E_Fop *)data;
+   if (!fop->data)
+     {
+       fd = calloc(1, sizeof(struct Fop_Data));
+       if (fd)
+         {
+            fop->data = evas_list_append(fop->data, fd);
+            fd->path = evas_stringshare_add(fop->src);
+            fd->path2 = evas_stringshare_add(fop->dst);
+            fd->dir = opendir(fd->path);
+            snprintf(buf, sizeof(buf), "%s", fd->path);
+            snprintf(buf2, sizeof(buf2), "%s", fd->path2);
+            if (!lnk)
+              {
+                 if (ecore_file_is_dir(buf))
+                   {
+                      if (stat(buf, &st) == 0)
+                        {
+                           /* mkdir at the other end - retain stat info */
+                           ecore_file_mkdir(buf2);
+                           chmod(buf2, st.st_mode);
+                           chown(buf2, st.st_uid, st.st_gid);
+                           ut.actime = st.st_atime;
+                           ut.modtime = st.st_mtime;
+                           utime(buf2, &ut);
+                        }
+                   }
+                 else
+                   {
+                      if (stat(buf, &st) == 0)
+                        {
+                           if (S_ISFIFO(st.st_mode))
+                             {
+                                /* create fifo at other end */
+                                mkfifo(buf2, st.st_mode);
+                             }
+                           else if (S_ISREG(st.st_mode))
+                             {
+                                /* copy file data - retain file mode and stat 
data */
+                                ecore_file_cp(buf, buf2); /* FIXME: this 
should be split up into the fop idler to do in idle time maybe 1 block or page 
at a time */
+                             }
+                           chmod(buf2, st.st_mode);
+                           chown(buf2, st.st_uid, st.st_gid);
+                           ut.actime = st.st_atime;
+                           ut.modtime = st.st_mtime;
+                           utime(buf2, &ut);
+                        }
+                   }
+              }
+            else
+              {
+                 if (stat(buf, &st) == 0)
+                   {
+                      /* duplicate link - retain stat data */
+                      symlink(lnk, buf2);
+                      chmod(buf2, st.st_mode);
+                      chown(buf2, st.st_uid, st.st_gid);
+                      ut.actime = st.st_atime;
+                      ut.modtime = st.st_mtime;
+                      utime(buf2, &ut);
+                   }
+                 free(lnk);
+              }
+         }
+     }
+   fd = evas_list_data(evas_list_last(fop->data));
+   if (!fd) goto stop;
+   if (fd->dir) dp = readdir(fd->dir);
+   else
+     {
+       /* FIXME: handle err */
+     }
+   if (dp)
+     {
+       if (!((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, ".."))))
+         {
+            snprintf(buf, sizeof(buf), "%s/%s", fd->path, dp->d_name);
+            snprintf(buf2, sizeof(buf2), "%s/%s", fd->path2, dp->d_name);
+            lnk = ecore_file_readlink(buf);
+            if (!lnk)
+              {
+                 if (ecore_file_is_dir(buf))
+                   {
+                      /* mkdir at the other end - retain stat info */
+                      if (stat(buf, &st) == 0)
+                        {
+                           /* mkdir at the other end - retain stat info */
+                           ecore_file_mkdir(buf2);
+                           chmod(buf2, st.st_mode);
+                           chown(buf2, st.st_uid, st.st_gid);
+                           ut.actime = st.st_atime;
+                           ut.modtime = st.st_mtime;
+                           utime(buf2, &ut);
+                        }
+                      fd2 = calloc(1, sizeof(struct Fop_Data));
+                      if (fd2)
+                        {
+                           fop->data = evas_list_append(fop->data, fd2);
+                           fd2->path = evas_stringshare_add(buf);
+                           fd2->path2 = evas_stringshare_add(buf2);
+                           fd2->dir = opendir(fd2->path);
+                        }
+                   }
+                 else
+                   {
+                      if (stat(buf, &st) == 0)
+                        {
+                           if (S_ISFIFO(st.st_mode))
+                             {
+                                /* create fifo at other end */
+                                mkfifo(buf2, st.st_mode);
+                             }
+                           else if (S_ISREG(st.st_mode))
+                             {
+                                /* copy file data - retain file mode and stat 
data */
+                                ecore_file_cp(buf, buf2); /* FIXME: this 
should be split up into the fop idler to do in idle time maybe 1 block or page 
at a time */
+                             }
+                           chmod(buf2, st.st_mode);
+                           chown(buf2, st.st_uid, st.st_gid);
+                           ut.actime = st.st_atime;
+                           ut.modtime = st.st_mtime;
+                           utime(buf2, &ut);
+                        }
+                   }
+              }
+            else
+              {
+                 if (stat(buf, &st) == 0)
+                   {
+                      /* duplicate link - retain stat data */
+                      symlink(lnk, buf2);
+                      chmod(buf2, st.st_mode);
+                      chown(buf2, st.st_uid, st.st_gid);
+                      ut.actime = st.st_atime;
+                      ut.modtime = st.st_mtime;
+                      utime(buf2, &ut);
+                   }
+                 free(lnk);
+              }
+         }
+     }
+   else
+     {
+       if (fd->dir) closedir(fd->dir);
+       evas_stringshare_del(fd->path);
+       evas_stringshare_del(fd->path2);
+       free(fd);
+       fop->data = evas_list_remove(fop->data, fd);
+       if (!fop->data) goto stop;
+     }
+   return 1;
+   
+   stop:
+   evas_stringshare_del(fop->src);
+   evas_stringshare_del(fop->dst);
+   free(fop);
+   _e_fops = evas_list_remove(_e_fops, fop);
+   return 0;
+   /* FIXME: send back if succeeded or failed - why */
 }
 
 static char *



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to