Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

typedef struct SmbSession SmbSession;
typedef struct SmbTree SmbTree;
typedef struct SmbService SmbService;
typedef struct SmbPeerInfo SmbPeerInfo;
typedef struct SmbTransaction SmbTransaction;
typedef struct SmbBuffer SmbBuffer;
typedef struct SmbIdMap SmbIdMap;
typedef struct SmbSearch SmbSearch;
typedef struct SmbDirCache SmbDirCache;
typedef struct SmbFile SmbFile;
typedef struct SmbSharedFile SmbSharedFile;
typedef struct SmbCifsSession SmbCifsSession;
typedef struct SmbServerInfo SmbServerInfo;
typedef struct SmbRapServerInfo1 SmbRapServerInfo1;
typedef struct SmbFindFileBothDirectoryInfo SmbFindFileBothDirectoryInfo;
typedef struct SmbLock SmbLock;
typedef struct SmbLockList SmbLockList;
typedef struct SmbSlut SmbSlut;

#pragma incomplete SmbIdMap
#pragma incomplete SmbBuffer
#pragma incomplete SmbLockList

typedef int SMBCIFSWRITEFN(SmbCifsSession *cifs, void *buf, long n);
typedef int SMBCIFSACCEPTFN(SmbCifsSession *cifs, SMBCIFSWRITEFN **fnp);
typedef void SMBIDMAPAPPLYFN(void *magic, void *p);

struct SmbPeerInfo {
        ulong capabilities;
        ushort maxlen;
        uchar securitymode;
        ushort maxmpxcount;
        ushort maxnumbervcs;
        ulong maxbuffersize;
        ulong maxrawsize;
        ulong sessionkey;
        vlong utc;
        short tzoff;
        uchar encryptionkeylength;
        uchar *encryptionkey;
        char *oemdomainname;
};

struct SmbTransaction {
        struct {
                char *name;
                ulong tpcount;
                uchar *parameters;
                ulong pcount;
                ulong tdcount;
                uchar *data;
                ulong maxpcount;
                ulong maxdcount;
                ulong maxscount;
                ulong dcount;
                ushort scount;
                ushort *setup;
                ushort flags;
        } in;
        struct {
                ulong tpcount;
                ulong tdcount;
                SmbBuffer *parameters;
                SmbBuffer *data;
                ushort *setup;
        } out;
};

enum {
        SmbSessionNeedNegotiate,
        SmbSessionNeedSetup,
        SmbSessionEstablished,
};

struct SmbSession {
        NbSession *nbss;
        SmbCifsSession *cifss;
        uchar nextcommand;
        SmbBuffer *response;
        SmbPeerInfo peerinfo;
        Chalstate *cs;
        struct {
                char *accountname;      
                char *primarydomain;
                char *nativeos;
                char *nativelanman;
                ushort maxmpxcount;
                MSchapreply mschapreply;
        } client;
        SmbTransaction transaction;
        SmbIdMap *fidmap;
        SmbIdMap *tidmap;
        SmbIdMap *sidmap;
        int state;
        uchar errclass;
        ushort error;
        int tzoff;              // as passed to client during negotiation
        SmbService *serv;
};

typedef struct SmbHeader {
        uchar command;
        union {
                struct {
                        uchar errclass;
                        ushort error;
                };
                ulong status;
        };
        uchar flags;
        ushort flags2;
        union {
                struct {
                        ushort pidhigh;
                        uchar securitysignature[8];
                };
        };
        ushort tid;
        ushort pid;
        ushort uid;
        ushort mid;
        uchar wordcount;
} SmbHeader;

typedef enum SmbProcessResult {
        SmbProcessResultOk,
        SmbProcessResultUnimp,
        SmbProcessResultFormat,
        SmbProcessResultMisc,
        SmbProcessResultError,
        SmbProcessResultReply,
        SmbProcessResultDie,
} SmbProcessResult;

typedef SmbProcessResult SMBPROCESSFN(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *);
typedef struct SmbOpTableEntry SmbOpTableEntry;
struct SmbOpTableEntry {
        char *name;
        SMBPROCESSFN *process;
        int debug;
};

extern SmbOpTableEntry smboptable[256];

typedef struct SmbGlobals SmbGlobals;

extern SmbGlobals smbglobals;

struct SmbServerInfo {
        char *name;
        char *nativelanman;
        uchar vmaj, vmin;
        ulong stype;
        char *remark;
};

