Browse code

--delete

Masanobu Yasui authored on 2008/12/07 06:37:09
Showing 5 changed files
... ...
@@ -27,14 +27,14 @@ uint8_t opcodenumlist[]={MAKUO_OP_PING,
27 27
                          MAKUO_OP_DEL,
28 28
                          MAKUO_OPCODE_MAX};
29 29
 
30
-char *sstatestrlist[]={"SEND_STAT",
31
-                       "SEND_OPEN",
32
-                       "SEND_DATA",
33
-                       "SEND_MARK",
34
-                       "SEND_CLOSE",
35
-                       "SEND_LAST",
36
-                       "SEND_ERROR",
37
-                       "SEND_BREAK",
30
+char *sstatestrlist[]={"SEND_STAT   ",
31
+                       "SEND_OPEN   ",
32
+                       "SEND_DATA   ",
33
+                       "SEND_MARK   ",
34
+                       "SEND_CLOSE  ",
35
+                       "SEND_LAST   ",
36
+                       "SEND_ERROR  ",
37
+                       "SEND_BREAK  ",
38 38
                        "SEND_UNKNOWN"};
39 39
 
40 40
 uint8_t sstatenumlist[]={MAKUO_SENDSTATE_STAT,
... ...
@@ -47,21 +47,21 @@ uint8_t sstatenumlist[]={MAKUO_SENDSTATE_STAT,
47 47
                          MAKUO_SENDSTATE_BREAK,
48 48
                          MAKUO_STATE_MAX};
49 49
 
50
-char *rstatestrlist[] = {"RECV_NONE",
51
-                         "RECV_UPDATE",
52
-                         "RECV_SKIP",
53
-                         "RECV_OPEN",
54
-                         "RECV_MARK",
55
-                         "RECV_CLOSE",
56
-                         "RECV_IGNORE",
50
+char *rstatestrlist[] = {"RECV_NONE    ",
51
+                         "RECV_UPDATE  ",
52
+                         "RECV_SKIP    ",
53
+                         "RECV_OPEN    ",
54
+                         "RECV_MARK    ",
55
+                         "RECV_CLOSE   ",
56
+                         "RECV_IGNORE  ",
57 57
                          "RECV_READONLY",
58
-                         "RECV_BREAK",
59
-                         "RECV_MD5OK",
60
-                         "RECV_MD5NG",
58
+                         "RECV_BREAK   ",
59
+                         "RECV_MD5OK   ",
60
+                         "RECV_MD5NG   ",
61 61
                          "RECV_DELETEOK",
62 62
                          "RECV_DELETENG",
63
-                         "RECV_OPENERR",
64
-                         "RECV_READERR", 
63
+                         "RECV_OPENERR ",
64
+                         "RECV_READERR ", 
65 65
                          "RECV_WRITEERR", 
66 66
                          "RECV_CLOSEERR", 
67 67
                          "RECV_UNKNOWN"};
... ...
@@ -55,7 +55,7 @@
55 55
 #define MAKUO_MCAST_PORT  5000
56 56
 
57 57
 /*----- timeout -----*/
58
-#define MAKUO_SEND_TIMEOUT  5000    /* 再送間隔(ms)                                 */
58
+#define MAKUO_SEND_TIMEOUT  500    /* 再送間隔(ms)                                 */
59 59
 #define MAKUO_SEND_RETRYCNT 120    /* 再送回数                                     */
60 60
 #define MAKUO_PONG_TIMEOUT  180000 /* メンバから除外するまでの時間(ms)             */
61 61
 #define MAKUO_PONG_INTERVAL 45000  /* PING送信間隔(ms)                             */
... ...
@@ -40,7 +40,9 @@ int mexec_scan_cmd(int fd, char *buff)
40 40
     if(FD_ISSET(fd,&fds)){
41 41
       r = write(fd, cmd, size);
42 42
       if(r == -1){
43
-        lprintf(0, "%s: commend write error! %s", __func__, buff);
43
+        lprintf(0, "%s: commend write error! %s", 
44
+          __func__, 
45
+          buff);
44 46
         return(-1);
45 47
       }
46 48
       size -= r;
... ...
@@ -316,9 +318,13 @@ int mexec_send(mcomm *c, int n)
316 316
 
317 317
 	if(lstat(fn, &m->fs) == -1){
318 318
 	  cprintf(0, c, "error: file not found %s\n", fn);
319
-		lprintf(1, "%s: lstat() error argc=%d cmd=%s\n", __func__, c->argc[n], c->cmdline[n]);
320
-    for(i=0;i<c->argc[n];i++)
319
+		lprintf(1, "%s: lstat() error argc=%d cmd=%s\n",
320
+      __func__, 
321
+      c->argc[n], 
322
+      c->cmdline[n]);
323
+    for(i=0;i<c->argc[n];i++){
321 324
 		  lprintf(1, "%s: read error argv[%d]=%s\n", __func__, i, c->parse[n][i]);
325
+    }
322 326
 		lprintf(0, "%s: read error file=%s\n", __func__, fn);
323 327
 		mfdel(m);
324 328
     return(0);
... ...
@@ -698,34 +704,42 @@ int mexec_status(mcomm *c, int n)
698 698
   mfile  *m;
699 699
   struct tm *t;
700 700
 
701
-  cprintf(0,c,"version  : %s\n", PACKAGE_VERSION);
701
+  cprintf(0,c,"version: %s\n", PACKAGE_VERSION);
702 702
   if(moption.chroot){
703
-    cprintf(0, c, "chroot   : %s/\n", moption.real_dir);
703
+    cprintf(0, c, "chroot : %s/\n", moption.real_dir);
704 704
   }else{
705
-    cprintf(0, c, "basedir  : %s/\n", moption.base_dir);
705
+    cprintf(0, c, "basedir: %s/\n", moption.base_dir);
706 706
   }
707 707
   count = 0;
708 708
   for(m=mftop[0];m;m=m->next){
709 709
     count++;
710 710
   }
711
-  cprintf(0,c,"send file: %d\n", count);
711
+  cprintf(0,c,"send op: %d\n", count);
712 712
   for(m=mftop[0];m;m=m->next){
713 713
     uint32_t snow = m->seqnonow;
714 714
     uint32_t smax = m->seqnomax;
715 715
     if(snow > smax){
716 716
       snow = smax;
717 717
     }
718
-    cprintf(0, c, "  %s %s %s (%u:%u/%u)\n", 
719
-      OPCODE(m->mdata.head.opcode), 
720
-      SSTATE(m->mdata.head.nstate), 
721
-      m->fn, 
722
-      m->markcount, snow, smax); 
718
+    if(m->mdata.head.flags & MAKUO_FLAG_ACK){
719
+      cprintf(0, c, "  (ack) %s %s %s (%u:%u/%u)\n", 
720
+        OPCODE(m->mdata.head.opcode), 
721
+        RSTATE(m->mdata.head.nstate), 
722
+        m->fn, 
723
+        m->markcount, snow, smax); 
724
+    }else{
725
+      cprintf(0, c, "  (req) %s %s %s (%u:%u/%u)\n", 
726
+        OPCODE(m->mdata.head.opcode), 
727
+        SSTATE(m->mdata.head.nstate), 
728
+        m->fn, 
729
+        m->markcount, snow, smax); 
730
+    }
723 731
   }
724 732
 
725 733
   count = 0;
726 734
   for(m=mftop[1];m;m=m->next)
727 735
     count++;
728
-  cprintf(0, c, "recv file: %d\n", count);
736
+  cprintf(0, c, "recv op: %d\n", count);
729 737
   for(m=mftop[1];m;m=m->next){
730 738
     t = localtime(&(m->lastrecv.tv_sec));
731 739
     cprintf(0, c, "  %s %s %02d:%02d:%02d %s (%d/%d) mark=%d\n",
... ...
@@ -294,7 +294,7 @@ static void mrecv_ack_dsync(mdata *data, struct sockaddr_in *addr)
294 294
   mhost   *t;
295 295
   mfile   *m;
296 296
 
297
-  lprintf(0, "%s:\n", __func__);
297
+  lprintf(9, "%s: rid=%d %s\n", __func__, data->head.reqid, RSTATE(data->head.nstate));
298 298
   mrecv_ack_search(&t, &m, data, addr);
299 299
   if(data->head.nstate == MAKUO_RECVSTATE_CLOSE){
300 300
     mkreq(data, addr, MAKUO_SENDSTATE_LAST);
... ...
@@ -319,7 +319,7 @@ static void mrecv_ack_del(mdata *data, struct sockaddr_in *addr)
319 319
   uint32_t err;
320 320
   uint16_t len;
321 321
 
322
-  lprintf(0, "%s: %s\n", __func__, RSTATE(data->head.nstate));
322
+  lprintf(9, "%s: rid=%d %s\n", __func__, data->head.reqid, RSTATE(data->head.nstate));
323 323
   mrecv_ack_search(&t, &m, data, addr);
324 324
   if(!t || !m){
325 325
     return;
... ...
@@ -333,10 +333,7 @@ static void mrecv_ack_del(mdata *data, struct sockaddr_in *addr)
333 333
   *s = data->head.nstate;
334 334
 
335 335
   if(m->mdata.head.nstate == MAKUO_SENDSTATE_CLOSE){
336
-    m->initstate = 1;
337
-    m->sendwait  = 0;
338
-    m->mdata.head.nstate = MAKUO_SENDSTATE_STAT;
339
-    *s = data->head.nstate;
336
+    mrecv_mfdel(m);
340 337
     return;
341 338
   }
342 339
 
... ...
@@ -347,9 +344,10 @@ static void mrecv_ack_del(mdata *data, struct sockaddr_in *addr)
347 347
     return;
348 348
   }
349 349
 
350
-  if(m->mdata.head.nstate == MAKUO_SENDSTATE_STAT){
350
+  if(m->mdata.head.nstate == MAKUO_SENDSTATE_OPEN){
351 351
     m->initstate = 1;
352 352
     m->sendwait  = 0;
353
+    m->mdata.head.nstate = MAKUO_SENDSTATE_CLOSE;
353 354
     if(data->head.nstate == MAKUO_RECVSTATE_DELETEOK){
354 355
       err = 0;
355 356
       len = strlen(m->fn);
... ...
@@ -1021,9 +1019,13 @@ static void mrecv_req_md5(mdata *data, struct sockaddr_in *addr)
1021 1021
   }
1022 1022
 }
1023 1023
 
1024
-static void dsync_write(int fd, char *base, uint8_t state)
1024
+static void dsync_write(int fd, char *base, uint8_t sta, uint16_t len, uint32_t mod)
1025 1025
 {
1026
-  uint16_t len = strlen(base);
1026
+  int r;
1027
+  size_t s;
1028
+  fd_set wfds;
1029
+  char buff[PATH_MAX + sizeof(sta) +  sizeof(mod) +  sizeof(len)];
1030
+  char *p = buff;
1027 1031
 
1028 1032
   if(!loop_flag){
1029 1033
     return;
... ...
@@ -1035,14 +1037,45 @@ static void dsync_write(int fd, char *base, uint8_t state)
1035 1035
     base += 2;
1036 1036
     len  -= 2;
1037 1037
   }
1038
-  write(fd, &state, sizeof(state));
1039
-  write(fd, &len, sizeof(len));
1040
-  write(fd, base, len);
1038
+  while(*base == '/'){
1039
+    base++;
1040
+    len--;
1041
+  }
1042
+  *(uint8_t  *)p = sta; 
1043
+  p += sizeof(sta);
1044
+  *(uint32_t *)p = mod; 
1045
+  p += sizeof(mod);
1046
+  *(uint16_t *)p = len; 
1047
+  p += sizeof(len);
1048
+  memcpy(p, base, len);
1049
+
1050
+  p = buff;
1051
+  s = sizeof(sta) + sizeof(mod) + sizeof(len) + len;
1052
+  while(s){
1053
+    FD_ZERO(&wfds);
1054
+    FD_SET(fd,&wfds);
1055
+    if(select(1024, NULL, &wfds, NULL, NULL) < 0){
1056
+      if(!loop_flag){
1057
+        return;
1058
+      }
1059
+      continue;
1060
+    }
1061
+    if(FD_ISSET(fd,&wfds)){
1062
+      r = write(fd, p, s);
1063
+      if(r == -1){
1064
+        return;
1065
+      }else{
1066
+        s -= r;
1067
+        p += r;
1068
+      }
1069
+    }
1070
+  }
1041 1071
 }
1042 1072
 
1043 1073
 static void dsync_scan(int fd, char *base, int recurs)
1044 1074
 {
1045 1075
   DIR *d;
1076
+  uint16_t len;
1046 1077
   struct stat st;
1047 1078
   struct dirent *dent;
1048 1079
   char path[PATH_MAX];
... ...
@@ -1050,21 +1083,22 @@ static void dsync_scan(int fd, char *base, int recurs)
1050 1050
   if(!loop_flag){
1051 1051
     return;
1052 1052
   }
1053
-  if(lstat(base,&st) == -1){
1054
-    dsync_write(fd, base, MAKUO_SENDSTATE_ERROR);
1053
+  len = strlen(base);
1054
+  if(lstat(base, &st) == -1){
1055
+    dsync_write(fd, base, MAKUO_SENDSTATE_ERROR, len, st.st_mode);
1055 1056
     return;
1056 1057
   }
1057 1058
   if(S_ISLNK(st.st_mode)){
1058
-    dsync_write(fd, base, MAKUO_SENDSTATE_STAT);
1059
+    dsync_write(fd, base, MAKUO_SENDSTATE_STAT, len, st.st_mode);
1059 1060
     return;
1060 1061
   }
1061 1062
   if(!S_ISDIR(st.st_mode)){
1062
-    dsync_write(fd, base, MAKUO_SENDSTATE_STAT);
1063
+    dsync_write(fd, base, MAKUO_SENDSTATE_STAT, len, st.st_mode);
1063 1064
     return;
1064 1065
   }
1065 1066
   d = opendir(base);
1066 1067
   if(!d){
1067
-    dsync_write(fd, base, MAKUO_SENDSTATE_ERROR);
1068
+    dsync_write(fd, base, MAKUO_SENDSTATE_ERROR, len, st.st_mode);
1068 1069
   }else{
1069 1070
     while(dent=readdir(d)){
1070 1071
       if(!loop_flag)
... ...
@@ -1077,11 +1111,13 @@ static void dsync_scan(int fd, char *base, int recurs)
1077 1077
       if(recurs){
1078 1078
         dsync_scan(fd, path, recurs);
1079 1079
       }else{
1080
-        dsync_write(fd, path, MAKUO_SENDSTATE_STAT);
1080
+        len = strlen(path);
1081
+        dsync_write(fd, path, MAKUO_SENDSTATE_STAT, len, st.st_mode);
1081 1082
       }
1082 1083
     }
1083 1084
     closedir(d);
1084
-    dsync_write(fd, base, MAKUO_SENDSTATE_STAT);
1085
+    len = strlen(base);
1086
+    dsync_write(fd, base, MAKUO_SENDSTATE_STAT, len, st.st_mode);
1085 1087
   }
1086 1088
 }
1087 1089
 
... ...
@@ -1198,23 +1234,68 @@ static void mrecv_req_dsync(mdata *data, struct sockaddr_in *addr)
1198 1198
 /*
1199 1199
  *  del
1200 1200
  */
1201
-static void mrecv_req_del_stat(mdata *data, struct sockaddr_in *addr)
1201
+static void mrecv_req_del_open(mdata *data, struct sockaddr_in *addr)
1202 1202
 {
1203 1203
   uint16_t len;
1204
+  uint32_t mod;
1205
+  char path[PATH_MAX];
1204 1206
   char *hn = "unknown host";
1205 1207
   mhost *t = member_get(addr);
1206 1208
   mfile *a = mkack(data, addr, MAKUO_RECVSTATE_DELETENG);
1209
+  mfile *m = NULL;
1210
+  mcomm *c = NULL;
1211
+  char  *p = NULL;
1207 1212
 
1208 1213
   lprintf(9, "%s:\n", __func__);
1214
+  if(!a){
1215
+    lprintf(0, "%s: arror ack can't create\n", __func__);
1216
+    return;
1217
+  }
1218
+  for(m=mftop[0];m;m=m->next){
1219
+    if((m->comm != NULL) && (m->mdata.head.reqid == data->head.seqno)){
1220
+      c = m->comm;
1221
+      break;
1222
+    }
1223
+  }
1224
+  if(!m){
1225
+    return;
1226
+  }
1209 1227
   if(t){
1210 1228
     hn = t->hostname;
1211 1229
   }
1212 1230
   data->p = data->data;
1231
+  mod = ntohl(*(uint32_t *)(data->p));
1232
+  data->p += sizeof(uint32_t);
1213 1233
   len = ntohs(*(uint16_t *)(data->p));
1214 1234
   data->p += sizeof(uint16_t);
1215 1235
   memcpy(a->fn, data->p, len);
1216 1236
   a->fn[len] = 0;
1217 1237
   lprintf(9, "%s: fn=%s\n", __func__, a->fn);
1238
+  
1239
+  strcpy(path, a->fn);
1240
+  if(mfnmatch(path, c->exclude)){
1241
+    return;
1242
+  }
1243
+  if(S_ISDIR(mod)){
1244
+    strcat(path, "/");
1245
+    if(mfnmatch(path, c->exclude)){
1246
+      return;
1247
+    }
1248
+  }
1249
+  for(p=dirname(path);*p == '/';p++);
1250
+  if(*p == 0){
1251
+    return;
1252
+  }
1253
+  while(strcmp(p, ".")){
1254
+    if(mfnmatch(p, c->exclude)){
1255
+      return;
1256
+    }
1257
+    strcat(p, "/");
1258
+    if(mfnmatch(p, c->exclude)){
1259
+      return;
1260
+    }
1261
+    p = dirname(p);
1262
+  }
1218 1263
   if(lstat(a->fn, &(a->fs)) == -1 && errno == ENOENT){
1219 1264
     a->mdata.head.nstate = MAKUO_RECVSTATE_DELETEOK;
1220 1265
     lprintf(1, "%s: delete %s:%s\n", __func__, hn, a->fn);
... ...
@@ -1286,10 +1367,9 @@ static void mrecv_req_del_close(mdata *data, struct sockaddr_in *addr)
1286 1286
 
1287 1287
 static void mrecv_req_del(mdata *data, struct sockaddr_in *addr)
1288 1288
 {
1289
-  lprintf(9, "%s:\n", __func__);
1290 1289
   switch(data->head.nstate){
1291
-    case MAKUO_SENDSTATE_STAT:  /* 存在確認 */
1292
-      mrecv_req_del_stat(data, addr);
1290
+    case MAKUO_SENDSTATE_OPEN:  /* 存在確認 */
1291
+      mrecv_req_del_open(data, addr);
1293 1292
       break;
1294 1293
     case MAKUO_SENDSTATE_DATA:  /* 結果通知 */
1295 1294
       mrecv_req_del_data(data, addr);
... ...
@@ -1304,22 +1384,22 @@ static void mrecv_req(mdata *data, struct sockaddr_in *addr)
1304 1304
 {
1305 1305
   switch(data->head.opcode){
1306 1306
     case MAKUO_OP_PING:
1307
-      mrecv_req_ping(data, addr);
1307
+      mrecv_req_ping(data,  addr);
1308 1308
       break;
1309 1309
     case MAKUO_OP_EXIT:
1310
-      mrecv_req_exit(data, addr);
1310
+      mrecv_req_exit(data,  addr);
1311 1311
       break;
1312 1312
     case MAKUO_OP_SEND:
1313
-      mrecv_req_send(data, addr);
1313
+      mrecv_req_send(data,  addr);
1314 1314
       break;
1315 1315
     case MAKUO_OP_MD5:
1316
-      mrecv_req_md5(data, addr);
1316
+      mrecv_req_md5(data,   addr);
1317 1317
       break;
1318 1318
     case MAKUO_OP_DSYNC:
1319 1319
       mrecv_req_dsync(data, addr);
1320 1320
       break;
1321 1321
     case MAKUO_OP_DEL:
1322
-      mrecv_req_del(data, addr);
1322
+      mrecv_req_del(data,   addr);
1323 1323
       break;
1324 1324
     default:
1325 1325
       mkack(data, addr, MAKUO_RECVSTATE_IGNORE);
... ...
@@ -104,8 +104,18 @@ static void msend_retry(mfile *m)
104 104
     m->retrycnt = MAKUO_SEND_RETRYCNT;
105 105
     return;
106 106
   }
107
-  lprintf(2, "%s: send retry count=%02d rid=%06d state=%s %s\n", __func__,
108
-    m->retrycnt, m->mdata.head.reqid, SSTATE(m->mdata.head.nstate), m->fn);
107
+  if(m->mdata.head.opcode == MAKUO_OP_DSYNC){
108
+    if(m->mdata.head.nstate == MAKUO_SENDSTATE_CLOSE){
109
+      return;
110
+    }
111
+  }
112
+  lprintf(2, "%s: send retry count=%02d rid=%06d op=%s state=%s %s\n", 
113
+    __func__,
114
+    m->retrycnt, 
115
+    m->mdata.head.reqid, 
116
+    OPCODE(m->mdata.head.opcode), 
117
+    SSTATE(m->mdata.head.nstate), 
118
+    m->fn);
109 119
   for(t=members;t;t=t->next){
110 120
     r = get_hoststate(t, m);
111 121
     if(!r){
... ...
@@ -115,19 +125,22 @@ static void msend_retry(mfile *m)
115 115
     switch(moption.loglevel){
116 116
       case 3:
117 117
         if(*r == MAKUO_RECVSTATE_NONE){
118
-          lprintf(0, "%s:   %s %s(%s)\n", __func__, RSTATE(*r), inet_ntoa(t->ad), t->hostname);
118
+          lprintf(0, "%s:   %s %s(%s)\n", 
119
+            __func__, 
120
+           RSTATE(*r), 
121
+           inet_ntoa(t->ad), 
122
+           t->hostname);
119 123
         }
120 124
         break;
121 125
       default:
122
-        lprintf(4, "%s:   %s %s(%s)\n", __func__, RSTATE(*r), inet_ntoa(t->ad), t->hostname);
126
+        lprintf(4, "%s:   %s %s(%s)\n", 
127
+          __func__, 
128
+          RSTATE(*r), 
129
+          inet_ntoa(t->ad), 
130
+          t->hostname);
123 131
         break;
124 132
     }
125 133
   }
126
-  if(m->mdata.head.opcode == MAKUO_OP_DSYNC){
127
-    if(m->mdata.head.nstate == MAKUO_SENDSTATE_CLOSE){
128
-      return;
129
-    }
130
-  }
131 134
   m->retrycnt--;
132 135
 }
133 136
 
... ...
@@ -188,6 +201,7 @@ static void msend_ack_dsync(int s, mfile *m)
188 188
 
189 189
 static void msend_ack_del(int s, mfile *m)
190 190
 {
191
+  lprintf(9, "%s:\n", __func__);
191 192
   msend_shot(s, m);
192 193
 }
193 194
 
... ...
@@ -769,11 +783,13 @@ static void msend_req_del_mark(int s, mfile *m)
769 769
   mkack(&(d->mdata), &(d->addr), MAKUO_RECVSTATE_CLOSE);
770 770
 }
771 771
 
772
-static void msend_req_del_init(int s, mfile *m)
772
+static void msend_req_del_stat(int s, mfile *m)
773 773
 {
774 774
   int r;
775
+  mfile *d;
775 776
   uint8_t stat;
776 777
   uint16_t len;
778
+  uint32_t mod;
777 779
 
778 780
   lprintf(9, "%s:\n", __func__);
779 781
   r = read(m->pipe, &stat, sizeof(stat));
... ...
@@ -791,17 +807,25 @@ static void msend_req_del_init(int s, mfile *m)
791 791
     return;
792 792
   }
793 793
 
794
+  d = mkreq(&(m->mdata), &(m->addr), MAKUO_SENDSTATE_OPEN);
795
+  read(m->pipe, &mod, sizeof(mod));
794 796
   read(m->pipe, &len, sizeof(len));
795
-  read(m->pipe, m->fn, len);
796
-  m->fn[len] = 0;
797
-  lprintf(9, "%s: fn=%s\n", __func__, m->fn);
798
-
799
-  m->mdata.p = m->mdata.data;
800
-  *(uint16_t *)(m->mdata.p) = htons(len);
801
-  m->mdata.p += sizeof(uint16_t);
802
-  memcpy(m->mdata.p, m->fn, len);
803
-  m->mdata.head.szdata = sizeof(len) + len; 
804
-  m->mdata.head.reqid  = getrid();
797
+  read(m->pipe, d->fn, len);
798
+  d->fn[len] = 0;
799
+  d->mdata.p = d->mdata.data;
800
+  *(uint32_t *)(d->mdata.p) = htonl(mod);
801
+  d->mdata.p += sizeof(mod);
802
+  *(uint16_t *)(d->mdata.p) = htons(len);
803
+  d->mdata.p += sizeof(len);
804
+  memcpy(d->mdata.p, d->fn, len);
805
+  d->mdata.head.flags  = m->mdata.head.flags;
806
+  d->mdata.head.szdata = sizeof(mod) + sizeof(len) + len;
807
+  d->mdata.head.reqid  = getrid();
808
+  d->initstate = 1;
809
+  d->sendwait  = 0;
810
+  d->dryrun = m->dryrun;
811
+  d->recurs = m->recurs;
812
+  lprintf(9, "%s: fn=%s rid=%d\n", __func__, d->fn, d->mdata.head.reqid);
805 813
 }
806 814
 
807 815
 /*----- del -----*/
... ...
@@ -815,13 +839,14 @@ static void msend_req_del(int s, mfile *m)
815 815
     msend_mfdel(m);
816 816
     return;
817 817
   }
818
+  if(m->mdata.head.nstate == MAKUO_SENDSTATE_STAT){
819
+    msend_req_del_stat(s, m);
820
+    return;
821
+  }
818 822
   if(m->initstate){
819 823
     m->initstate = 0;
820 824
     m->sendwait  = 1;
821 825
     ack_clear(m, -1);
822
-    if(m->mdata.head.nstate == MAKUO_SENDSTATE_STAT){
823
-      msend_req_del_init(s, m);
824
-    }
825 826
     if(m->mdata.head.nstate == MAKUO_SENDSTATE_MARK){
826 827
       msend_req_del_mark(s, m);
827 828
       return;