Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* cifs.h */

enum {
        Proot           = 1,            /* LSBs of qid.path for root dir */
        Pinfo           = 2,            /* LSBs of qid.path for info files */
        Pshare          = 4,            /* LSBs of qid.path for share dirs */
        NBHDRLEN        = 4,            /* length of a netbios header */
        T2HDRLEN        = 64,           /* Transaction2 header length */
        NO_UID          = 0xffff,       /* initial UID on connect */
        NO_TID          = 0xffff,       /* initial TID on connect */
        MTU             = 0xefff,       /* our MTU */
        CACHETIME       = 2,            /* seconds read-ahead is valid for */
        CIFS_FNAME_MAX  = 0xff,         /* max file path component len */
        OVERHEAD        = 80,           /* max packet overhead when reading & writing */
        IDLE_TIME       = 10,           /* keepalive send rate in mins */
        NBNSTOUT        = 300,          /* Netbios Name Service Timeout (300ms x 3retrys) */
        NBRPCTOUT       = 45*60*1000,   /* Netbios RPC Timeout (45sec) */
        MAX_SHARES      = 4096,         /* static table of shares attached */
        RAP_ERR_MOREINFO= 234,          /* non-error code, more info to be fetched */
        MAX_DFS_PATH    = 512,          /* MS says never more than 250 chars... */
};

enum {
        SMB_COM_CREATE_DIRECTORY        = 0x00,
        SMB_COM_DELETE_DIRECTORY        = 0x01,
        SMB_COM_OPEN                    = 0x02,
        SMB_COM_CREATE                  = 0x03,
        SMB_COM_CLOSE                   = 0x04,
        SMB_COM_FLUSH                   = 0x05,
        SMB_COM_DELETE                  = 0x06,
        SMB_COM_RENAME                  = 0x07,
        SMB_COM_QUERY_INFORMATION       = 0x08,
        SMB_COM_SET_INFORMATION         = 0x09,
        SMB_COM_READ                    = 0x0A,
        SMB_COM_WRITE                   = 0x0B,
        SMB_COM_LOCK_BYTE_RANGE         = 0x0C,
        SMB_COM_UNLOCK_BYTE_RANGE       = 0x0D,
        SMB_COM_CREATE_TEMPORARY        = 0x0E,
        SMB_COM_CREATE_NEW              = 0x0F,
        SMB_COM_CHECK_DIRECTORY         = 0x10,
        SMB_COM_PROCESS_EXIT            = 0x11,
        SMB_COM_SEEK                    = 0x12,
        SMB_COM_LOCK_AND_READ           = 0x13,
        SMB_COM_WRITE_AND_UNLOCK        = 0x14,
        SMB_COM_READ_RAW                = 0x1A,
        SMB_COM_READ_MPX                = 0x1B,
        SMB_COM_READ_MPX_SECONDARY      = 0x1C,
        SMB_COM_WRITE_RAW               = 0x1D,
        SMB_COM_WRITE_MPX               = 0x1E,
        SMB_COM_WRITE_MPX_SECONDARY     = 0x1F,
        SMB_COM_WRITE_COMPLETE          = 0x20,
        SMB_COM_QUERY_SERVER            = 0x21,
        SMB_COM_SET_INFORMATION2        = 0x22,
        SMB_COM_QUERY_INFORMATION2      = 0x23,
        SMB_COM_LOCKING_ANDX            = 0x24,
        SMB_COM_TRANSACTION             = 0x25,
        SMB_COM_TRANSACTION_SECONDARY   = 0x26,
        SMB_COM_IOCTL                   = 0x27,
        SMB_COM_IOCTL_SECONDARY         = 0x28,
        SMB_COM_COPY                    = 0x29,
        SMB_COM_MOVE                    = 0x2A,
        SMB_COM_ECHO                    = 0x2B,
        SMB_COM_WRITE_AND_CLOSE         = 0x2C,
        SMB_COM_OPEN_ANDX               = 0x2D,
        SMB_COM_READ_ANDX               = 0x2E,
        SMB_COM_WRITE_ANDX              = 0x2F,
        SMB_COM_NEW_FILE_SIZE           = 0x30,
        SMB_COM_CLOSE_AND_TREE_DISC     = 0x31,
        SMB_COM_TRANSACTION2            = 0x32,
        SMB_COM_TRANSACTION2_SECONDARY  = 0x33,
        SMB_COM_FIND_CLOSE2             = 0x34,
        SMB_COM_FIND_NOTIFY_CLOSE       = 0x35,
        SMB_COM_TREE_CONNECT            = 0x70,
        SMB_COM_TREE_DISCONNECT         = 0x71,
        SMB_COM_NEGOTIATE               = 0x72,
        SMB_COM_SESSION_SETUP_ANDX      = 0x73,
        SMB_COM_LOGOFF_ANDX             = 0x74,
        SMB_COM_TREE_CONNECT_ANDX       = 0x75,
        SMB_COM_QUERY_INFORMATION_DISK  = 0x80,
        SMB_COM_SEARCH                  = 0x81,
        SMB_COM_FIND                    = 0x82,
        SMB_COM_FIND_UNIQUE             = 0x83,
        SMB_COM_FIND_CLOSE              = 0x84,
        SMB_COM_NT_TRANSACT             = 0xA0,
        SMB_COM_NT_TRANSACT_SECONDARY   = 0xA1,
        SMB_COM_NT_CREATE_ANDX          = 0xA2,
        SMB_COM_NT_CANCEL               = 0xA4,
        SMB_COM_NT_RENAME               = 0xA5,
        SMB_COM_OPEN_PRINT_FILE         = 0xC0,
        SMB_COM_WRITE_PRINT_FILE        = 0xC1,
        SMB_COM_CLOSE_PRINT_FILE        = 0xC2,
        SMB_COM_GET_PRINT_QUEUE         = 0xC3,
        SMB_COM_READ_BULK               = 0xD8,
        SMB_COM_WRITE_BULK              = 0xD9,
        SMB_COM_WRITE_BULK_DATA         = 0xDA,

