Masanobu Yasui authored on 2009/05/19 12:51:48
Showing 4 changed files
... ...
@@ -1227,3 +1227,14 @@ excludeitem *exclude_del(excludeitem *e)
1227 1227
   return(r);
1228 1228
 }
1229 1229
 
1230
+int pathcmp(char *p1, char *p2)
1231
+{
1232
+  char path1[PATH_MAX];
1233
+  char path2[PATH_MAX];
1234
+
1235
+
1236
+  return(0);
1237
+}
1238
+
1239
+
1240
+
... ...
@@ -199,6 +199,8 @@ typedef struct mfile
199 199
   char fn[PATH_MAX];
200 200
   char tn[PATH_MAX];
201 201
   char ln[PATH_MAX];
202
+  uint16_t len;
203
+  uint32_t mod;
202 204
   uint32_t sendto;
203 205
   uint32_t dryrun;
204 206
   uint32_t recurs;
... ...
@@ -969,10 +969,11 @@ static void dsync_write(int fd, char *base, uint8_t sta, uint16_t len, uint32_t
969 969
     base++;
970 970
     len--;
971 971
   }
972
-  *(uint16_t *)p = len + sizeof(uint32_t); 
973
-  p += sizeof(uint16_t);
974
-  *(uint32_t *)p = htonl(mod); 
975
-  p += sizeof(uint32_t);
972
+
973
+  *(uint16_t *)p = len + sizeof(mod); 
974
+  p += sizeof(len);
975
+  *(uint32_t *)p = mod; 
976
+  p += sizeof(mod);
976 977
   memcpy(p, base, len);
977 978
 
978 979
   p = buff;
