1#ifndef _BETALK_H_
2#define _BETALK_H_
3
4#include <sys/types.h>  //linux
5#include <stdio.h>
6#include <stdlib.h>
7#include <errno.h>
8#include <fcntl.h>
9#include <string.h>
10#include <signal.h>
11#include <sys/stat.h>
12#include <winsock.h>	// windows
13#include <ctype.h>
14#include <sys/utime.h>  // windows
15#include <time.h>
16#include <io.h>			// windows
17#include <direct.h>		// windows
18#include <process.h>	// windows
19
20#ifndef NULL
21#define NULL			0L
22#endif
23
24#ifndef INVALID_SOCKET
25#define INVALID_SOCKET		(int)(~0)
26#endif
27
28#define BT_TCPIP_PORT		9092
29#define BT_QUERYHOST_PORT	9093
30#define BT_BESURE_PORT		9094
31
32#define BT_CMD_TERMINATOR			13
33#define BT_CMD_PREMOUNT				0
34#define BT_CMD_MOUNT				1
35#define BT_CMD_FSINFO				2
36#define BT_CMD_LOOKUP				3
37#define BT_CMD_STAT					4
38#define BT_CMD_READDIR				5
39#define BT_CMD_READ					6
40#define BT_CMD_WRITE				7
41#define BT_CMD_CREATE				8
42#define BT_CMD_TRUNCATE				9
43#define BT_CMD_MKDIR				10
44#define BT_CMD_RMDIR				11
45#define BT_CMD_RENAME				12
46#define BT_CMD_UNLINK				13
47#define BT_CMD_READLINK				14
48#define BT_CMD_SYMLINK				15
49#define BT_CMD_WSTAT				16
50#define BT_CMD_READATTRIB			50
51#define BT_CMD_WRITEATTRIB			51
52#define BT_CMD_READATTRIBDIR		52
53#define BT_CMD_REMOVEATTRIB			53
54#define BT_CMD_STATATTRIB			54
55#define BT_CMD_READINDEXDIR			60
56#define BT_CMD_CREATEINDEX			61
57#define BT_CMD_REMOVEINDEX			62
58#define BT_CMD_STATINDEX			63
59#define BT_CMD_READQUERY			70
60#define BT_CMD_COMMIT				80
61#define BT_CMD_PRINTJOB_NEW			200
62#define BT_CMD_PRINTJOB_DATA		201
63#define BT_CMD_PRINTJOB_COMMIT		202
64#define BT_CMD_AUTHENTICATE			210
65#define BT_CMD_QUIT					255
66
67#define BT_CMD_AUTH					1
68#define BT_CMD_READUSERS			2
69#define BT_CMD_READGROUPS			3
70#define BT_CMD_WHICHGROUPS			4
71
72#define BT_REQ_HOST_PROBE			1
73#define BT_REQ_SHARE_PROBE			2
74#define BT_REQ_HOST_INFO			3
75#define BT_REQ_HOST_USERS			4
76#define BT_REQ_AUTH_TYPES			5
77
78#define BT_AUTH_REQ_CONNECT			1
79#define BT_AUTH_REQ_USERS			2
80
81#define BT_SHARED_NULL				0
82#define BT_SHARED_FOLDER			1
83#define BT_SHARED_PRINTER			2
84
85#define BT_PRINTER_PCL3				0
86#define BT_PRINTER_POSTSCRIPT		1
87#define BT_PRINTER_INKJET			2
88
89#define BT_AUTH_NONE				0
90#define BT_AUTH_BESURE				1
91
92#define BT_RIGHTS_READ				0x00000001
93#define BT_RIGHTS_WRITE				0x00000002
94#define BT_RIGHTS_PRINT				0x00000004
95
96#define BT_RPC_SIGNATURE		"btRPC"
97#define BT_RPC_VERSION_HI		0
98#define BT_RPC_VERSION_LO		1
99
100#define BT_MAX_IO_BUFFER		8192
101#define BT_MAX_ATTR_BUFFER		256
102#define BT_RPC_MIN_PACKET_SIZE	64
103#define BT_RPC_MAX_PACKET_SIZE	(BT_MAX_IO_BUFFER + 1024)
104
105#define BT_TOKEN_SHARE			1
106#define BT_TOKEN_AS				2
107#define BT_TOKEN_SET			3
108#define BT_TOKEN_READ			4
109#define BT_TOKEN_WRITE			5
110#define BT_TOKEN_READWRITE		6
111#define BT_TOKEN_PROMISCUOUS	7
112#define BT_TOKEN_ON				8
113#define BT_TOKEN_TO				9
114#define BT_TOKEN_AUTHENTICATE	10
115#define BT_TOKEN_WITH			11
116#define BT_TOKEN_GROUP			12
117#define BT_TOKEN_PRINTER		13
118#define BT_TOKEN_PRINT			14
119#define BT_TOKEN_IS				15
120#define BT_TOKEN_SPOOLED		16
121#define BT_TOKEN_DEVICE			17
122#define BT_TOKEN_TYPE			18
123#define BT_TOKEN_COMMA			200
124#define BT_TOKEN_QUOTE			201
125#define BT_TOKEN_STRING			202
126#define BT_TOKEN_NUMBER			203
127#define BT_TOKEN_ERROR			255
128
129#define isValid(c)				((c)=='.' || (c)=='_' || (c)=='-' || (c)=='/' || (c)=='\\' || (c)==':' || (c)=='&' || (c)=='\'' || (c)=='\\')
130
131#define MAX_COMMAND_ARGS		10
132#define MAX_NAME_LENGTH			32
133#define MAX_KEY_LENGTH			MAX_NAME_LENGTH
134#define MAX_USERNAME_LENGTH		MAX_NAME_LENGTH
135#define MAX_GROUPNAME_LENGTH	MAX_NAME_LENGTH
136#define BT_AUTH_TOKEN_LENGTH	(B_FILE_NAME_LENGTH + MAX_USERNAME_LENGTH)
137#define MAX_DESC_LENGTH			64
138#define MAX_GROUPS_PER_USER		80
139
140typedef struct
141{
142	char signature[6];
143	uint8 command;
144	char share[MAX_NAME_LENGTH + 1];
145} bt_request;
146
147typedef struct
148{
149	uint32 type;
150	uint32 subType;
151	char name[B_FILE_NAME_LENGTH + 1];
152} bt_resource;
153
154typedef struct
155{
156	char system[B_FILE_NAME_LENGTH];
157	char beServed[B_FILE_NAME_LENGTH];
158	char platform[B_FILE_NAME_LENGTH];
159	int cpus;
160	int connections;
161	int maxConnections;
162} bt_hostinfo;
163
164typedef struct userRights
165{
166	char *user;
167	int rights;
168	bool isGroup;
169	struct userRights *next;
170} bt_user_rights;
171
172typedef struct
173{
174	unsigned int blockSize;
175	unsigned int totalBlocks;
176	unsigned int freeBlocks;
177} bt_fsinfo;
178
179typedef struct
180{
181	unsigned int size;
182	unsigned int length;
183	char *buffer;
184} bt_outPacket;
185
186typedef struct
187{
188	unsigned int length;
189	unsigned int offset;
190	char *buffer;
191} bt_inPacket;
192
193typedef struct rpcCall
194{
195	unsigned int xid;
196	sem_id sem;
197	bt_inPacket *inPacket;
198	bool finished;
199	struct rpcCall *next;
200	struct rpcCall *prev;
201} bt_rpccall;
202
203#define BT_COOKIE_SIZE			4
204#define BT_COOKIE_BUFFER_SIZE	4096
205#define BT_QUERY_COOKIE_SIZE	4
206#define BT_FILE_HANDLE_SIZE		32
207
208typedef struct btFileHandle
209{
210	char opaque[BT_FILE_HANDLE_SIZE];
211} btFileHandle;
212
213typedef struct btCookie
214{
215	char opaque[BT_COOKIE_SIZE];
216	bt_inPacket packet;
217	bool lpbCache;
218	bool eof;
219} btCookie;
220
221typedef struct btQueryCookie
222{
223	char opaque[BT_COOKIE_SIZE];
224	char *query;
225} btQueryCookie;
226
227// RPC Operations
228unsigned char	btRPCGetChar(bt_inPacket *packet);
229unsigned int	btRPCGetInt32(bt_inPacket *packet);
230int64			btRPCGetInt64(bt_inPacket *packet);
231char *			btRPCGetNewString(bt_inPacket *packet);
232int				btRPCGetString(bt_inPacket *packet, char *buffer, int length);
233int				btRPCGetHandle(bt_inPacket *packet, btFileHandle *fhandle);
234void			btRPCGetStat(bt_inPacket *packet, beos_stat *st);
235bt_outPacket *	btRPCPutHeader(unsigned char command, unsigned char argc, int32 length);
236void			btRPCPutArg(bt_outPacket *packet, unsigned int type, void *data, int length);
237void			btRPCPutChar(bt_outPacket *packet, char value);
238void			btRPCPutInt32(bt_outPacket *packet, int32 value);
239void			btRPCPutInt64(bt_outPacket *packet, int64 value);
240void			btRPCPutString(bt_outPacket *packet, char *buffer, int length);
241void			btRPCPutBinary(bt_outPacket *packet, void *buffer, int length);
242void			btRPCPutHandle(bt_outPacket *packet, btFileHandle *fhandle);
243void			btRPCPutStat(bt_outPacket *packet, beos_stat *st);
244
245bt_rpccall *	btRPCInvoke(int session, bt_outPacket *packet);
246void btRPCCreateAck(bt_outPacket *packet, unsigned int xid, int error, int length);
247void btRPCSendAck(int client, bt_outPacket *packet);
248
249int btRecv(int sock, void *data, int dataLen, int flags);
250int btSend(int sock, void *data, int dataLen, int flags);
251
252#endif
253