        TRANS2_OPEN2                    = 0x00,
        TRANS2_FIND_FIRST2              = 0x01,
        TRANS2_FIND_NEXT2               = 0x02,
        TRANS2_QUERY_FS_INFORMATION     = 0x03,
        TRANS2_QUERY_PATH_INFORMATION   = 0x05,
        TRANS2_SET_PATH_INFORMATION     = 0x06,
        TRANS2_QUERY_FILE_INFORMATION   = 0x07,
        TRANS2_SET_FILE_INFORMATION     = 0x08,
        TRANS2_CREATE_DIRECTORY         = 0x0D,
        TRANS2_SESSION_SETUP            = 0x0E,
        TRANS2_GET_DFS_REFERRAL         = 0x10,

        NT_TRANSACT_CREATE              = 0x01,
        NT_TRANSACT_IOCTL               = 0x02,
        NT_TRANSACT_SET_SECURITY_DESC   = 0x03,
        NT_TRANSACT_NOTIFY_CHANGE       = 0x04,
        NT_TRANSACT_RENAME              = 0x05,
        NT_TRANSACT_QUERY_SECURITY_DESC = 0x06
};

enum {                                          /* CIFS flags */
        FL_CASELESS_NAMES       = 1<<3,
        FL_CANNONICAL_NAMES     = 1<<4,

        FL2_KNOWS_LONG_NAMES    = 1<<0,
        FL2_PACKET_SIGNATURES   = 1<<2,
        FL2_HAS_LONG_NAMES      = 1<<6,
        FL2_EXTENDED_SECURITY   = 1<<11,
        FL2_DFS                 = 1<<12,
        FL2_PAGEING_IO          = 1<<13,        /* allow read of exec only files */
        FL2_NT_ERRCODES         = 1<<14,
        FL2_UNICODE             = 1<<15,
};

