#ifndef __CRACK_H__
#define __CRACK_H__

#include <time.h>

#define PW_LEN 64
#define MAX_SLAVES 256
#define BUF_SIZE 4096         /* Size of buffer used for decompression */

#define VERSION "1.0-sb2 for RISC OS"

#define DEFAULT_BLOCK_SIZE 5
#define DEFAULT_FORMAT "*"
#define DEFAULT_STRING "abcdefghijklmnopqrstuvwxyz"

/* Macros for getting two-byte and four-byte header values */
#define SH(p) ((unsigned short)(unsigned char)((p)[0]) | ((unsigned short)(unsigned char)((p)[1]) << 8))
#define LG(p) ((unsigned long)(SH(p)) | ((unsigned long)(SH((p)+2)) << 16))

#define PVM_ERROR 1
#define PVM_EXIT 2
#define PVM_FOUND 3
#define PVM_INIT 4
#define PVM_KILL_SLAVE 5
#define PVM_REQUEST 6

#define RETURN_OK                        0
#define RETURN_IO                        1
#define RETURN_TARGET_NOT_FOUND          2
#define RETURN_CANT_OPEN_ZIPFILE         3
#define RETURN_INTERRUPTED               4
#define RETURN_PARSE_ERROR               5
#define RETURN_CANT_SPAWN                6
#define RETURN_PVMD_NOT_FOUND            7
#define RETURN_TO_MANY_SLAVES            8
#define RETURN_MASTER_TIMED_OUT          9
#define RETURN_SLAVE_TIMED_OUT          10
#define RETURN_ERROR_PARSING_ZIPCRACKER 11
#define RETURN_UNKNOWN_MSGTAG           12
#define RETURN_UNZIP_ERROR_81           13

#define DWORD unsigned long
#define WORD  unsigned int
#define BYTE  unsigned char

#define USGC unsigned char
#define USGI unsigned
#define USGL unsigned long

#define GOOD_CRC32_RESIDUAL 0xdebb20e3L

extern char string[257];
extern char format[257];

extern char zipname[1024];
extern char targetname[1024];

struct crack_slave {
	int busy, needsave;
	char start[PW_LEN];
	char end[PW_LEN];
	time_t start_t;
	int tid;
	char hostname[64];
};

struct crack_todo {
	char start[PW_LEN];
	char end[PW_LEN];
	struct crack_todo *next;
};

void inc_passwd(char *guess);
void inc_much_passwd(char *guess);
void update_keys(unsigned long *key, char val);
int decript_head(unsigned char *buffer, unsigned long *key);
unsigned char decrypt_byte(unsigned long *key);
unsigned long Crc32(unsigned long oldcrc, char newchar);
void slave_mainloop();
char *format_passwd(char *guess, char *realpw);
void ctrl_c(int sig);
void init_passwd();
void parse_zipfile();
void crack(char *guess, char *end, unsigned long *rate);

extern struct crack_todo *todo, *todo_first;
extern char passwd[PW_LEN];
extern struct crack_slave slaves[MAX_SLAVES];
extern int num_slaves;

#endif