struct SmbGlobals {
        int maxreceive;
        int unicode;
        SmbServerInfo serverinfo;
        char *nativeos;
        char *primarydomain;
        NbName nbname;
        char *accountname;
        char *mailslotbrowse;
        char *pipelanman;
        int l2sectorsize;
        int l2allocationsize;
        int convertspace;
        struct {
                int fd;
                int print;
                int tids;
                int sids;
                int fids;
                int rap2;
                int find;
                int query;
                int sharedfiles;
                int sessions;
                int rep;
                int poolparanoia;
                int locks;
        } log;
};

struct SmbTree {
        long id;
        SmbService *serv;
};

struct SmbService {
        Ref;
        char *name;
        char *type;
        ushort stype;
        char *path;
        char *remark;
        SmbService *next;
};

extern SmbService *smbservices;

typedef struct SmbClient SmbClient;


typedef struct SmbTransactionMethod {
        int (*encodeprimary)(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p,
                SmbBuffer *ob, uchar *wordcount, ushort *bytecount, char **errmsgp);
        int (*encodesecondary)(SmbTransaction *t, SmbHeader *h, SmbBuffer *ob, char **errmsgp);
        int (*sendrequest)(void *magic, SmbBuffer *ob, char **errmsgp);
        int (*receiveintermediate)(void *magic, uchar *wordcountp, ushort *bytecountp, char **errmsgp);
        int (*receiveresponse)(void *magic, SmbBuffer *ib, char **errmsgp);
        int (*decoderesponse)(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp);
        int (*encoderesponse)(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p,
                SmbBuffer *ob, char **errmsgp);
        int (*sendresponse)(void *magic, SmbBuffer *ob, char **errmsgp);
} SmbTransactionMethod;

extern SmbTransactionMethod smbtransactionmethoddgram;

struct SmbSearch {
        long id;
        SmbTree *t;
        SmbDirCache *dc;
        Reprog *rep;
        ushort tid;
};

struct SmbFile {
        long id;
        SmbTree *t;             // tree this belongs to
        int fd;
        char *name;
        int p9mode;             // how it was opened
        int share;                      // additional sharing restictions added by this fid
        int ioallowed;
        SmbSharedFile *sf;
};

struct SmbSharedFile {
        ushort type;
        ulong dev;
        vlong path;
//      char *name;
        int share;                      // current share level
        int deleteonclose;
        SmbLockList *locklist;
};

struct SmbLock {
        vlong base;
        vlong limit;
        SmbSession *s;          // owning session
        ushort pid;             // owning pid
};

struct SmbCifsSession {
        int fd;
        void *magic;
};

struct SmbClient {
        SmbPeerInfo peerinfo;
        NbSession *nbss;
        SmbBuffer *b;
        ushort ipctid;
        ushort sharetid;
        SmbHeader protoh;
};

struct SmbRapServerInfo1 {
        char name[16];
        uchar vmaj;
        uchar vmin;
        ulong type;
        char *remark;
};

struct SmbFindFileBothDirectoryInfo {
        ulong fileindex;
        vlong creationtime;
        vlong lastaccesstime;
        vlong lastwritetime;
        vlong changetime;
        vlong endoffile;
        vlong allocationsize;
        ulong extfileattributes;
        char *filename;
};

enum {
        SMB_STRING_UNALIGNED = 1,
        SMB_STRING_UPCASE = 2,
        SMB_STRING_UNTERMINATED = 4,
        SMB_STRING_UNICODE = 8,
        SMB_STRING_ASCII = 16,
        SMB_STRING_REVPATH = 32,
        SMB_STRING_PATH = 64,
        SMB_STRING_CONVERT_MASK = SMB_STRING_PATH | SMB_STRING_REVPATH | SMB_STRING_UPCASE,
};

struct SmbDirCache {
        Dir *buf;
        long n;
        long i;
};

typedef struct SmbTrans2OpTableEntry SmbTrans2OpTableEntry;
typedef SmbProcessResult SMBTRANS2PROCESSFN(SmbSession *s, SmbHeader *h);
struct SmbTrans2OpTableEntry {
        char *name;
        SMBTRANS2PROCESSFN *process;
        int debug;
};
extern SmbTrans2OpTableEntry smbtrans2optable[];
extern int smbtrans2optablesize;

struct SmbSlut {
        char *name;
        int val;
};

extern SmbSlut smbopenmodeslut[];
extern SmbSlut smbsharemodeslut[];