enum {                                          /* Capabilities Negoiated */
        CAP_RAW_MODE            = 1,
        CAP_MPX_MODE            = 1<<1,
        CAP_UNICODE             = 1<<2,
        CAP_LARGE_FILES         = 1<<3,         /* 64 bit files */
        CAP_NT_SMBS             = 1<<4,
        CAP_RPC_REMOTE_APIS     = 1<<5,
        CAP_STATUS32            = 1<<6,
        CAP_L2_OPLOCKS          = 1<<7,
        CAP_LOCK_READ           = 1<<8,
        CAP_NT_FIND             = 1<<9,
        CAP_DFS                 = 1<<12,
        CAP_INFO_PASSTHRU       = 1<<13,
        CAP_LARGE_READX         = 1<<14,
        CAP_LARGE_WRITEX        = 1<<15,
        CAP_UNIX                = 1<<23,
        CAP_BULK_TRANSFER       = 1<<29,
        CAP_COMPRESSED          = 1<<30,
        CAP_EX_SECURE           = 1<<31
};

enum {  /* string prefixes */
        STR_DIALECT             = 2,
        STR_PATH                = 3,
        STR_ASCII               = 4,
};

enum {  /* optional support bits in treeconnect */
        SMB_SUPPROT_SEARCH_BITS = 1,
        SMB_SHARE_IS_IN_DFS     = 2,
};

enum {  /* DFS referal header flags */
        DFS_HEADER_ROOT         = 1,    /* Server type, returns root targets */
        DFS_HEADER_STORAGE      = 2,    /* server has storage, no more referals */
        DFS_HEADER_FAILBACK     = 4,    /* target failback enabled */
};

enum {  /* DFS referal entry flags */
        DFS_SERVER_ROOT         = 1,    /* Server type, returns root targets */
        DFS_REFERAL_LIST        = 0x200,        /* reply is a list (v3 only) */
        DFS_REFERAL_SET         = 0x400,        /* target is a member of a set */
};

enum {  /* share types */
        STYPE_DISKTREE          = 0,
        STYPE_PRINTQ            = 1,
        STYPE_DEVICE            = 2,
        STYPE_IPC               = 3,
        STYPE_SPECIAL           = 4,
        STYPE_TEMP              = 5,
};

enum {  /* Security */
        SECMODE_USER            = 0x01, /* i.e. not share level security */
        SECMODE_PW_ENCRYPT      = 0x02,
        SECMODE_SIGN_ENABLED    = 0x04,
        SECMODE_SIGN_REQUIRED   = 0x08,
};

enum {  /* file access rights */
        DELETE                  = 0x00010000,
        SYNCHRONIZE             = 0x00100000,

        READ_CONTROL            = 0x00020000,
        GENERIC_ALL             = 0x10000000,
        GENERIC_EXECUTE         = 0x20000000,
        GENERIC_WRITE           = 0x40000000,
        GENERIC_READ            = 0x80000000,

        ATTR_READONLY           = 0x0001,
        ATTR_HIDDEN             = 0x0002,
        ATTR_SYSTEM             = 0x0004,
        ATTR_VOLUME             = 0x0008,
        ATTR_DIRECTORY          = 0x0010,
        ATTR_ARCHIVE            = 0x0020,
        ATTR_DEVICE             = 0x0040,
        ATTR_NORMAL             = 0x0080,
        ATTR_TEMPORARY          = 0x0100,
        ATTR_SPARSE             = 0x0200,
        ATTR_REPARSE            = 0x0400,
        ATTR_COMPRESSED         = 0x0800,
        ATTR_OFFLINE            = 0x100,        /* offline storage */
        ATTR_NOT_CONTENT_INDEXED= 0x2000,
        ATTR_ENCRYPTED          = 0x4000,
        ATTR_POSIX_SEMANTICS    = 0x01000000,
        ATTR_BACKUP_SEMANTICS   = 0x02000000,
        ATTR_DELETE_ON_CLOSE    = 0x04000000,
        ATTR_SEQUENTIAL_SCAN    = 0x08000000,
        ATTR_RANDOM_ACCESS      = 0x10000000,
        ATTR_NO_BUFFERING       = 0x20000000,
        ATTR_WRITE_THROUGH      = 0x80000000,

        /* ShareAccess flags */
        FILE_NO_SHARE           = 0,
        FILE_SHARE_READ         = 1,
        FILE_SHARE_WRITE        = 2,
        FILE_SHARE_DELETE       = 4,
        FILE_SHARE_ALL          = 7,

