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#define BT_REQ_PRINTER_PROBE		6
78
79#define BT_SHARED_NULL				0
80#define BT_SHARED_FOLDER			1
81#define BT_SHARED_PRINTER			2
82
83#define BT_PRINTER_PCL3				0
84#define BT_PRINTER_POSTSCRIPT		1
85#define BT_PRINTER_INKJET			2
86
87#define BT_AUTH_REQ_CONNECT			1
88#define BT_AUTH_REQ_USERS			2
89
90#define BT_AUTH_NONE				0
91#define BT_AUTH_BESURE				1
92
93#define BT_RIGHTS_READ				0x00000001
94#define BT_RIGHTS_WRITE				0x00000002
95#define BT_RIGHTS_PRINT				0x00000004
96
97#define BT_RPC_SIGNATURE		"btRPC"
98#define BT_RPC_VERSION_HI		0
99#define BT_RPC_VERSION_LO		1
100
101#define BT_MAX_IO_BUFFER		32768
102#define BT_MAX_ATTR_BUFFER		256
103#define BT_RPC_MIN_PACKET_SIZE	64
104#define BT_RPC_MAX_PACKET_SIZE	(BT_MAX_IO_BUFFER + 1024)
105
106#define BT_TOKEN_SHARE			1
107#define BT_TOKEN_AS				2
108#define BT_TOKEN_SET			3
109#define BT_TOKEN_READ			4
110#define BT_TOKEN_WRITE			5
111#define BT_TOKEN_READWRITE		6
112#define BT_TOKEN_PROMISCUOUS	7
113#define BT_TOKEN_ON				8
114#define BT_TOKEN_TO				9
115#define BT_TOKEN_AUTHENTICATE	10
116#define BT_TOKEN_WITH			11
117#define BT_TOKEN_GROUP			12
118#define BT_TOKEN_PRINTER		13
119#define BT_TOKEN_PRINT			14
120#define BT_TOKEN_IS				15
121#define BT_TOKEN_SPOOLED		16
122#define BT_TOKEN_DEVICE			17
123#define BT_TOKEN_TYPE			18
124#define BT_TOKEN_PRELOAD		19
125#define BT_TOKEN_COMMA			200
126#define BT_TOKEN_QUOTE			201
127#define BT_TOKEN_STRING			202
128#define BT_TOKEN_NUMBER			203
129#define BT_TOKEN_ERROR			255
130
131#define isValid(c)				((c)=='.' || (c)=='_' || (c)=='-' || (c)=='/' || (c)=='\\' || (c)==':' || (c)=='&' || (c)=='\'' || (c)=='\\')
132
133#define MAX_COMMAND_ARGS		10
134#define MAX_NAME_LENGTH			32
135#define MAX_KEY_LENGTH			MAX_NAME_LENGTH
136#define MAX_USERNAME_LENGTH		MAX_NAME_LENGTH
137#define MAX_GROUPNAME_LENGTH	MAX_NAME_LENGTH
138#define BT_AUTH_TOKEN_LENGTH	(B_FILE_NAME_LENGTH + MAX_USERNAME_LENGTH)
139#define MAX_DESC_LENGTH			64
140#define MAX_GROUPS_PER_USER		80
141
142typedef struct
143{
144	char signature[6];
145	uint8 command;
146	char share[MAX_NAME_LENGTH + 1];
147} bt_request;
148
149typedef struct
150{
151	uint32 type;
152	uint32 subType;
153	char name[B_FILE_NAME_LENGTH + 1];
154} bt_resource;
155
156typedef struct
157{
158	char system[B_FILE_NAME_LENGTH];
159	char beServed[B_FILE_NAME_LENGTH];
160	char platform[B_FILE_NAME_LENGTH];
161	int cpus;
162	int connections;
163	int maxConnections;
164} bt_hostinfo;
165
166typedef struct userRights
167{
168	char *user;
169	int rights;
170	bool isGroup;
171	struct userRights *next;
172} bt_user_rights;
173
174typedef struct
175{
176	unsigned int blockSize;
177	unsigned int totalBlocks;
178	unsigned int freeBlocks;
179} bt_fsinfo;
180
181typedef struct
182{
183	unsigned int size;
184	unsigned int length;
185	char *buffer;
186} bt_outPacket;
187
188typedef struct
189{
190	unsigned int length;
191	unsigned int offset;
192	char *buffer;
193} bt_inPacket;
194
195typedef struct rpcCall
196{
197	unsigned int xid;
198	sem_id sem;
199	bt_inPacket *inPacket;
200	bool finished;
201	struct rpcCall *next;
202	struct rpcCall *prev;
203} bt_rpccall;
204
205#define BT_COOKIE_SIZE			4
206
207typedef struct btCookie
208{
209	char opaque[BT_COOKIE_SIZE];
210	bt_inPacket packet;
211	bool lpbCache;
212	bool eof;
213} btCookie;
214
215typedef struct btQueryCookie
216{
217	char opaque[BT_COOKIE_SIZE];
218	char *query;
219} btQueryCookie;
220
221// RPC Operations
222unsigned char	btRPCGetChar(bt_inPacket *packet);
223unsigned int	btRPCGetInt32(bt_inPacket *packet);
224int64			btRPCGetInt64(bt_inPacket *packet);
225char *			btRPCGetNewString(bt_inPacket *packet);
226int				btRPCGetString(bt_inPacket *packet, char *buffer, int length);
227void			btRPCGetStat(bt_inPacket *packet, beos_stat *st);
228bt_outPacket *	btRPCPutHeader(unsigned char command, unsigned char argc, int32 length);
229void			btRPCPutArg(bt_outPacket *packet, unsigned int type, void *data, int length);
230void			btRPCPutChar(bt_outPacket *packet, char value);
231void			btRPCPutInt32(bt_outPacket *packet, int32 value);
232void			btRPCPutInt64(bt_outPacket *packet, int64 value);
233void			btRPCPutString(bt_outPacket *packet, char *buffer, int length);
234void			btRPCPutBinary(bt_outPacket *packet, void *buffer, int length);
235void			btRPCPutStat(bt_outPacket *packet, beos_stat *st);
236
237bt_rpccall *	btRPCInvoke(int session, bt_outPacket *packet);
238void btRPCCreateAck(bt_outPacket *packet, unsigned int xid, int error);
239void btRPCSendAck(int client, bt_outPacket *packet);
240
241int btRecv(int sock, void *data, int dataLen, int flags);
242int btSend(int sock, void *data, int dataLen, int flags);
243int btRecvMsg(int sock, void *data, int dataLen, int flags);
244int btSendMsg(int sock, void *data, int dataLen, int flags);
245
246#endif
247