
/******************************************************************************
 *
 * RCS ID
 * $Id: smbserver,v 1.6 2000/04/02 16:56:29 david Exp $
 *
 * HISTORY
 * $Log: smbserver,v $
 * Revision 1.6  2000/04/02 16:56:29  david
 * Updates to use the Internet event, use wimp poll event,
 * use non blocking sockets correctly,
 * compile libs in format suitable for RISCOS module
 * new nmbd module
 *
 * Revision 1.5  2000/02/17 22:05:53  david
 * Added saved_challenge and challenge_sent to tClients for encryption
 *
 * Revision 1.4  2000/02/08 20:13:53  david
 * Added help text field to parm_struct.
 *
 * Revision 1.3  1999/11/28 12:05:20  david
 * Changed SAFTEY_MARGIN to be the same as MAX_RECV so that smbserver
 * will always be able to receive a buffer's worth of data even if there
 * is a maximum size message (65539bytes) in the input buffer.
 *
 * Revision 1.2  1999/11/23 21:59:06  david
 * Updates for long filename support.
 *
 * Revision 1.1  1999/05/16 13:22:14  david
 * Initial revision
 *
 *
 *****************************************************************************/

/* RISCOS filer imposes length of 255, RISCSOS 4 max length is 1024 */
#ifndef MAXPATHLEN
#define MAXPATHLEN 1024
#endif

#define MAX_FILE_NAME_LENGTH MAXPATHLEN

#define NULL_ERROR 0
#define MALLOC_ERROR 1
#define CALLOC_ERROR 2
#define REALLOC_ERROR 3
#define NO_ERRORS    4

#define BUFFER_SIZE (0xFFFF)
/*#define SAFETY_MARGIN 1024*/

/* TM */
/* #define MAX_SEND   8128
#define MAX_RECV   8128 */
#define MAX_SEND   16384
#define MAX_RECV   16384

#define SAFETY_MARGIN (MAX_RECV+4)

#define NMB_PORT 137
#define DGRAM_PORT 138
#define SMB_PORT 139

/* TM */
/* #define SMB_ALIGNMENT 1 */

#define SMB_DEV_T int
#define SMB_INO_T int

#define pstrcpy(d,s) safe_strcpy((d),(s),sizeof(pstring)-1)
#define pstrcat(d,s) safe_strcat((d),(s),sizeof(pstring)-1)
#define fstrcpy(d,s) safe_strcpy((d),(s),sizeof(fstring)-1)
#define fstrcat(d,s) safe_strcat((d),(s),sizeof(fstring)-1)



typedef struct sTextBlock {
   int                     nchars;
   struct sTextBlock       *nxt;
   char                    *start;
   char                    *buf;
} tTextBlock, *tpTextBlock;

typedef struct sTextQueue {
  tpTextBlock head;
  tpTextBlock *tail;
} tTextQueue, *tpTextQueue;


typedef struct sClients {
  int        clientFd;
  int        clientFd2;
  tTextQueue clientQ;
  fstring    remote_machine;
  fstring    local_machine;
  fstring    nativeOs;
  fstring    nativeLanMan;
  BOOL       challenge_sent;
  unsigned char saved_challenge[8];
  int        readPtr, writePtr;
  /* TM Achtung */
  char       inBuffer[/*MAX_RECV*3*/ BUFFER_SIZE+SAFETY_MARGIN];
  struct sClients *next;
} tClients, *tpClients;

void AddToQueue(tpTextQueue,  char *, int );
void smb_panic(char *why);

void set_first_token(char *ptr);
BOOL next_token(char **ptr,char *buff,char *sep, size_t bufsize);
char **toktocliplist(int *ctok, char *sep);
int StrCaseCmp(const char *s, const char *t);
int StrnCaseCmp(const char *s, const char *t, size_t n);
BOOL strequal(const char *s1, const char *s2);
BOOL strnequal(const char *s1,const char *s2,size_t n);
BOOL strcsequal(const char *s1,const char *s2);
void strlower(char *s);
void strupper(char *s);
void strnorm(char *s);
BOOL strisnormal(char *s);
void string_replace(char *s,char oldc,char newc);
char *skip_string(char *buf,size_t n);
size_t str_charnum(const char *s);
BOOL trim_string(char *s,const char *front,const char *back);
BOOL strhasupper(const char *s);
BOOL strhaslower(const char *s);
size_t count_chars(const char *s,char c);
char *safe_strcpy(char *dest,const char *src, size_t maxlength);
char *safe_strcat(char *dest, const char *src, size_t maxlength);
char *StrCpy(char *dest,const char *src);
char *StrnCpy(char *dest,const char *src,size_t n);
char *strncpyn(char *dest, const char *src,size_t n, char c);
size_t strhex_to_str(char *p, size_t len, const char *strhex);
BOOL in_list(char *s,char *list,BOOL casesensitive);
BOOL string_init(char **dest,const char *src);
void string_free(char **s);
BOOL string_set(char **dest,const char *src);
void string_sub(char *s,const char *pattern,const char *insert);
void all_string_sub(char *s,const char *pattern,const char *insert);
void split_at_last_component(char *path, char *front, char sep, char *back);