        /* CreateDisposition flags */
        FILE_SUPERSEDE          = 0,
        FILE_OPEN               = 1,
        FILE_CREATE             = 2,
        FILE_OPEN_IF            = 3,
        FILE_OVERWRITE          = 4,
        FILE_OVERWRITE_IF       = 5,

        /* CreateOptions */
        FILE_DIRECTORY_FILE             = 0x00000001,
        FILE_WRITE_THROUGH              = 0x00000002,
        FILE_SEQUENTIAL_ONLY            = 0x00000004,
        FILE_NO_INTERMEDIATE_BUFFERING  = 0x00000008,
        FILE_SYNCHRONOUS_IO_ALERT       = 0x00000010,
        FILE_SYNCHRONOUS_IO_NONALERT    = 0x00000020,
        FILE_NON_DIRECTORY_FILE         = 0x00000040,
        FILE_CREATE_TREE_CONNECTION     = 0x00000080,
        FILE_COMPLETE_IF_OPLOCKED       = 0x00000100,
        FILE_NO_EA_KNOWLEDGE            = 0x00000200,
        FILE_OPEN_FOR_RECOVERY          = 0x00000400,
        FILE_EIGHT_DOT_THREE_ONLY       = 0x00000400,   /* samba source says so... */
        FILE_RANDOM_ACCESS              = 0x00000800,
        FILE_DELETE_ON_CLOSE            = 0x00001000,
        FILE_OPEN_BY_FILE_ID            = 0x00002000,
        FILE_OPEN_FOR_BACKUP_INTENT     = 0x00004000,
        FILE_NO_COMPRESSION             = 0x00008000,

        /* open/create result codes */
        FILE_WAS_OPENED                 = 1,
        FILE_WAS_CREATED                = 2,
        FILE_WAS_OVERWRITTEN            = 3,

        /* ImpersonationLevel flags */
        SECURITY_ANONYMOUS              = 0,
        SECURITY_IDENTIFICATION         = 1,
        SECURITY_IMPERSONATION          = 2,
        SECURITY_DELEGATION             = 3,

        /* SecurityFlags */
        SECURITY_CONTEXT_TRACKING       = 1,
        SECURITY_EFFECTIVE_ONLY         = 2,

        /* security descriptor bitmask */
        QUERY_OWNER_SECURITY_INFORMATION = 1,
        QUERY_GROUP_SECURITY_INFORMATION = 2,
        QUERY_DACL_SECURITY_INFORMATION = 4,
        QUERY_SACL_SECURITY_INFORMATION = 8,

};

enum {  /* PathInfo/FileInfo infolevels */
        SMB_INFO_STANDARD               = 0x1,
        SMB_INFO_IS_NAME_VALID          = 0x6,
        SMB_QUERY_FILE_BASIC_INFO       = 0x101,
        SMB_QUERY_FILE_STANDARD_INFO    = 0x102,
        SMB_QUERY_FILE_NAME_INFO        = 0x104,
        SMB_QUERY_FILE_ALLOCATION_INFO  = 0x105,
        SMB_QUERY_FILE_END_OF_FILE_INFO = 0x106,
        SMB_QUERY_FILE_ALL_INFO         = 0x107,
        SMB_QUERY_ALT_NAME_INFO         = 0x108,
        SMB_QUERY_FILE_STREAM_INFO      = 0x109,
        SMB_QUERY_FILE_COMPRESSION_INFO = 0x10b,
        SMB_QUERY_FILE_UNIX_BASIC       = 0x200,
        SMB_QUERY_FILE_UNIX_LINK        = 0x201,

        SMB_SET_FILE_BASIC_INFO         = 0x101,
        SMB_SET_FILE_DISPOSITION_INFO   = 0x102,
        SMB_SET_FILE_ALLOCATION_INFO    = 0x103,
        SMB_SET_FILE_END_OF_FILE_INFO   = 0x104,
        SMB_SET_FILE_UNIX_BASIC         = 0x200,
        SMB_SET_FILE_UNIX_LINK          = 0x201,
        SMB_SET_FILE_UNIX_HLINK         = 0x203,
        SMB_SET_FILE_BASIC_INFO2        = 0x3ec,
        SMB_SET_FILE_RENAME_INFORMATION = 0x3f2,
        SMB_SET_FILE_ALLOCATION_INFO2   = 0x3fb,
        SMB_SET_FILE_END_OF_FILE_INFO2  = 0x3fc,

