static void msend_req_send_close(int s, mfile *m) { if(m->initstate){ msend_req_send_close_init(s, m); return; } if(m->sendwait){ msend_packet(s, &(m->mdata), &(m->addr)); return; } if(ack_check(m, MAKUO_RECVSTATE_UPDATE) == 1){ msend_req_send_close_init(s, m); return; } if(ack_check(m, MAKUO_RECVSTATE_OPEN) == 1){ msend_req_send_close_init(s, m); return; } if(ack_check(m, MAKUO_RECVSTATE_MARK) == 1){ msend_req_send_close_init(s, m); return; } if(m->mdata.head.ostate == MAKUO_SENDSTATE_MARK || m->mdata.head.ostate == MAKUO_SENDSTATE_DATA || m->mdata.head.ostate == MAKUO_SENDSTATE_OPEN){ lprintf(4, "update complate %s\n", m->fn); } m->initstate = 1; m->mdata.head.nstate = MAKUO_SENDSTATE_LAST; }
int is_send(mfile *m) { if(!m){ return(0); } if(m->mdata.head.nstate == MAKUO_SENDSTATE_WAIT){ return(0); } if(m->mdata.head.flags & MAKUO_FLAG_ACK){ return(1); } switch(m->mdata.head.opcode){ case MAKUO_OP_SEND: case MAKUO_OP_DEL: if(!S_ISLNK(m->fs.st_mode) && S_ISDIR(m->fs.st_mode)){ if(!mfdirchk(m)){ return(0); } } break; } if(!ack_check(m, MAKUO_RECVSTATE_NONE)){ m->sendwait = 0; } if(m->sendwait){ if(!mtimeout(&(m->lastsend), MAKUO_SEND_TIMEOUT)){ return(0); } if(!(m->retrycnt)){ recv_timeout(m); } } return(1); }
static void msend_req_send_open(int s, mfile *m) { if(m->initstate){ msend_req_send_open_init(s, m); return; } if(m->sendwait){ msend_packet(s, &(m->mdata), &(m->addr)); return; } if(ack_check(m, MAKUO_RECVSTATE_UPDATE) == 1){ m->sendwait = 1; ack_clear(m, MAKUO_RECVSTATE_UPDATE); return; } if(S_ISLNK(m->fs.st_mode) || !S_ISREG(m->fs.st_mode)){ m->initstate = 1; m->mdata.head.ostate = m->mdata.head.nstate; m->mdata.head.nstate = MAKUO_SENDSTATE_CLOSE; }else{ m->mdata.head.seqno = 0; m->mdata.head.ostate = m->mdata.head.nstate; m->mdata.head.nstate = MAKUO_SENDSTATE_DATA; } }
static void msend_req_send_stat(int s, mfile *m) { if(m->initstate){ msend_req_send_stat_init(s, m); return; } if(m->sendwait){ msend_packet(s, &(m->mdata), &(m->addr)); return; } if(m->mdata.head.flags & MAKUO_FLAG_SYNC){ msend_req_send_stat_delete_report(m); m->initstate = 1; m->mdata.head.ostate = m->mdata.head.nstate; m->mdata.head.nstate = MAKUO_SENDSTATE_LAST; }else{ msend_req_send_stat_update_report(m); m->initstate = 1; m->mdata.head.ostate = m->mdata.head.nstate; if(m->dryrun){ m->mdata.head.nstate = MAKUO_SENDSTATE_CLOSE; }else{ if(ack_check(m, MAKUO_RECVSTATE_UPDATE) == 1){ m->mdata.head.nstate = MAKUO_SENDSTATE_OPEN; }else{ m->mdata.head.nstate = MAKUO_SENDSTATE_CLOSE; } } } }
static void msend_req_send_stat_delete_report(mfile *m) { mhost *t; uint8_t *r; char *dryrun = ""; if(m->dryrun){ dryrun = "(dryrun) "; if(ack_check(m, MAKUO_RECVSTATE_DELETEOK) == 1){ if(m->comm){ if(m->comm->loglevel == 0){ cprintf(0, m->comm, "%s[delete:%s]\n", dryrun, m->fn); } } } } for(t=members;t;t=t->next){ if(m->sendto){ if(t != member_get(&(m->addr.sin_addr))){ continue; } } if((r = get_hoststate(t, m))){ if(*r == MAKUO_RECVSTATE_DELETEOK){ cprintf(1, m->comm, "%sdelete %s:%s\n", dryrun, t->hostname, m->fn); lprintf(1, "%sdelete %s:%s\n", dryrun, t->hostname, m->fn); } } } }
static void msend_req_send_last(int s, mfile *m) { if(m->initstate){ msend_req_send_last_init(s, m); return; } if(m->sendwait){ msend_packet(s, &(m->mdata), &(m->addr)); return; } if(ack_check(m, MAKUO_RECVSTATE_SKIP) == 1){ msend_req_send_last_init(s, m); return; } if(ack_check(m, MAKUO_RECVSTATE_CLOSE) == 1){ msend_req_send_last_init(s, m); return; } msend_mfdel(m); }
static void msend_req_send_mark(int s, mfile *m) { if(m->initstate){ msend_req_send_mark_init(s, m); return; } if(m->sendwait){ msend_packet(s, &(m->mdata), &(m->addr)); return; } if(ack_check(m, MAKUO_RECVSTATE_UPDATE) == 1){ msend_req_send_mark_init(s, m); return; } if(ack_check(m, MAKUO_RECVSTATE_OPEN) == 1){ msend_req_send_mark_init(s, m); return; } m->mdata.head.nstate = MAKUO_SENDSTATE_DATA; }
static void msend_req_md5_open(int s, mfile *m) { if(m->initstate){ msend_req_md5_open_init(s, m); return; } if(m->sendwait){ msend_packet(s, &(m->mdata), &(m->addr)); return; } if(ack_check(m, MAKUO_RECVSTATE_OPEN) == 1){ m->initstate = 0; m->sendwait = 1; ack_clear(m, MAKUO_RECVSTATE_OPEN); return; } m->initstate = 1; m->sendwait = 0; m->mdata.head.nstate = MAKUO_SENDSTATE_CLOSE; }
static void msend_req_dsync_close(int s, mfile *m) { if(m->initstate){ m->sendwait = 1; m->initstate = 0; ack_clear(m, MAKUO_RECVSTATE_OPEN); msend_packet(s, &(m->mdata), &(m->addr)); return; } if(m->sendwait){ msend_packet(s, &(m->mdata), &(m->addr)); return; } if(ack_check(m, MAKUO_RECVSTATE_OPEN)){ m->sendwait = 0; m->initstate = 1; }else{ msend_packet(s, &(m->mdata), &(m->addr)); msend_mfdel(m); } }
static void msend_req_send_stat_update_report(mfile *m) { uint8_t *r; mhost *t; char *dryrun = ""; if(m->dryrun){ dryrun = "(dryrun) "; if(ack_check(m, MAKUO_RECVSTATE_UPDATE) == 1){ if(m->comm){ if(m->comm->loglevel == 0){ cprintf(0, m->comm, "%s[update:%s]\n", dryrun, m->fn); } } } } for(t=members;t;t=t->next){ if(m->sendto){ if(t != member_get(&(m->addr.sin_addr))){ continue; } } if((r = get_hoststate(t, m))){ if(*r == MAKUO_RECVSTATE_UPDATE){ cprintf(1, m->comm, "%supdate %s:%s\r\n", dryrun, t->hostname, m->fn); lprintf(1, "%supdate %s:%s\n", dryrun, t->hostname, m->fn); } if(*r == MAKUO_RECVSTATE_SKIP){ cprintf(2, m->comm, "%sskip %s:%s\r\n", dryrun, t->hostname, m->fn); lprintf(5, "%sskip %s:%s\n", dryrun, t->hostname, m->fn); } if(*r == MAKUO_RECVSTATE_READONLY){ cprintf(3, m->comm, "%sskipro %s:%s\r\n", dryrun, t->hostname, m->fn); lprintf(6, "%sskipro %s:%s\n", dryrun, t->hostname, m->fn); } } } }