... ...
@@ -989,6 +990,10 @@ static void dsync_write(int fd, char *base, uint8_t sta, uint16_t len, uint32_t
989 989
     if(FD_ISSET(fd,&wfds)){
990 990
       r = write(fd, p, s);
991 991
       if(r == -1){
992
+        if(errno == EINTR){
993
+          continue;
994
+        }
995
+        lprintf(0, "[error] %s: write error\n", __func__);
992 996
         return;
993 997
       }else{
994 998
         s -= r;
... ...
@@ -1201,7 +1206,7 @@ static void mrecv_req_del_open(mdata *data, struct sockaddr_in *addr)
1201 1201
   char path[PATH_MAX];
1202 1202
 
1203 1203
   if(!a){
1204
-    lprintf(0, "%s: arror ack can't create\n", __func__);
1204
+    lprintf(0, "[error] %s: ack can't create\n", __func__);
1205 1205
     return;
1206 1206
   }
1207 1207
   data->p = data->data;
... ...
@@ -891,85 +891,106 @@ static void msend_req_del_mark(int s, mfile *m)
891 891
   }
892 892
 }
893 893
 
894
-static void msend_req_del_stat(int s, mfile *m)
894
+static void msend_req_del_stat_read(int s, mfile *m)
895 895
 {
896
-  int    r;
897 896
   mfile *a;
898 897
   mfile *d;
899
-  static uint16_t len = 0;
900
-  static char path[PATH_MAX + sizeof(uint32_t)];
901
-
902
-  if(m->pid == 0){
903
-    for(d=mftop[0];d;d=d->next){
904
-      if((d->mdata.head.opcode == MAKUO_OP_DEL) && (d->link == m)){
905
-        m->sendwait = 1;
906
-        return;
907
-      }
908
-    }
909
-    m->mdata.head.nstate = MAKUO_SENDSTATE_MARK;
910
-    m->initstate = 1;
911
-    m->sendwait  = 0;
912
-    ack_clear(m, -1);
913
-    return;
914
-  }
915
-
916
-  if(m->pipe == -1){
917
-    if(waitpid(m->pid, NULL, WNOHANG) == m->pid){
918
-      m->pid = 0;
919
-    }else{
920
-      m->sendwait = 1;
921
-    }
922
-    return;
923
-  }
898
+  uint16_t len;
924 899
 
925 900
   d = mkreq(&(m->mdata), &(m->addr), MAKUO_SENDSTATE_OPEN);
926 901
   d->mdata.head.flags = m->mdata.head.flags;
927 902
   d->mdata.head.reqid = getrid();
928 903
   d->initstate = 1;
929 904
   d->sendwait  = 0;
930
-  d->sendto = 1;
931
-  d->dryrun = m->dryrun;
932
-  d->recurs = m->recurs;
933
-  d->link   = m;
934
-  d->mdata.p = d->mdata.data;
905
+  d->sendto    = 1;
906
+  d->dryrun    = m->dryrun;
907
+  d->recurs    = m->recurs;
908
+  d->link      = m;
909
+  d->mdata.p   = d->mdata.data;
935 910
 
936
-  if(len){
937
-    data_safeset16(&(d->mdata), len);
938
-    data_safeset(&(d->mdata), path, len);
911
+  if(m->len){
912
+    len = m->len - sizeof(m->mod);
913
+    data_safeset16(&(d->mdata), m->len);
914
+    data_safeset32(&(d->mdata), m->mod);
915
+    data_safeset(&(d->mdata), m->tn, len);
916
+    m->len = 0;
939 917
   }
940 918
 
941 919
   while(1){
942
-    if(atomic_read(m->pipe, &len, sizeof(len))){
943
-      close(m->pipe);
944
-      m->pipe = -1;
945
-      m->initstate = 1;
946
-      m->sendwait  = 0;
920
+    if(atomic_read(m->pipe, &(m->len), sizeof(m->len))){
947 921
       break;
948 922
     }
949
-    if(atomic_read(m->pipe, path, len)){
950
-      lprintf(0, "%s: pipe read error\n", __func__);
951
-      close(m->pipe);
952
-      m->pipe = -1;
953
-      m->initstate = 1;
954
-      m->sendwait  = 0;
923
+    if(m->len <= sizeof(m->mod)){
924
+      lprintf(0, "[error] %s: length error\n", __func__);
955 925
       break;
956 926
     }
957
-    path[len] = 0;
958
-
927
+    len = m->len - sizeof(m->mod);
928
+    if(atomic_read(m->pipe, &(m->mod), sizeof(m->mod))){
929
+      lprintf(0, "[error] %s: read error\n", __func__);
930
+      break;
931
+    }
932
+    if(atomic_read(m->pipe, m->tn, len)){
933
+      lprintf(0, "[error] %s: read error\n", __func__);
934
+      break;
935
+    }
936
+    m->tn[len] = 0;
937
+    if(lstat(m->tn, &(m->fs)) == -1){
938
+      if(errno == ENOENT){
939
+        m->len = 0;
940
+        continue;
941
+      }
942
+    }
959 943
     for(a=mftop[1];a;a=a->next){
960
-      if(!strcmp(a->tn, path + sizeof(uint32_t))){
961
-        break;
944
+      if(a->mdata.head.opcode == MAKUO_OP_SEND){
945
+        if(!strcmp(a->tn, m->tn)){
946
+          break;
947
+        }
962 948
       }
963 949
     }
964 950
     if(a){
951
+      m->len = 0;
965 952
       continue;
966 953
     }
967
-    if(d->mdata.head.szdata + sizeof(len) + len > MAKUO_BUFFER_SIZE){
968
-      break;
954
+    if(d->mdata.head.szdata + sizeof(m->len) + m->len > MAKUO_BUFFER_SIZE){
955
+      return;
969 956
     }
970
-    data_safeset16(&(d->mdata), len);
971
-    data_safeset(&(d->mdata), path, len);
957
+    data_safeset16(&(d->mdata),   m->len);
958
+    data_safeset32(&(d->mdata),   m->mod);
959
+    data_safeset(&(d->mdata), m->tn, len);
960
+    m->len = 0;
961
+  }
962
+
963
+  close(m->pipe);
964
+  m->pipe      = -1;
965
+  m->initstate =  1;
966
+  m->sendwait  =  0;
967
+}
968
+
969
+static void msend_req_del_stat(int s, mfile *m)
970
+{
971
+  mfile *a;
972
+  if(m->pid == 0){
973
+    for(a=mftop[0];a;a=a->next){
974
+      if((a->mdata.head.opcode == MAKUO_OP_DEL) && (a->link == m)){
975
+        m->sendwait = 1;
976
+        return;
977
+      }
978
+    }
979
+    m->mdata.head.nstate = MAKUO_SENDSTATE_MARK;
980
+    m->initstate = 1;
981
+    m->sendwait  = 0;
982
+    ack_clear(m, -1);
983
+    return;
984
+  }
985
+  if(m->pipe == -1){
986
+    if(waitpid(m->pid, NULL, WNOHANG) == m->pid){
987
+      m->pid = 0;
988
+    }else{
989
+      m->sendwait = 1;
990
+    }
991
+    return;
972 992
   }
993
+  msend_req_del_stat_read(s, m);
973 994
 }
974 995
 
975 996
 static void msend_req_del_last(int s, mfile *m)