        /* Find File infolevels */
        SMB_FIND_FILE_DIRECTORY_INFO    = 0x101,
        SMB_FIND_FILE_FULL_DIRECTORY_INFO= 0x102,
        SMB_FIND_FILE_NAMES_INFO        = 0x103,
        SMB_FIND_FILE_BOTH_DIRECTORY_INFO= 0x104,
        SMB_FIND_FILE_UNIX              = 0x202,

        /* Trans2 FindFirst & FindNext */
        CIFS_SEARCH_CLOSE_ALWAYS        = 0x0001,
        CIFS_SEARCH_CLOSE_AT_END        = 0x0002,
        CIFS_SEARCH_RETURN_RESUME       = 0x0004,
        CIFS_SEARCH_CONTINUE_FROM_LAST  = 0x0008,
        CIFS_SEARCH_BACKUP_SEARCH       = 0x0010,

        /* Trans2 FsInfo */
        SMB_INFO_ALLOCATION             = 0x1,
        SMB_INFO_VOLUME                 = 0x2,
        SMB_QUERY_FS_VOLUME_INFO        = 0x102,
        SMB_QUERY_FS_SIZE_INFO          = 0x103,
        SMB_QUERY_FS_DEVICE_INFO        = 0x104,
        SMB_QUERY_FS_ATTRIBUTE_INFO     = 0x105,
        SMB_QUERY_CIFS_UNIX_INFO        = 0x200,
};

enum {  /* things to search for in server lookups */
        LOCAL_AUTHORATIVE_ONLY  = 0x40000000,
        LIST_DOMAINS_ONLY       = 0x80000000,
        ALL_LEARNT_IN_DOMAIN    = 0xFFFFFFFF
};

typedef struct {
        char    *user;          /* username */
        char    *windom;        /* remote server's domain name */
        char    *resp[2];       /* ASCII/Unicode or LM/NTLM keys */
        int     len[2];         /* length of above */
        uchar   *mackey[2];     /* Message Authentication key */
} Auth;

typedef struct {
        int     fd;             /* File descriptor for I/O  */
        int     nbt;            /* am using cifs over netbios */
        int     trn;            /* TRN (unique RPC) ID  */
        int     uid;            /* user (authentication) ID  */
        int     seq;            /* sequence number */
        int     seqrun;         /* sequence numbering active */
        int     caps;           /* server capabilities */
        int     support;        /* support bits */
        int     flags;          /* SMB flags  */
        int     flags2;         /* SMB flags 2  */
        int     nocache;        /* disable write behind caching in server */
        int     pid;            /* process ID  */
        int     mid;            /* multiplex ID */
        int     mtu;            /* max size of packet  */
        int     tz;             /* Timezone, mins from UTC  */
        int     isguest;        /* logged in as guest */
        int     secmode;        /* security mode  */
        int     macidx;         /* which MAC is in use, -1 is none */
        uchar   chal[0xff +1];  /* server's challange for authentication  */
        int     challen;        /* length of challange */
        long    slip;           /* time difference between the server and us */
        uvlong  lastfind;       /* nsec when last find peformed */
        QLock   seqlock;        /* sequence number increment */
        QLock   rpclock;        /* actual remote procedure call */
        char    *cname;         /* remote hosts called name (for info) */
        char    *remos;         /* remote hosts OS (for info) */
        Auth    *auth;          /* authentication info */
} Session;

typedef struct {
        Session *s;

        int tid;                /* tree ID received from server */
        int seq;                /* sequence number expected in reply */

        uchar *seqbase;         /* cifs: pos of sequence number in packet */
        uchar *wordbase;        /* cifs: base of words section of data  */
        uchar *bytebase;        /* cifs: base of bytes section of data  */
        uchar *tbase;           /* transactions: start of trans packet */
        uchar *tsetup;          /* transactions: start of setup section */
        uchar *tparam;          /* transactions: start of params section */
        uchar *tdata;           /* transactions: start of data section */

        uchar *eop;             /* received end of packet */
        uchar *pos;             /* current pos in packet  */
        uchar *buf;             /* packet buffer, must be last entry in struct  */
} Pkt;

