xref: /dflybsd-src/bin/cpdup/hclink.h (revision e7302aa08274de307cd2c3345fc64c56dbe56e21)
1 /*
2  * HCLINK.H
3  *
4  * $DragonFly: src/bin/cpdup/hclink.h,v 1.7 2008/05/24 17:21:36 dillon Exp $
5  */
6 
7 #ifndef _HCLINK_H_
8 #define _HCLINK_H_
9 
10 struct HCHostDesc {
11     struct HCHostDesc *next;
12     int desc;
13     int type;
14     void *data;
15 };
16 
17 struct HostConf;
18 
19 typedef struct HCTransaction {
20     struct HCTransaction *next;
21     struct HostConf *hc;
22     u_int16_t	id;		/* assigned transaction id */
23     int		windex;		/* output buffer index */
24     enum { HCT_IDLE, HCT_SENT, HCT_REPLIED, HCT_DONE } state;
25     char	rbuf[65536];	/* input buffer */
26     char	wbuf[65536];	/* output buffer */
27 } *hctransaction_t;
28 
29 struct HostConf {
30     char	*host;		/* [user@]host */
31     int		fdin;		/* pipe */
32     int		fdout;		/* pipe */
33     int		error;		/* permanent failure code */
34     pid_t	pid;
35     int		version;	/* cpdup protocol version */
36     struct HCHostDesc *hostdescs;
37     struct HCTransaction trans;
38 };
39 
40 struct HCHead {
41     int32_t magic;		/* magic number / byte ordering */
42     int32_t bytes;		/* size of packet */
43     int16_t cmd;		/* command code */
44     u_int16_t id;		/* transaction id */
45     int32_t error;		/* error code (response) */
46 };
47 
48 #define HCMAGIC		0x48435052	/* compatible byte ordering */
49 #define HCMAGIC_REV	0x52504348	/* reverse byte ordering */
50 #define HCC_ALIGN(bytes)	(((bytes) + 7) & ~7)
51 
52 struct HCLeaf {
53     int16_t leafid;
54     int16_t reserved;		/* reserved must be 0 */
55     int32_t bytes;
56 };
57 
58 #define HCF_REPLY	0x8000		/* reply */
59 
60 #define LCF_TYPEMASK	0x0F00
61 #define LCF_INT32	0x0100		/* 4 byte integer */
62 #define LCF_INT64	0x0200		/* 8 byte integer */
63 #define LCF_STRING	0x0300		/* string, must be 0-terminated */
64 #define LCF_BINARY	0x0F00		/* binary data */
65 
66 #define LCF_NESTED	0x8000
67 
68 struct HCDesc {
69     int16_t cmd;
70     int (*func)(hctransaction_t, struct HCHead *);
71 };
72 
73 /*
74  * Item extraction macros
75  */
76 #define HCC_STRING(item)	((const char *)((item) + 1))
77 #define HCC_INT32(item)		(*(int32_t *)((item) + 1))
78 #define HCC_INT64(item)		(*(int64_t *)((item) + 1))
79 #define HCC_BINARYDATA(item)	((void *)((item) + 1))
80 
81 /*
82  * Prototypes
83  */
84 int hcc_connect(struct HostConf *hc);
85 int hcc_slave(int fdin, int fdout, struct HCDesc *descs, int count);
86 
87 hctransaction_t hcc_start_command(struct HostConf *hc, int16_t cmd);
88 struct HCHead *hcc_finish_command(hctransaction_t trans);
89 void hcc_leaf_string(hctransaction_t trans, int16_t leafid, const char *str);
90 void hcc_leaf_data(hctransaction_t trans, int16_t leafid, const void *ptr, int bytes);
91 void hcc_leaf_int32(hctransaction_t trans, int16_t leafid, int32_t value);
92 void hcc_leaf_int64(hctransaction_t trans, int16_t leafid, int64_t value);
93 
94 int hcc_alloc_descriptor(struct HostConf *hc, void *ptr, int type);
95 void *hcc_get_descriptor(struct HostConf *hc, int desc, int type);
96 void hcc_set_descriptor(struct HostConf *hc, int desc, void *ptr, int type);
97 
98 struct HCLeaf *hcc_firstitem(struct HCHead *head);
99 struct HCLeaf *hcc_nextitem(struct HCHead *head, struct HCLeaf *item);
100 
101 void hcc_debug_dump(struct HCHead *head);
102 void hcc_free_trans(struct HostConf *hc);
103 
104 #endif
105 
106