/*
 *  bsdfiler.h
 *
 *  revision history
 *	0.0: May  24, 1996 by Dai ISHIJIMA (pre alpha version :-)
 *	0.1: Jul. 27, 1996 (alpha version :-)
 *	0.2: Aug. 10, 1996 (beta version :-)
 *	0.3: Sep. 27, 1996 (beta version, again :-)
 */

#define YES 1
#define NO  0
#define EOS '\0'

/*
 *  制御文字
 */
#define SYN 0x16      /* 同期 */
#define DLE 0x10      /* 拡張 */
#define ETX 0x03      /* テキストの終り */
#define STX 0x02      /* テキストの始まり */
#define SOH 0x01      /* ヘッダの始まり */
#define REPLYSOH 0x81 /* server -> client の場合のヘッダの始まり? */


/*
 *  Filer のコマンド
 */
#define CONNECT   0x40  /* 接続要求 */
#define LOGDSK    0x11  /* ドライブ変更 */
#define CHDIR     0x10  /* ディレクトリ変更 */
#define GETCWD    0x06  /* カレントディレクトリ通知要求 */
#define WILDCARD  0x12  /* ファイル検索用ワイルドカード指定 */
#define GETDIRENT 0x09  /* 検索したディレクトリエントリ通知要求 */
#define GETDFREE  0x14  /* ボリュームラベルと残容量通知要求 */
#define GETFTYPE  0x08  /* ファイルタイプ通知要求? */
#define WRITEOPEN 0x03  /* client -> server コピーするファイルの名前 */
#define FWRITE    0x15  /* client -> server ファイルコピー*/
#define SETSTAMP  0x18  /* client からコピーしたファイルのタイムスタンプ設定 */
#define FCLOSE    0x01  /* ファイル転送成功の確認? */
#define RENAME    0x0d  /* ファイル名変更 */
#define DELFILE   0x04  /* ファイル削除 */
#define READOPEN  0x0b  /* server -> client コピーするファイルの名前 */
#define TRANSRDY  0x16  /* server -> client 転送準備完了? */
#define FREAD     0x0c  /* server -> client ファイルコピー */
#define GETSTAMP  0x17  /* server からコピーしたファイルのタイムスタンプ要求 */
#define MKDIR     0x0a  /* ディレクトリ作成 */
#define DISCON    0x41  /* 接続解除 */
#define FSEEK     0x0f  /* ファイルのシーク */
#define FTELL     0x13  /* ファイルポインタの通知要求 */
#define AVAILDRV  0x1b  /* 利用可能ドライブ通知要求 */

/*
 *  エラーコード
 */
#define CANTMOVEDIR 0xd1 /* 指定されたディレクトリに移動できない */

/*
 *  各種限界値
 */
#define MAXDIRENT 256    /* ディレクトリエントリ数の上限 */
#define MAXPACKET 3000   /* パケットの最大長 (ホントは DATBLKSIZ + α) */
#define MAXLINE 80       /* 文字列の長さ */
#define MAXDEPTH 32      /* ディレクトリツリーの深さ */

/*
 *  その他もろもろ
 */
#define LABELSIZ 11                          /* ボリュームラベルの文字数 */
#define VOLUMELABEL "BSDFILER   "  /* serverから通知するボリュームラベル */
#define BASNAMSIZ 8
#define FILNAMSIZ 13       /* 8 (basename) + 1 ('.') + 3 (ext) + 1 (EOS) */
#define ISDIR 0x02
#define ISREG 0x00
#define DOSPATHSEP '\\'
#define UNIXPATHSEP '/'
#define ENTDIR 0x10       /* GETDIRNET でディレクトリを通知するとき */
#define ENTFIL 0x20       /* GETDIRNET でファイルを通知するとき */
#define TIMEOUT 15        /* sec */
#define DATBLKSIZ 0x0800  /* ファイル転送時のデータブロックサイズ */
#define BPS 9600          /* デフォルトのシリアルの速度 */

/*
 *  構造体
 */
/* ディレクトリエントリ */
typedef struct {
    unsigned char type;
    long timestamp;
    long size;
    unsigned char name[FILNAMSIZ];
} lxdirent;


/* タイムスタンプ */
typedef struct {
    unsigned int sec: 5;
    unsigned int min: 6;
    unsigned int hour: 5;
    unsigned int day: 5;
    unsigned int mon: 4;
    unsigned int year: 7;
} dos_time_stamp;

/* タイムスタンプを long にキャスト */
typedef union {
    dos_time_stamp dos;
    long val;		/* long を 32ビットと仮定するのは良くないなぁ */
} stamp_t;


/*
 *  関数プロトタイプ
 */
/* emul.c */
int emulserver(int fd);

/* file.c */
unsigned long tmstamp(char *name);
int filetype(char *name);
long diskfree();
char *unixpath(char *path);
char *dospath(char *path);
char **searchdir(char *wildcard,
                 char *entries[MAXDIRENT + 1],
		 char filnams[MAXDIRENT * FILNAMSIZ]);
lxdirent *direntry(char *name);
FILE *efopen(char *path, char *mode);
int movedir(char *path, char *new);
char *serverpath(char *curdir, char *path);

/* packet.c */
int recvpacket(int fd, unsigned char *buf);
void sendpacket(int fd, int len, unsigned char *buf);
int setbyte(unsigned char *buf, int ofs, unsigned char n);
unsigned short getshort(unsigned char *buf, int ofs);
int setshort(unsigned char *buf, int ofs, unsigned short n);
unsigned long getlong(unsigned char *buf, int ofs);
int setlong(unsigned char *buf, int ofs, unsigned long n);
int getmesg(unsigned char *buf, int ofs, char *msg);
int clrparm(char *buf, int pos, int len);
int setparm(char *buf, int pos, int len, char *parm);
int setmesg(char *buf, int pos, int len, char *msg);

/* crc.c */
void tblini();
unsigned short crc16c(unsigned short crc, unsigned char ch, int rev);

/* tty.c */
int opentty(char *devicename);
void ttyinit(int fd, int bps);
void ttyrestore(int fd);
int ttyputc(int fd, char ch);
int ttygetc(int fd);

/*
 *  おしまい
 */
