Merge branch 'vendor/GCC'
[dragonfly.git] / bin / cpdup / hclink.h
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 #if USE_PTHREADS
26     pthread_t   tid;
27     pthread_cond_t cond;
28     int         waiting;
29 #endif
30     char        rbuf[65536];    /* input buffer */
31     char        wbuf[65536];    /* output buffer */
32 } *hctransaction_t;
33
34 #if USE_PTHREADS
35 #define HCTHASH_SIZE    16
36 #define HCTHASH_MASK    (HCTHASH_SIZE - 1)
37 #endif
38
39 struct HostConf {
40     char        *host;          /* [user@]host */
41     int         fdin;           /* pipe */
42     int         fdout;          /* pipe */
43     int         error;          /* permanent failure code */
44     pid_t       pid;
45     int         version;        /* cpdup protocol version */
46     struct HCHostDesc *hostdescs;
47 #if USE_PTHREADS
48     pthread_mutex_t hct_mutex[HCTHASH_SIZE];
49     hctransaction_t hct_hash[HCTHASH_SIZE];
50     pthread_t   reader_thread;
51 #else
52     struct HCTransaction trans;
53 #endif
54 };
55
56 struct HCHead {
57     int32_t magic;              /* magic number / byte ordering */
58     int32_t bytes;              /* size of packet */
59     int16_t cmd;                /* command code */
60     u_int16_t id;                       /* transaction id */
61     int32_t error;              /* error code (response) */
62 };
63
64 #define HCMAGIC         0x48435052      /* compatible byte ordering */
65 #define HCMAGIC_REV     0x52504348      /* reverse byte ordering */
66 #define HCC_ALIGN(bytes)        (((bytes) + 7) & ~7)
67
68 struct HCLeaf {
69     int16_t leafid;
70     int16_t reserved;           /* reserved must be 0 */
71     int32_t bytes;
72 };
73
74 #define HCF_REPLY       0x8000          /* reply */
75
76 #define LCF_TYPEMASK    0x0F00
77 #define LCF_INT32       0x0100          /* 4 byte integer */
78 #define LCF_INT64       0x0200          /* 8 byte integer */
79 #define LCF_STRING      0x0300          /* string, must be 0-terminated */
80 #define LCF_BINARY      0x0F00          /* binary data */
81
82 #define LCF_NESTED      0x8000
83
84 struct HCDesc {
85     int16_t cmd;
86     int (*func)(hctransaction_t, struct HCHead *);
87 };
88
89 /*
90  * Item extraction macros
91  */
92 #define HCC_STRING(item)        ((const char *)((item) + 1))
93 #define HCC_INT32(item)         (*(int32_t *)((item) + 1))
94 #define HCC_INT64(item)         (*(int64_t *)((item) + 1))
95 #define HCC_BINARYDATA(item)    ((void *)((item) + 1))
96
97 /*
98  * Prototypes
99  */
100 int hcc_connect(struct HostConf *hc);
101 int hcc_slave(int fdin, int fdout, struct HCDesc *descs, int count);
102
103 hctransaction_t hcc_start_command(struct HostConf *hc, int16_t cmd);
104 struct HCHead *hcc_finish_command(hctransaction_t trans);
105 void hcc_leaf_string(hctransaction_t trans, int16_t leafid, const char *str);
106 void hcc_leaf_data(hctransaction_t trans, int16_t leafid, const void *ptr, int bytes);
107 void hcc_leaf_int32(hctransaction_t trans, int16_t leafid, int32_t value);
108 void hcc_leaf_int64(hctransaction_t trans, int16_t leafid, int64_t value);
109
110 int hcc_alloc_descriptor(struct HostConf *hc, void *ptr, int type);
111 void *hcc_get_descriptor(struct HostConf *hc, int desc, int type);
112 void hcc_set_descriptor(struct HostConf *hc, int desc, void *ptr, int type);
113
114 struct HCLeaf *hcc_firstitem(struct HCHead *head);
115 struct HCLeaf *hcc_nextitem(struct HCHead *head, struct HCLeaf *item);
116
117 void hcc_debug_dump(struct HCHead *head);
118 void hcc_free_trans(struct HostConf *hc);
119
120 #endif
121