... | ... |
@@ -303,17 +303,6 @@ int mexec_send(mcomm *c, int n) |
303 | 303 |
lprintf(0, "%s: out of memorry\n", __func__); |
304 | 304 |
return(0); |
305 | 305 |
} |
306 |
- m->mdata.head.reqid = getrid(); |
|
307 |
- m->mdata.head.opcode = MAKUO_OP_SEND; |
|
308 |
- m->mdata.head.seqno = 0; |
|
309 |
- m->mdata.head.nstate = MAKUO_SENDSTATE_STAT; |
|
310 |
- m->comm = c; |
|
311 |
- m->sendwait = 0; |
|
312 |
- m->sendto = 0; |
|
313 |
- m->dryrun = (mode == MAKUO_MEXEC_DRY); |
|
314 |
- m->initstate = 1; |
|
315 |
- m->ln[0] = 0; |
|
316 |
- strcpy(m->fn, fn); |
|
317 | 306 |
if(lstat(fn, &m->fs) == -1){ |
318 | 307 |
cprintf(0, c, "error: lstat() error %s\n", fn); |
319 | 308 |
lprintf(1, "%s: lstat() error argc=%d cmd=%s\n", __func__, c->argc[n], c->cmdline[n]); |
... | ... |
@@ -323,6 +312,17 @@ int mexec_send(mcomm *c, int n) |
323 | 323 |
mfdel(m); |
324 | 324 |
return(0); |
325 | 325 |
} |
326 |
+ strcpy(m->fn, fn); |
|
327 |
+ m->mdata.head.reqid = getrid(); |
|
328 |
+ m->mdata.head.opcode = MAKUO_OP_SEND; |
|
329 |
+ m->mdata.head.nstate = MAKUO_SENDSTATE_STAT; |
|
330 |
+ m->comm = c; |
|
331 |
+ m->dryrun = (mode == MAKUO_MEXEC_DRY); |
|
332 |
+ m->initstate = 1; |
|
333 |
+ m->seqnomax = m->fs.st_size / MAKUO_BUFFER_SIZE; |
|
334 |
+ if(m->fs.st_size % MAKUO_BUFFER_SIZE){ |
|
335 |
+ m->seqnomax++; |
|
336 |
+ } |
|
326 | 337 |
|
327 | 338 |
/*----- owner check -----*/ |
328 | 339 |
if(moption.ownmatch && (moption.uid != m->fs.st_uid)){ |
... | ... |
@@ -536,6 +536,7 @@ static void mrecv_req_send_close(mfile *m, mdata *r) |
536 | 536 |
case MAKUO_RECVSTATE_MARK: |
537 | 537 |
m->mdata.head.ostate = m->mdata.head.nstate; |
538 | 538 |
m->mdata.head.nstate = MAKUO_RECVSTATE_CLOSE; |
539 |
+ break; |
|
539 | 540 |
case MAKUO_RECVSTATE_CLOSE: |
540 | 541 |
case MAKUO_RECVSTATE_CLOSEERROR: |
541 | 542 |
break; |
... | ... |
@@ -581,6 +582,7 @@ static void mrecv_req_send_close(mfile *m, mdata *r) |
581 | 581 |
} |
582 | 582 |
} |
583 | 583 |
} |
584 |
+ |
|
584 | 585 |
a = mfins(0); |
585 | 586 |
if(!a){ |
586 | 587 |
lprintf(0,"%s: out of memory\n", __func__); |
... | ... |
@@ -647,6 +649,10 @@ static mfile *mrecv_req_send_create(mdata *data, struct sockaddr_in *addr) |
647 | 647 |
uint16_t fnlen; |
648 | 648 |
uint16_t lnlen; |
649 | 649 |
|
650 |
+ if(data->head.nstate != MAKUO_SENDSTATE_STAT){ |
|
651 |
+ return(NULL); |
|
652 |
+ } |
|
653 |
+ |
|
650 | 654 |
/* create object */ |
651 | 655 |
if(!(m = mfadd(1))){ |
652 | 656 |
return(NULL); |
... | ... |
@@ -692,6 +698,7 @@ static mfile *mrecv_req_send_create(mdata *data, struct sockaddr_in *addr) |
692 | 692 |
|
693 | 693 |
static void mrecv_req_send(mdata *data, struct sockaddr_in *addr) |
694 | 694 |
{ |
695 |
+ mfile *a; |
|
695 | 696 |
mfile *m; |
696 | 697 |
for(m=mftop[1];m;m=m->next){ |
697 | 698 |
if(!memcmp(&m->addr, addr, sizeof(m->addr)) && m->mdata.head.reqid == data->head.reqid){ |
... | ... |
@@ -700,12 +707,25 @@ static void mrecv_req_send(mdata *data, struct sockaddr_in *addr) |
700 | 700 |
} |
701 | 701 |
if(!m){ |
702 | 702 |
m = mrecv_req_send_create(data, addr); |
703 |
- if(!m){ |
|
704 |
- lprintf(0, "%s: out of memory\n", __func__); |
|
703 |
+ } |
|
704 |
+ if(m){ |
|
705 |
+ mtimeget(&(m->lastrecv)); |
|
706 |
+ mrecv_req_send_next(m, data); |
|
707 |
+ }else{ |
|
708 |
+ if(data->head.nstate != MAKUO_SENDSTATE_DATA){ |
|
709 |
+ a = mfins(0); |
|
710 |
+ if(!a){ |
|
711 |
+ lprintf(0,"%s: out of memory\n", __func__); |
|
712 |
+ }else{ |
|
713 |
+ a->mdata.head.flags |= MAKUO_FLAG_ACK; |
|
714 |
+ a->mdata.head.opcode = data->head.opcode; |
|
715 |
+ a->mdata.head.reqid = data->head.reqid; |
|
716 |
+ a->mdata.head.seqno = data->head.seqno; |
|
717 |
+ a->mdata.head.nstate = MAKUO_RECVSTATE_IGNORE; |
|
718 |
+ memcpy(&(a->addr), addr, sizeof(a->addr)); |
|
719 |
+ } |
|
705 | 720 |
} |
706 | 721 |
} |
707 |
- mtimeget(&(m->lastrecv)); |
|
708 |
- mrecv_req_send_next(m, data); |
|
709 | 722 |
} |
710 | 723 |
|
711 | 724 |
static void mrecv_req_md5_open(mfile *m, mdata *data, struct sockaddr_in *addr) |