typedef struct {
        char    *name;
        int     tid;            /* not part of the protocol, housekeeping */
        int     options;        /* not part of the protocol, housekeeping */
} Share;

typedef struct {
        long    created;        /* last access time */
        long    accessed;       /* last access time */
        long    written;        /* last written time */
        long    changed;        /* change time */
        uvlong  size;           /* file size */
        long    attribs;        /* attributes */
        char    name[CIFS_FNAME_MAX +1]; /* name */
} FInfo;

typedef struct {
        char    *wrkstn;
        char    *user;
        long    sesstime;
        long    idletime;
} Sessinfo;

typedef struct {
        char    *name;
} Namelist;

typedef struct {
        char    *user;
        char    *comment;
        char    *user_comment;
        char    *fullname;
} Userinfo;

typedef struct {
        char    *name;
        int     type;
        char    *comment;
        int     perms;
        int     maxusrs;
        int     activeusrs;
        char    *path;
        char    *passwd;
} Shareinfo2;

typedef struct {
        char    *name;
        int     major;
        int     minor;
        int     type;
        char    *comment;
} Serverinfo;

typedef struct {
        int     type;   /* o=unknown, 1=CIFS, 2=netware 3=domain */
        int     flags;  /* 1 == strip off consumed chars before resubmitting */
        int     ttl;    /* time to live of this info in secs */
        int     prox;   /* lower value is preferred */
        char    *path;  /* new path */
        char    *addr;  /* new server */
} Refer;

typedef struct {
        char    *node;
        char    *user;
        char    *langroup;
        int     major;
        int     minor;
        char    *pridom;
        char    *otherdoms;
} Wrkstainfo;

typedef struct {
        int     ident;
        int     perms;
        int     locks;
        char    *path;
        char    *user;
} Fileinfo;

extern int Active;
extern int Checkcase;
extern int Dfstout;
extern char *Debug;
extern char *Host;
extern Session *Sess;
extern Share Ipc;

extern Share Shares[MAX_SHARES];
extern int Nshares;

/* main.c */
Qid     mkqid(char *, int, long, int, long);

/* auth.c */
Auth    *getauth(char *, char *, char *, int, uchar *, int);
void    autherr(void);
int     macsign(Pkt *, int);

/* cifs.c */
Session *cifsdial(char *, char *, char *);
void    cifsclose(Session *);
Pkt     *cifshdr(Session *, Share *, int);
void    pbytes(Pkt *);
int     cifsrpc(Pkt *);
int     CIFSnegotiate(Session *, long *, char *, int, char *, int);
int     CIFSsession(Session *);
int     CIFStreeconnect(Session *, char *, char *, Share *);
int     CIFSlogoff(Session *);
int     CIFStreedisconnect(Session *, Share *);
int     CIFSdeletefile(Session *, Share *, char *);
int     CIFSdeletedirectory(Session *, Share *, char *);
int     CIFScreatedirectory(Session *, Share *, char *);
int     CIFSrename(Session *, Share *, char *, char *);
int     CIFS_NT_opencreate(Session *, Share *, char *, int, int, int, int, int, int, int *, FInfo *);
int     CIFS_SMB_opencreate(Session *, Share *, char *, int, int, int, int *);
vlong   CIFSwrite(Session *, Share *, int, uvlong, void *, vlong);
vlong   CIFSread(Session *, Share *, int, uvlong, void *, vlong, vlong);
int     CIFSflush(Session *, Share *, int);
int     CIFSclose(Session *, Share *, int);
int     CIFSfindclose2(Session *, Share *, int);
int     CIFSecho(Session *);
int     CIFSsetinfo(Session *, Share *, char *, FInfo *);
void    goff(Pkt *, uchar *, char *, int);

/* dfs.c */
char    *mapfile(char *);
int     mapshare(char *, Share **);
int     redirect(Session *, Share *s, char *);
int     dfscacheinfo(Fmt *);
char    *trimshare(char *);

/* doserrstr.c */
char    *doserrstr(uint);

