... | ... |
@@ -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) |