c858e9b6 |
/*
* makuosan.h |
dbdc4e5a |
* Copyright (C) 2008 KLab Inc. |
e396e004 |
*/ |
c510892b |
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif |
04533bf0 |
#define PROTOCOL_VERSION 6 |
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> |
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 |
/*----- 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
{
int cpid;
int fd[2];
int size[2];
int argc[2];
int check[2];
int loglevel;
int working;
int authchk;
char cmdline[2][MAKUO_BUFFER_SIZE];
char parse[2][8][MAKUO_BUFFER_SIZE];
char readbuff[2][MAKUO_BUFFER_SIZE];
struct sockaddr_in addr;
socklen_t addrlen;
excludeitem *exclude;
} 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;
int commpass; |
634a23d7 |
int ownmatch; |
abce546a |
int parallel; |
d6e8005b |
int sendready; |
86badd32 |
struct sockaddr_in maddr;
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; |
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; |
86badd32 |
extern int loop_flag;
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;
|
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, ...);
void cprintf(int l, mcomm *c, char *fmt, ...);
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 -----*/
int set_guid(uid_t uid, gid_t gid, gid_t *gids);
int set_gids(char *groups);
|
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); |
86badd32 |
|