c858e9b6 |
/*
* makuosan.h |
e6a800d5 |
* Copyright (C) 2008-2012 KLab Inc. |
e396e004 |
*/ |
c510892b |
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif |
0fe1cc19 |
#define PROTOCOL_VERSION 7 |
86badd32 |
#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <fcntl.h>
#include <time.h>
#include <utime.h>
#include <errno.h>
#include <signal.h>
#include <dirent.h>
#include <getopt.h>
#include <pwd.h>
#include <grp.h>
#include <libgen.h>
#include <fnmatch.h>
#include <stdarg.h>
#include <syslog.h>
#include <sys/stat.h> |
b60b392c |
#include <sys/wait.h> |
86badd32 |
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/time.h> |
7f16adc7 |
#include <sys/utsname.h> |
09c0d8c1 |
#include <sys/resource.h> |
86badd32 |
#include <arpa/inet.h>
#include <netinet/in.h> |
c858e9b6 |
#include <netdb.h> |
86badd32 |
#include <openssl/md5.h>
#include <openssl/blowfish.h>
/*----- limit -----*/ |
3b736b7c |
#define MAX_COMM 8
#define MAKUO_PARALLEL_MAX 8
#define MAKUO_BUFFER_SIZE 1024
#define MAKUO_HOSTNAME_MAX 255
#define MAKUO_STATE_MAX 255
#define MAKUO_OPCODE_MAX 255
#define MAKUO_HOSTSTATE_SIZE (MAKUO_PARALLEL_MAX * MAX_COMM * 2) |
86badd32 |
/*----- default -----*/ |
292bc66c |
#define MAKUO_LOCAL_ADDR "127.0.0.1" |
86badd32 |
#define MAKUO_MCAST_ADDR "224.0.0.108"
#define MAKUO_MCAST_PORT 5000
/*----- timeout -----*/ |
7680186f |
#define MAKUO_SEND_TIMEOUT 500 /* 再送間隔(ms) */ |
2d13cc86 |
#define MAKUO_SEND_RETRYCNT 120 /* 再送回数 */ |
fc430629 |
#define MAKUO_PONG_TIMEOUT 300000 /* メンバから除外するまでの時間(ms) */
#define MAKUO_PONG_INTERVAL 45000 /* PONG送信間隔(ms) */ |
a80ad51a |
#define MAKUO_RECV_GCWAIT 180000 /* 消し損ねたオブジェクトを開放する待ち時間(ms) */ |
86badd32 |
/*----- operation -----*/ |
3eaafa57 |
#define MAKUO_OP_PING 0
#define MAKUO_OP_EXIT 1
#define MAKUO_OP_SEND 2
#define MAKUO_OP_MD5 3
#define MAKUO_OP_DSYNC 4 |
874955ec |
#define MAKUO_OP_DEL 5 |
86badd32 |
/*----- flags -----*/ |
806dbe3b |
#define MAKUO_FLAG_ACK 1
#define MAKUO_FLAG_CRYPT 2 |
1ed29a26 |
#define MAKUO_FLAG_DRYRUN 4
#define MAKUO_FLAG_RECURS 8
#define MAKUO_FLAG_SYNC 16 |
86badd32 |
|
3b736b7c |
/*----- const -----*/
#define MFSEND 0
#define MFRECV 1
|
86badd32 |
/*----- sendstatus -----*/ |
91adf830 |
#define MAKUO_SENDSTATE_STAT 0 /* 更新確認待 */
#define MAKUO_SENDSTATE_OPEN 1 /* オープン待 */
#define MAKUO_SENDSTATE_DATA 2 /* データ送信 */
#define MAKUO_SENDSTATE_MARK 3 /* 再送確認待 */
#define MAKUO_SENDSTATE_CLOSE 4 /* クローズ待 */
#define MAKUO_SENDSTATE_LAST 5 /* 送信完了 */
#define MAKUO_SENDSTATE_ERROR 6 /* エラー発生 */
#define MAKUO_SENDSTATE_BREAK 7 /* 送信中断 */ |
eeef442d |
#define MAKUO_SENDSTATE_WAIT 8 /* 送信待機 */ |
86badd32 |
/*----- recvstatus -----*/
#define MAKUO_RECVSTATE_NONE 0
#define MAKUO_RECVSTATE_UPDATE 1
#define MAKUO_RECVSTATE_SKIP 2
#define MAKUO_RECVSTATE_OPEN 3
#define MAKUO_RECVSTATE_MARK 4
#define MAKUO_RECVSTATE_CLOSE 5
#define MAKUO_RECVSTATE_IGNORE 6
#define MAKUO_RECVSTATE_READONLY 7 |
806dbe3b |
#define MAKUO_RECVSTATE_BREAK 8 |
1ed29a26 |
#define MAKUO_RECVSTATE_LAST 9 |
86badd32 |
#define MAKUO_RECVSTATE_MD5OK 10
#define MAKUO_RECVSTATE_MD5NG 11 |
3eaafa57 |
#define MAKUO_RECVSTATE_DELETEOK 12
#define MAKUO_RECVSTATE_DELETENG 13 |
86badd32 |
#define MAKUO_RECVSTATE_OPENERROR 90
#define MAKUO_RECVSTATE_READERROR 91
#define MAKUO_RECVSTATE_WRITEERROR 92
#define MAKUO_RECVSTATE_CLOSEERROR 93
/*----- mexec mode -----*/ |
fc430629 |
#define MAKUO_MEXEC_SEND 0
#define MAKUO_MEXEC_DRY 1
#define MAKUO_MEXEC_MD5 2 |
86badd32 |
|
6ffe114e |
/*----- macro -----*/
#ifndef timeradd
#define timeradd(a, b, r) \
do { \
(r)->tv_sec = (a)->tv_sec + (b)->tv_sec; \
(r)->tv_usec = (a)->tv_usec + (b)->tv_usec; \
if ((r)->tv_usec >= 1000000) \
{ \
(r)->tv_sec += 1; \
(r)->tv_usec -= 1000000; \
} \
}while(0)
#endif
|
86badd32 |
/*----- struct -----*/
typedef struct
{
uint8_t vproto;
uint8_t opcode;
uint8_t nstate;
uint8_t ostate;
uint16_t szdata;
uint16_t flags;
uint32_t reqid;
uint32_t seqno; |
326703dc |
uint32_t maddr;
uint16_t mport; |
f31a5410 |
uint32_t error; |
86badd32 |
uint8_t hash[16];
}__attribute__((packed)) mhead;
typedef struct
{
uint32_t mode;
uint16_t uid;
uint16_t gid;
uint32_t sizel;
uint32_t sizeh;
uint32_t mtime;
uint32_t ctime;
uint16_t fnlen;
uint16_t lnlen;
}__attribute__((packed)) mstat;
typedef struct
{
uint8_t hash[16];
uint16_t fnlen;
uint8_t filename[0];
}__attribute__((packed)) mhash;
typedef struct
{
uint16_t hostnamelen;
uint16_t versionlen;
uint8_t data[0];
}__attribute__((packed)) mping;
typedef struct
{
mhead head; |
43a6533f |
uint8_t data[MAKUO_BUFFER_SIZE];
uint8_t *p; |
86badd32 |
}__attribute__((packed)) mdata;
|
8e09e847 |
typedef struct excludeitem |
86badd32 |
{
char *pattern; |
8e09e847 |
struct excludeitem *prev;
struct excludeitem *next; |
86badd32 |
} excludeitem;
typedef struct
{ |
05348f1d |
int no; |
86badd32 |
int cpid;
int fd[2];
int size[2];
int argc[2];
int check[2];
int loglevel;
int working;
int authchk; |
05348f1d |
int isalive;
int logflag; |
076535d8 |
int logover; |
83082c34 |
int logfail; |
86badd32 |
char cmdline[2][MAKUO_BUFFER_SIZE];
char parse[2][8][MAKUO_BUFFER_SIZE];
char readbuff[2][MAKUO_BUFFER_SIZE];
excludeitem *exclude; |
05348f1d |
struct timeval tv; |
86badd32 |
} mcomm;
|
f31a5410 |
typedef struct mmark
{
uint32_t l;
uint32_t h;
struct mmark *prev;
struct mmark *next;
} mmark;
|
806dbe3b |
typedef struct mfile |
3eaafa57 |
{
int fd;
char fn[PATH_MAX];
char tn[PATH_MAX];
char ln[PATH_MAX]; |
881df679 |
uint16_t len;
uint32_t mod; |
86badd32 |
uint32_t sendto;
uint32_t dryrun; |
3eaafa57 |
uint32_t recurs; |
86badd32 |
uint32_t retrycnt;
uint32_t sendwait;
uint32_t lickflag; |
e396e004 |
uint32_t initstate; |
86badd32 |
uint32_t recvcount;
uint32_t markcount; |
481bf811 |
uint32_t seqnonow; |
86badd32 |
uint32_t seqnomax; |
874955ec |
int pid;
int pipe; |
86badd32 |
mdata mdata;
mcomm *comm; |
f31a5410 |
mmark *mark; |
86badd32 |
struct stat fs;
struct sockaddr_in addr;
struct timeval lastsend;
struct timeval lastrecv; |
806dbe3b |
struct mfile *prev;
struct mfile *next;
struct mfile *link; |
8e09e847 |
excludeitem *exclude; |
3b736b7c |
char cmdline[MAKUO_BUFFER_SIZE]; |
21e2082d |
MD5_CTX md5; |
86badd32 |
} mfile;
typedef struct
{ |
3b736b7c |
uint8_t state[MAKUO_HOSTSTATE_SIZE];
mfile *mflist[MAKUO_HOSTSTATE_SIZE]; |
634a23d7 |
char hostname[MAKUO_HOSTNAME_MAX]; |
86badd32 |
char version[32];
struct in_addr ad;
struct timeval lastrecv;
void *prev;
void *next;
} mhost;
typedef struct
{
int chroot;
int dontrecv;
int dontsend;
int dontfork;
int loglevel;
int mcsocket;
int lisocket;
int cryptena;
int comm_ena; |
ab81b188 |
int core_ena;
int coresize; |
86badd32 |
int commpass; |
634a23d7 |
int ownmatch; |
abce546a |
int parallel; |
0fe1cc19 |
int recvsize;
int sendsize; |
d6e8005b |
int sendready; |
1615a78a |
int sendrate; |
efce2c7f |
struct utsname uts; |
86badd32 |
struct sockaddr_in maddr; |
5900834d |
struct sockaddr_in iaddr; |
86badd32 |
struct sockaddr_in laddr;
struct sockaddr_un uaddr;
char base_dir[PATH_MAX];
char real_dir[PATH_MAX];
uid_t uid;
gid_t gid; |
e5b6322e |
gid_t *gids; |
05348f1d |
size_t gidn; |
86badd32 |
char group_name[64];
char user_name[64]; |
27b2005f |
char grnames[32][64]; |
86badd32 |
char password[2][16];
mcomm comm[MAX_COMM];
} mopt;
extern mfile *mftop[2]; |
07238671 |
extern mfile *mfreeobj; |
86badd32 |
extern mhost *members;
extern mopt moption;
extern char *optarg;
extern int optind;
extern int opterr;
extern int optopt; |
7c8e6a17 |
extern int optreset; |
1615a78a |
extern int send_rate; |
46e655e5 |
extern int view_rate;
extern time_t send_time; |
86badd32 |
extern char *tzname[2];
extern int daylight;
extern char TZ[256];
extern struct timeval curtime; |
d38d0833 |
extern struct timeval lastpong; |
86badd32 |
extern BF_KEY EncKey; |
e6a800d5 |
extern volatile sig_atomic_t log_level;
extern volatile sig_atomic_t loop_flag; |
86badd32 |
|
8120e18c |
/*----- report -----*/
char *strsstate(uint8_t n);
char *strrstate(uint8_t n);
char *strmstate(mdata *data);
char *stropcode(mdata *data);
char *strackreq(mdata *data); |
eeef442d |
void mprintf(int l, const char *func, mfile *m); |
8120e18c |
void lprintf(int l, char *fmt, ...); |
f73d92fa |
int cprintf(int l, mcomm *c, char *fmt, ...); |
8120e18c |
void fdprintf(int s, char *fmt, ...);
/*----- packet data access -----*/
int data_safeget(mdata *data, void *buff, size_t size);
int data_safeget16(mdata *data, uint16_t *buff);
int data_safeget32(mdata *data, uint32_t *buff);
int data_safeset(mdata *data, void *buff, size_t size);
int data_safeset16(mdata *data, uint16_t val);
int data_safeset32(mdata *data, uint32_t val);
/*----- file object operation -----*/
void mfdel(mfile *m);
mfile *mfadd(int n);
mfile *mfins(int n);
mfile *mkreq(mdata *data, struct sockaddr_in *addr, uint8_t state);
mfile *mkack(mdata *data, struct sockaddr_in *addr, uint8_t state);
/*----- exclude functions -----*/
excludeitem *exclude_add(excludeitem *exclude, char *pattern); /* add list */
excludeitem *exclude_del(excludeitem *e); /* del list */
excludeitem *mfnmatch(char *str, excludeitem *exclude); /* is match */
int isexclude(char *fn, excludeitem *exclude, int dir); /* */
/*----- filesystem operation -----*/ |
fc430629 |
int linkcmp(mfile *m); |
8120e18c |
int statcmp(struct stat *s1, struct stat *s2);
int mremove(char *base, char *name);
int mcreatedir(char *base, char *name, mode_t mode);
int mcreatefile(char *base, char *name, mode_t mode);
int mcreatelink(char *base, char *name, char *link); |
eeef442d |
int atomic_read(int fd, void *buff, int size, int nb); |
8120e18c |
void set_filestat(char *path, uid_t uid, gid_t gid, mode_t mode);
/*----- uid/gid -----*/ |
05348f1d |
int set_guid(uid_t uid, gid_t gid, size_t gidn, gid_t *gids); |
8120e18c |
|
fc430629 |
/*----- member operation -----*/ |
8120e18c |
void member_del(mhost *h);
mhost *member_get(struct in_addr *addr);
mhost *member_add(struct in_addr *addr, mdata *recvdata); |
eeef442d |
void member_del_message(int err, mhost *t, char *mess); |
8120e18c |
/*----- mark operation -----*/ |
f31a5410 |
mmark *delmark(mmark *mm);
uint32_t seq_getmark(mfile *m);
void seq_setmark(mfile *m, uint32_t lseq, uint32_t useq);
void seq_addmark(mfile *m, uint32_t lseq, uint32_t useq); |
dbdc4e5a |
int seq_delmark(mfile *m, uint32_t seq); |
8120e18c |
/*----- status operation -----*/
int ack_clear(mfile *m, int state);
int ack_check(mfile *m, int state); |
abce546a |
void clr_hoststate(mfile *m);
uint8_t *get_hoststate(mhost *t, mfile *m); |
aa2b6bc8 |
uint8_t *set_hoststate(mhost *t, mfile *m, uint8_t state); |
8120e18c |
/*----- send/receive -----*/
void mrecv_clean();
void msend_clean(); |
d6e8005b |
int mrecv();
void msend(mfile *m); |
8120e18c |
|
fc430629 |
/*----- time -----*/ |
8120e18c |
int mtimeget(struct timeval *tv);
int mtimeout(struct timeval *tf, uint32_t msec);
|
fc430629 |
/*----- other -----*/
uint32_t getrid();
int space_escape(char *str);
int workend(mcomm *c); |
38605fc1 |
char *yesno(int n); |
1b4c64d4 |
int is_dir(char *path);
int is_reg(char *path);
int mcreatenode(char *base, char *name, mode_t mode, dev_t dev);
int mrename(char *base, char *oldname, char *newname); |
1162859f |
int mexec(mcomm *c, int n); |
1b4c64d4 |
void mtempname(char *base, char *fn, char *tn);
void minit(int argc, char *argv[]);
void mexit();
void mrecv_gc(); |
1162859f |
|