summaryrefslogtreecommitdiffstats
path: root/qarsh_packet.h
blob: c4316fd9af67905abf807ee832dd31a3dd7af9e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#ifndef _QARSH_PACKET_H
# define _QARSH_PACKET_H	1

#include <sys/types.h>
#include <sys/stat.h>

#define QARSH_MAX_PACKET_SIZE 32*1024

enum qa_packet_type {
	QP_INVALID = 0,
	QP_HELLO = 1,
	QP_RETURNCODE = 2,
	QP_RUNCMD = 3,
	QP_ACK = 4,
	QP_CMDEXIT = 5,
	QP_SETUSER = 6,
	QP_KILL = 7,
	QP_RECVFILE = 8,
	QP_SENDFILE = 9,
	QP_RSTAT = 10
};

struct qp_hello_pkt {
	char *qp_greeting;
};

struct qp_returncode_pkt {
	int qp_rc;
	int qp_errno;
	char *qp_strerror;
};

struct qp_runcmd_pkt {
	char *qp_cmdline;
	int qp_stdin_port;
	int qp_stdout_port;
	int qp_stderr_port;
};

/* General packet for acknowledging a command worked */
struct qp_ack_pkt {
	enum qa_packet_type qp_ack_type;
	int qp_ack_seq;
};

struct qp_cmdexit_pkt {
	pid_t qp_pid;
	int qp_status;
};

struct qp_setuser_pkt {
	char *qp_user;
	char *qp_group;
};

struct qp_kill_pkt {
	int qp_sig;
};

struct qp_recvfile_pkt {
	char *qp_path;
	mode_t qp_mode;
	int qp_if_port;
	size_t qp_count;
};

struct qp_sendfile_pkt {
	char *qp_path;
	int qp_of_port;
	size_t qp_count;
};

struct qp_rstat_pkt {
	char *qp_path;
	mode_t qp_st_mode;
	uid_t qp_st_uid;
	gid_t qp_st_gid;
	off_t qp_st_size;
};


#define QP_VERSION 1

struct qa_packet {
	enum qa_packet_type qp_type;
	int qp_seq;	/* Sequence number for this packet */
	union {
		struct qp_hello_pkt hello;
		struct qp_returncode_pkt returncode;
		struct qp_runcmd_pkt runcmd;
		struct qp_ack_pkt ack;
		struct qp_cmdexit_pkt cmdexit;
		struct qp_setuser_pkt setuser;
		struct qp_kill_pkt kill;
		struct qp_recvfile_pkt recvfile;
		struct qp_sendfile_pkt sendfile;
		struct qp_rstat_pkt rstat;
	} qp_u;
};

#define qp_hello qp_u.hello
#define qp_returncode qp_u.returncode
#define qp_runcmd qp_u.runcmd
#define qp_ack qp_u.ack
#define qp_cmdexit qp_u.cmdexit
#define qp_setuser qp_u.setuser
#define qp_kill qp_u.kill
#define qp_recvfile qp_u.recvfile
#define qp_sendfile qp_u.sendfile
#define qp_rstat qp_u.rstat

/* Prototypes */
char *qp_packet_type(enum qa_packet_type t);
struct qa_packet *parse_packets(char *buf, int n);
struct qa_packet *make_qp_hello(char *greeting);
struct qa_packet *make_qp_returncode(int rc, int eno, char *strerr);
struct qa_packet *make_qp_ack(enum qa_packet_type t, int i);
struct qa_packet *make_qp_runcmd(char *cmdline, int p_in, int p_out, int p_err);
struct qa_packet *make_qp_cmdexit(pid_t pid, int status);
struct qa_packet *make_qp_setuser(char *user, char *group);
struct qa_packet *make_qp_kill(int sig);
struct qa_packet *make_qp_recvfile(const char *path, int if_port, size_t count, mode_t mode);
struct qa_packet *make_qp_sendfile(const char *path, int of_port, size_t count);
struct qa_packet *make_qp_rstat(const char *path, const struct stat *sb);
char *qptostr(struct qa_packet *qp, char **qpstr, int *qpsize);
void qpfree(struct qa_packet *qp);
void dump_qp(struct qa_packet *qp);

#endif /* !_QARSH_PACKET_H */