makuosan.h
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