/* fs.c */
int     shareinfo(Fmt *);
int     conninfo(Fmt *);
int     sessioninfo(Fmt *);
int     userinfo(Fmt *);
int     groupinfo(Fmt *);
int     domaininfo(Fmt *);
int     workstationinfo(Fmt *);
int     dfsrootinfo(Fmt *);
int     openfileinfo(Fmt *);
int     dfsrootinfo(Fmt *);
int     filetableinfo(Fmt *);   /* is in main.c due to C scope */

/* info.c */
int     walkinfo(char *);
int     numinfo(void);
int     dirgeninfo(int, Dir *);
int     makeinfo(int);
int     readinfo(int, char *, int, int);
void    freeinfo(int);

/* main.c */
void    usage(void);
void    dmpkey(char *, void *, int);
void    main(int, char **);

/* misc.c */
char    *strupr(char *);
char    *strlwr(char *);

/* netbios.c */
void    Gmem(uchar **, void *, int);
int     calledname(char *, char *);
int     nbtdial(char *, char *, char *);
void    nbthdr(Pkt *);
int     nbtrpc(Pkt *);
void    xd(char *, void *, int);

/* nterrstr.c */
char    *nterrstr(uint);

/* pack.c */
void    *pmem(Pkt *, void *, int);
void    *ppath(Pkt *, char *);
void    *pstr(Pkt *, char *);
void    *pascii(Pkt *, char *);
void    *pl64(Pkt *, uvlong);
void    *pb32(Pkt *, uint);
void    *pl32(Pkt *, uint);
void    *pb16(Pkt *, uint);
void    *pl16(Pkt *, uint);
void    *p8(Pkt *, uint);
void    *pname(Pkt *, char *, char);
void    *pvtime(Pkt *, uvlong);
void    *pdatetime(Pkt *, long);
void    gmem(Pkt *, void *, int);
void    gstr(Pkt *, char *, int);
void    gascii(Pkt *, char *, int);
uvlong  gl64(Pkt *);
uvlong  gb48(Pkt *);
uint    gb32(Pkt *);
uint    gl32(Pkt *);
uint    gb16(Pkt *);
uint    gl16(Pkt *);
uint    g8(Pkt *);
long    gdatetime(Pkt *);
long    gvtime(Pkt *);
void    gconv(Pkt *, int, char *, int);

/* raperrstr.c */
char    *raperrstr(uint);

/* sid2name.c */
void    upd_names(Session *, Share *, char *, Dir *);

/* trans.c */
int     RAPshareenum(Session *, Share *, Share **);
int     RAPshareinfo(Session *, Share *, char *, Shareinfo2 *);

int     RAPsessionenum(Session *, Share *, Sessinfo **);

int     RAPgroupenum(Session *, Share *, Namelist **);
int     RAPgroupusers(Session *, Share *, char *, Namelist **);

int     RAPuserenum(Session *, Share *, Namelist **);
int     RAPuserenum2(Session *, Share *, Namelist **);
int     RAPuserinfo(Session *, Share *, char *, Userinfo *);

int     RAPServerenum2(Session *, Share *, char *, int, int *, Serverinfo **);
int     RAPServerenum3(Session *, Share *, char *, int, int, Serverinfo *);

int     RAPFileenum2(Session *, Share *, char *, char *, Fileinfo **);

/* trans2.c */
int     T2findfirst(Session *, Share *, int, char *, int *, long *, FInfo *);
int     T2findnext(Session *, Share *, int, char *, int *, long *, FInfo *, int);
int     T2queryall(Session *, Share *, char *, FInfo *);
int     T2querystandard(Session *, Share *, char *, FInfo *);
int     T2setpathinfo(Session *, Share *, char *, FInfo *);
int     T2setfilelength(Session *, Share *, int, FInfo *);
int     T2fsvolumeinfo(Session *, Share *, long *, long *, char *, int);
int     T2fssizeinfo(Session *, Share *, uvlong *, uvlong *);
int     T2getdfsreferral(Session *, Share *, char *, int *, int *, Refer *, int);

/* transnt.c */
int     TNTquerysecurity(Session *, Share *, int, char **, char **);

/* ping.c */
int     ping(char *, int);