... | ... |
@@ -126,6 +126,16 @@ char *stropcode(mdata *data) |
126 | 126 |
return(opcodestrlist[i]); |
127 | 127 |
} |
128 | 128 |
|
129 |
+char *strackreq(mdata *data) |
|
130 |
+{ |
|
131 |
+ char *ack = "ack"; |
|
132 |
+ char *req = "req"; |
|
133 |
+ if(data->head.flags & MAKUO_FLAG_ACK){ |
|
134 |
+ return(ack); |
|
135 |
+ } |
|
136 |
+ return(req); |
|
137 |
+} |
|
138 |
+ |
|
129 | 139 |
int md5sum(int fd, unsigned char *digest) |
130 | 140 |
{ |
131 | 141 |
int rd; |
... | ... |
@@ -714,7 +724,7 @@ int is_reg(char *path) |
714 | 714 |
return(0); |
715 | 715 |
} |
716 | 716 |
|
717 |
-int set_guid(int uid, int gid, gid_t *gids) |
|
717 |
+int set_guid(uid_t uid, gid_t gid, gid_t *gids) |
|
718 | 718 |
{ |
719 | 719 |
size_t num; |
720 | 720 |
|
... | ... |
@@ -72,11 +72,10 @@ |
72 | 72 |
/*----- flags -----*/ |
73 | 73 |
#define MAKUO_FLAG_ACK 1 |
74 | 74 |
#define MAKUO_FLAG_CRYPT 2 |
75 |
-#define MAKUO_FLAG_WAIT 4 |
|
76 |
-#define MAKUO_FLAG_FMARK 8 |
|
77 |
-#define MAKUO_FLAG_DRYRUN 16 |
|
78 |
-#define MAKUO_FLAG_RECURS 32 |
|
79 |
-#define MAKUO_FLAG_SYNC 64 |
|
75 |
+#define MAKUO_FLAG_FMARK 4 |
|
76 |
+#define MAKUO_FLAG_DRYRUN 8 |
|
77 |
+#define MAKUO_FLAG_RECURS 16 |
|
78 |
+#define MAKUO_FLAG_SYNC 32 |
|
80 | 79 |
|
81 | 80 |
/*----- sendstatus -----*/ |
82 | 81 |
#define MAKUO_SENDSTATE_STAT 0 /* 更新確認待 */ |
... | ... |
@@ -158,8 +157,8 @@ typedef struct |
158 | 158 |
typedef struct |
159 | 159 |
{ |
160 | 160 |
mhead head; |
161 |
- char data[MAKUO_BUFFER_SIZE]; |
|
162 |
- char *p; |
|
161 |
+ uint8_t data[MAKUO_BUFFER_SIZE]; |
|
162 |
+ uint8_t *p; |
|
163 | 163 |
}__attribute__((packed)) mdata; |
164 | 164 |
|
165 | 165 |
typedef struct excludeitem |
... | ... |
@@ -281,6 +280,7 @@ char *strsstate(uint8_t n); |
281 | 281 |
char *strrstate(uint8_t n); |
282 | 282 |
char *strmstate(mdata *data); |
283 | 283 |
char *stropcode(mdata *data); |
284 |
+char *strackreq(mdata *data); |
|
284 | 285 |
void mprintf(const char *func, mfile *m); |
285 | 286 |
void lprintf(int l, char *fmt, ...); |
286 | 287 |
void cprintf(int l, mcomm *c, char *fmt, ...); |
... | ... |
@@ -301,7 +301,7 @@ void member_del(mhost *h); |
301 | 301 |
int mrecv(int s); |
302 | 302 |
void msend(int s, mfile *m); |
303 | 303 |
void set_filestat(char *path, uid_t uid, gid_t gid, mode_t mode); |
304 |
-int set_guid(int uid, int gid, gid_t *gids); |
|
304 |
+int set_guid(uid_t uid, gid_t gid, gid_t *gids); |
|
305 | 305 |
int set_gids(char *groups); |
306 | 306 |
int seq_popmark(mfile *m, int n); |
307 | 307 |
int seq_delmark(mfile *m, uint32_t seq); |
... | ... |
@@ -321,14 +321,14 @@ int ack_clear(mfile *m, int state); |
321 | 321 |
int ack_check(mfile *m, int state); |
322 | 322 |
int mtimeget(struct timeval *tv); |
323 | 323 |
int mtimeout(struct timeval *tf, uint32_t msec); |
324 |
-int isexclude(char *fn, excludeitem *exclude, int dir); |
|
325 |
-excludeitem *mfnmatch(char *str, excludeitem *exclude); |
|
326 | 324 |
int data_safeget(mdata *data, void *buff, size_t size); |
327 | 325 |
int data_safeget16(mdata *data, uint16_t *buff); |
328 | 326 |
int data_safeget32(mdata *data, uint32_t *buff); |
329 | 327 |
int data_safeset(mdata *data, void *buff, size_t size); |
330 | 328 |
int data_safeset16(mdata *data, uint16_t val); |
331 | 329 |
int data_safeset32(mdata *data, uint32_t val); |
330 |
+int isexclude(char *fn, excludeitem *exclude, int dir); |
|
332 | 331 |
excludeitem *exclude_add(excludeitem *exclude, char *pattern); |
333 | 332 |
excludeitem *exclude_del(excludeitem *e); |
333 |
+excludeitem *mfnmatch(char *str, excludeitem *exclude); |
|
334 | 334 |
|
... | ... |
@@ -37,7 +37,7 @@ mfile *mexec_with_dsync(mcomm *c, char *fn, int dryrun, int recurs, mhost *t) |
37 | 37 |
strcat(m->fn, fn); |
38 | 38 |
} |
39 | 39 |
|
40 |
- strcpy(m->mdata.data, m->fn); |
|
40 |
+ strcpy((char *)(m->mdata.data), m->fn); |
|
41 | 41 |
m->mdata.head.reqid = getrid(); |
42 | 42 |
m->mdata.head.szdata = strlen(m->fn); |
43 | 43 |
m->mdata.head.opcode = MAKUO_OP_DSYNC; |
... | ... |
@@ -328,10 +328,12 @@ int mexec_send(mcomm *c, int n, int sync) |
328 | 328 |
if(*optarg >= '0' && *optarg <='9'){ |
329 | 329 |
gid = atoi(optarg); |
330 | 330 |
}else{ |
331 |
- for(j=0;moption.gids[j];j++){ |
|
332 |
- if(!strcmp(optarg, moption.grnames[j])){ |
|
333 |
- gid = moption.gids[j]; |
|
334 |
- break; |
|
331 |
+ if(moption.gids){ |
|
332 |
+ for(j=0;moption.gids[j];j++){ |
|
333 |
+ if(!strcmp(optarg, moption.grnames[j])){ |
|
334 |
+ gid = moption.gids[j]; |
|
335 |
+ break; |
|
336 |
+ } |
|
335 | 337 |
} |
336 | 338 |
} |
337 | 339 |
} |
... | ... |
@@ -478,7 +480,7 @@ int mexec_send(mcomm *c, int n, int sync) |
478 | 478 |
if((m->dryrun == 0) && (gid != -1)){ |
479 | 479 |
if(m->fs.st_gid != gid){ |
480 | 480 |
if(lchown(m->fn, -1, gid) == -1){ |
481 |
- lprintf(0, "%s: chown error %d -> %d (%s)\n", __func__, m->fs.st_gid, gid, strerror(errno)); |
|
481 |
+ lprintf(0, "%s: chgrp error (%s) [%d->%d] %s\n", __func__, strerror(errno), m->fs.st_gid, gid, m->fn); |
|
482 | 482 |
}else{ |
483 | 483 |
m->fs.st_gid = gid; |
484 | 484 |
} |
... | ... |
@@ -779,7 +781,8 @@ int mexec_status(mcomm *c, int n) |
779 | 779 |
if(snow > smax){ |
780 | 780 |
snow = smax; |
781 | 781 |
} |
782 |
- cprintf(0, c, " (ack) %s %s %s (%u:%u/%u) rid=%d\n", |
|
782 |
+ cprintf(0, c, " (%s) %s %s %s (%u:%u/%u) rid=%d\n", |
|
783 |
+ strackreq(&(m->mdata)), |
|
783 | 784 |
stropcode(&(m->mdata)), |
784 | 785 |
strmstate(&(m->mdata)), |
785 | 786 |
m->fn, |
... | ... |
@@ -187,7 +187,7 @@ static void minit_password(char *filename, int n) |
187 | 187 |
} |
188 | 188 |
MD5_Init(&ctx); |
189 | 189 |
MD5_Update(&ctx, buff, strlen(buff)); |
190 |
- MD5_Final(moption.password[n], &ctx); |
|
190 |
+ MD5_Final((unsigned char *)(moption.password[n]), &ctx); |
|
191 | 191 |
if(read(f, buff, sizeof(buff))){ |
192 | 192 |
lprintf(0, "%s: password too long %s\n", __func__, optarg); |
193 | 193 |
exit(1); |
... | ... |
@@ -597,7 +597,12 @@ static void mrecv_req_send_data_write(mfile *m, mdata *r) |
597 | 597 |
if(write(m->fd, r->data, r->head.szdata) != -1){ |
598 | 598 |
m->recvcount++; |
599 | 599 |
}else{ |
600 |
- lprintf(0, "%s: write error seqno=%d size=%d fd=%d err=%d\n", __func__, (int)r->head.seqno, r->head.szdata, m->fd, errno); |
|
600 |
+ lprintf(0, "%s: write error (%s) seqno=%d size=%d %s\n", |
|
601 |
+ __func__, |
|
602 |
+ strerror(errno), |
|
603 |
+ (int)(r->head.seqno), |
|
604 |
+ r->head.szdata, |
|
605 |
+ m->fn); |
|
601 | 606 |
m->mdata.head.ostate = m->mdata.head.nstate; |
602 | 607 |
m->mdata.head.nstate = MAKUO_RECVSTATE_WRITEERROR; |
603 | 608 |
mrecv_req_send_data_write_error(m, r); |
... | ... |
@@ -611,7 +616,11 @@ static void mrecv_req_send_data_retry(mfile *m, mdata *r) |
611 | 611 |
uint32_t markcnt = m->markcount; |
612 | 612 |
|
613 | 613 |
lprintf(3, "%s: markcount=%04u recv=%06u size=%06u %s\n", |
614 |
- __func__, m->markcount, m->recvcount, m->seqnomax, m->fn); |
|
614 |
+ __func__, |
|
615 |
+ m->markcount, |
|
616 |
+ m->recvcount, |
|
617 |
+ m->seqnomax, |
|
618 |
+ m->fn); |
|
615 | 619 |
|
616 | 620 |
a = mfins(0); |
617 | 621 |
if(!a){ |
... | ... |
@@ -661,10 +670,6 @@ static void mrecv_req_send_data(mfile *m, mdata *r) |
661 | 661 |
if(m->mdata.head.nstate != MAKUO_RECVSTATE_OPEN){ |
662 | 662 |
return; |
663 | 663 |
} |
664 |
- if(r->head.flags & MAKUO_FLAG_WAIT){ |
|
665 |
- mrecv_req_send_data_retry(m, r); |
|
666 |
- return; |
|
667 |
- } |
|
668 | 664 |
if(m->lickflag){ |
669 | 665 |
if(seq_delmark(m, r->head.seqno)){ |
670 | 666 |
mrecv_req_send_data_write(m, r); |
... | ... |
@@ -824,6 +829,8 @@ static mfile *mrecv_req_send_create(mdata *data, struct sockaddr_in *addr) |
824 | 824 |
mfile *m; |
825 | 825 |
uint16_t fnlen; |
826 | 826 |
uint16_t lnlen; |
827 |
+ uint32_t ldev; |
|
828 |
+ uint32_t hdev; |
|
827 | 829 |
uint64_t rdev; |
828 | 830 |
|
829 | 831 |
if(data->head.nstate != MAKUO_SENDSTATE_STAT){ |
... | ... |
@@ -841,8 +848,7 @@ static mfile *mrecv_req_send_create(mdata *data, struct sockaddr_in *addr) |
841 | 841 |
data->p = data->data; |
842 | 842 |
|
843 | 843 |
/* read mstat */ |
844 |
- memcpy(&fs, data->p, sizeof(fs)); |
|
845 |
- data->p += sizeof(fs); |
|
844 |
+ data_safeget(data, &fs, sizeof(fs)); |
|
846 | 845 |
|
847 | 846 |
/* stat = mstat */ |
848 | 847 |
m->fs.st_mode = ntohl(fs.mode); |
... | ... |
@@ -855,21 +861,19 @@ static mfile *mrecv_req_send_create(mdata *data, struct sockaddr_in *addr) |
855 | 855 |
lnlen = ntohs(fs.lnlen); |
856 | 856 |
|
857 | 857 |
/* read filename */ |
858 |
- memcpy(m->fn, data->p, fnlen); |
|
858 |
+ data_safeget(data, m->fn, fnlen); |
|
859 | 859 |
m->fn[fnlen] = 0; |
860 |
- data->p += fnlen; |
|
861 | 860 |
|
862 | 861 |
/* read linkname */ |
863 |
- memcpy(m->ln, data->p, lnlen); |
|
862 |
+ data_safeget(data, m->ln, lnlen); |
|
864 | 863 |
m->ln[lnlen] = 0; |
865 |
- data->p += lnlen; |
|
866 | 864 |
|
867 | 865 |
/* rdev */ |
868 |
- rdev = ntohl(*(uint32_t *)(data->p)); |
|
869 |
- data->p += sizeof(uint32_t); |
|
870 |
- rdev <<= 32; |
|
871 |
- rdev |= ntohl(*(uint32_t *)(data->p)); |
|
872 |
- data->p += sizeof(uint32_t); |
|
866 |
+ data_safeget32(data, &hdev); |
|
867 |
+ data_safeget32(data, &ldev); |
|
868 |
+ rdev = hdev; |
|
869 |
+ rdev <<= 32; |
|
870 |
+ rdev |= ldev; |
|
873 | 871 |
m->fs.st_rdev = (dev_t)rdev; |
874 | 872 |
|
875 | 873 |
/* Number of blocks */ |
... | ... |
@@ -1376,22 +1380,6 @@ static void mrecv_req(mdata *data, struct sockaddr_in *addr) |
1376 | 1376 |
* Receive common functions (public) |
1377 | 1377 |
* |
1378 | 1378 |
*******************************************************************/ |
1379 |
-int mrecv(int s) |
|
1380 |
-{ |
|
1381 |
- mdata data; |
|
1382 |
- struct sockaddr_in addr; |
|
1383 |
- if(mrecv_packet(s, &data, &addr) == -1){ |
|
1384 |
- return(0); |
|
1385 |
- } |
|
1386 |
- lprintf(9, "%s: rid=%d %s %s\n", __func__, data.head.reqid, stropcode(&data), strmstate(&data)); |
|
1387 |
- if(data.head.flags & MAKUO_FLAG_ACK){ |
|
1388 |
- mrecv_ack(&data, &addr); |
|
1389 |
- }else{ |
|
1390 |
- mrecv_req(&data, &addr); |
|
1391 |
- } |
|
1392 |
- return(1); |
|
1393 |
-} |
|
1394 |
- |
|
1395 | 1379 |
void mrecv_gc() |
1396 | 1380 |
{ |
1397 | 1381 |
mhost *t = members; |
... | ... |
@@ -1435,3 +1423,19 @@ void mrecv_clean() |
1435 | 1435 |
while(m=mrecv_mfdel(m)); |
1436 | 1436 |
} |
1437 | 1437 |
|
1438 |
+int mrecv(int s) |
|
1439 |
+{ |
|
1440 |
+ mdata data; |
|
1441 |
+ struct sockaddr_in addr; |
|
1442 |
+ if(mrecv_packet(s, &data, &addr) == -1){ |
|
1443 |
+ return(0); |
|
1444 |
+ } |
|
1445 |
+ lprintf(9, "%s: rid=%d %s %s\n", __func__, data.head.reqid, stropcode(&data), strmstate(&data)); |
|
1446 |
+ if(data.head.flags & MAKUO_FLAG_ACK){ |
|
1447 |
+ mrecv_ack(&data, &addr); |
|
1448 |
+ }else{ |
|
1449 |
+ mrecv_req(&data, &addr); |
|
1450 |
+ } |
|
1451 |
+ return(1); |
|
1452 |
+} |
|
1453 |
+ |
... | ... |
@@ -77,6 +77,9 @@ static int msend_packet(int s, mdata *data, struct sockaddr_in *addr) |
77 | 77 |
return(1); |
78 | 78 |
} |
79 | 79 |
if(r == -1){ |
80 |
+ if(errno == EAGAIN){ |
|
81 |
+ return(-1); |
|
82 |
+ } |
|
80 | 83 |
if(errno == EINTR){ |
81 | 84 |
continue; |
82 | 85 |
}else{ |
... | ... |
@@ -165,8 +168,9 @@ static int msend_retry(mfile *m) |
165 | 165 |
/* send & free */ |
166 | 166 |
static void msend_shot(int s, mfile *m) |
167 | 167 |
{ |
168 |
- msend_packet(s, &(m->mdata), &(m->addr)); |
|
169 |
- msend_mfdel(m); |
|
168 |
+ if(msend_packet(s, &(m->mdata), &(m->addr)) == 1){ |
|
169 |
+ msend_mfdel(m); |
|
170 |
+ } |
|
170 | 171 |
} |
171 | 172 |
|
172 | 173 |
/****************************************************************** |
... | ... |
@@ -182,8 +186,8 @@ static void msend_ack_ping(int s, mfile *m) |
182 | 182 |
static void msend_ack_send(int s, mfile *m) |
183 | 183 |
{ |
184 | 184 |
if(m->markcount){ |
185 |
- m->mdata.head.szdata = m->marksize * sizeof(uint32_t); |
|
186 |
- memcpy(m->mdata.data, m->mark, m->marksize * sizeof(uint32_t)); |
|
185 |
+ m->mdata.head.szdata = 0; |
|
186 |
+ data_safeset(&(m->mdata), m->mark, m->marksize * sizeof(uint32_t)); |
|
187 | 187 |
} |
188 | 188 |
msend_shot(s, m); |
189 | 189 |
} |
... | ... |
@@ -195,13 +199,11 @@ static void msend_ack_md5(int s, mfile *m) |
195 | 195 |
|
196 | 196 |
static void msend_ack_dsync(int s, mfile *m) |
197 | 197 |
{ |
198 |
- mprintf(__func__, m); |
|
199 | 198 |
msend_shot(s, m); |
200 | 199 |
} |
201 | 200 |
|
202 | 201 |
static void msend_ack_del(int s, mfile *m) |
203 | 202 |
{ |
204 |
- mprintf(__func__, m); |
|
205 | 203 |
msend_shot(s, m); |
206 | 204 |
} |
207 | 205 |
|
... | ... |
@@ -259,7 +261,7 @@ static void msend_req_send_break(int s, mfile *m) |
259 | 259 |
static void msend_req_send_stat_init(int s, mfile *m) |
260 | 260 |
{ |
261 | 261 |
mstat fs; |
262 |
- uint64_t rdev; |
|
262 |
+ uint64_t dev; |
|
263 | 263 |
|
264 | 264 |
if(!m->comm){ |
265 | 265 |
msend_mfdel(m); |
... | ... |
@@ -273,7 +275,7 @@ static void msend_req_send_stat_init(int s, mfile *m) |
273 | 273 |
m->mdata.head.szdata += strlen(m->ln); |
274 | 274 |
m->mdata.head.szdata += sizeof(uint64_t); |
275 | 275 |
if(m->mdata.head.szdata > MAKUO_BUFFER_SIZE){ |
276 |
- lprintf(0, "%s: buffer size over size=%d file=%s\n", __func__, m->mdata.head.szdata, m->fn); |
|
276 |
+ lprintf(0, "%s: buffer size over size=%d file=%s\n", __func__, m->mdata.head.szdata, m->fn); |
|
277 | 277 |
cprintf(0, m->comm, "error: buffer size over size=%d file=%s\n", m->mdata.head.szdata, m->fn); |
278 | 278 |
return; |
279 | 279 |
} |
... | ... |
@@ -286,18 +288,14 @@ static void msend_req_send_stat_init(int s, mfile *m) |
286 | 286 |
fs.ctime = htonl(m->fs.st_ctime); |
287 | 287 |
fs.fnlen = htons(strlen(m->fn)); |
288 | 288 |
fs.lnlen = htons(strlen(m->ln)); |
289 |
- memcpy(m->mdata.p, &fs, sizeof(fs)); |
|
290 |
- m->mdata.p += sizeof(fs); |
|
291 |
- strcpy(m->mdata.p, m->fn); |
|
292 |
- m->mdata.p += strlen(m->fn); |
|
293 |
- strcpy(m->mdata.p, m->ln); |
|
294 |
- m->mdata.p += strlen(m->ln); |
|
295 |
- |
|
296 |
- rdev = (uint64_t)(m->fs.st_rdev); |
|
297 |
- *(uint32_t *)(m->mdata.p) = htonl((uint32_t)(rdev >> 32)); |
|
298 |
- m->mdata.p += sizeof(uint32_t); |
|
299 |
- *(uint32_t *)(m->mdata.p) = htonl((uint32_t)(rdev & 0xFFFFFFFF)); |
|
300 |
- m->mdata.p += sizeof(uint32_t); |
|
289 |
+ dev = (uint64_t)(m->fs.st_rdev); |
|
290 |
+ |
|
291 |
+ m->mdata.head.szdata = 0; |
|
292 |
+ data_safeset(&(m->mdata), &fs, sizeof(fs)); |
|
293 |
+ data_safeset(&(m->mdata), m->fn, strlen(m->fn)); |
|
294 |
+ data_safeset(&(m->mdata), m->ln, strlen(m->ln)); |
|
295 |
+ data_safeset32(&(m->mdata), (uint32_t)(dev >> 32)); |
|
296 |
+ data_safeset32(&(m->mdata), (uint32_t)(dev & 0xFFFFFFFF)); |
|
301 | 297 |
m->sendwait = 1; |
302 | 298 |
m->initstate = 0; |
303 | 299 |
ack_clear(m, -1); |