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... */
Bits16 = 0xFFFF, /* max Unicode value Windows supports */
};
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 { /* 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's capabilities */
int support; /* support bits */
int flags; /* SMB flags that we will send in the next packet */
int flags2; /* SMB flags 2 that we will send in the next packet */
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 */
int request; /* request cmd no (for debug) */
int flags2; /* flags2 received with this packet */
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;
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 */
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;
/* auth.c */
extern void autherr(void);
extern Auth *getauth(char *name, char *windom, char *keyp, int secmode, uchar *chal, int len);
extern int macsign(Pkt *p, int seq);
/* cifs.c */
extern Session *cifsdial(char *host, char *called, char *sysname);
extern void cifsclose(Session *s);
extern Pkt *cifshdr(Session *s, Share *sp, int cmd);
extern void pbytes(Pkt *p);
extern int cifsrpc(Pkt *p);
extern int CIFSnegotiate(Session *s, long *svrtime, char *domain, int domlen, char *cname, int cnamlen);
extern int CIFSsession(Session *s);
extern int CIFStreeconnect(Session *s, char *cname, char *tree, Share *sp);
extern int CIFSlogoff(Session *s);
extern int CIFStreedisconnect(Session *s, Share *sp);
extern int CIFSdeletefile(Session *s, Share *sp, char *name);
extern int CIFSdeletedirectory(Session *s, Share *sp, char *name);
extern int CIFScreatedirectory(Session *s, Share *sp, char *name);
extern int CIFSrename(Session *s, Share *sp, char *old, char *new);
extern int CIFS_NT_opencreate(Session *s, Share *sp, char *name, int flags, int options, int attrs, int access, int share, int action, int *result, FInfo *fi);
extern int CIFS_SMB_opencreate(Session *s, Share *sp, char *name, int access, int attrs, int action, int *result);
extern vlong CIFSwrite(Session *s, Share *sp, int fh, uvlong off, void *buf, vlong n);
extern vlong CIFSread(Session *s, Share *sp, int fh, uvlong off, void *buf, vlong n, vlong minlen);
extern int CIFSflush(Session *s, Share *sp, int fh);
extern int CIFSclose(Session *s, Share *sp, int fh);
extern int CIFSfindclose2(Session *s, Share *sp, int sh);
extern int CIFSecho(Session *s);
extern int CIFSsetinfo(Session *s, Share *sp, char *path, FInfo *fip);
/* dfs.c */
extern int dfscacheinfo(Fmt *f);
extern char *trimshare(char *s);
extern char *mapfile(char *opath);
extern int mapshare(char *path, Share **osp);
extern int redirect(Session *s, Share *sp, char *path);
/* fs.c */
extern int shareinfo(Fmt *f);
extern int openfileinfo(Fmt *f);
extern int conninfo(Fmt *f);
extern int sessioninfo(Fmt *f);
extern int dfsrootinfo(Fmt *f);
extern int userinfo(Fmt *f);
extern int groupinfo(Fmt *f);
extern int domaininfo(Fmt *f);
extern int workstationinfo(Fmt *f);
/* info.c */
extern int walkinfo(char *name);
extern int numinfo(void);
extern int dirgeninfo(int slot, Dir *d);
extern int makeinfo(int path);
extern int readinfo(int path, char *buf, int len, int off);
extern void freeinfo(int path);
/* main.c */
extern void setup(void);
extern int filetableinfo(Fmt *f);
extern Qid mkqid(char *s, int is_dir, long vers, int subtype, long path);
extern int rdonly(Session *s, Share *sp, char *path, int rdonly);
extern void usage(void);
extern void dmpkey(char *s, void *v, int n);
extern void main(int argc, char **argv);
/* trans.c */
extern int RAPshareenum(Session *s, Share *sp, Share **ent);
extern int RAPshareinfo(Session *s, Share *sp, char *share, Shareinfo2 *si2p);
extern int RAPsessionenum(Session *s, Share *sp, Sessinfo **sip);
extern int RAPgroupenum(Session *s, Share *sp, Namelist **nlp);
extern int RAPgroupusers(Session *s, Share *sp, char *group, Namelist **nlp);
extern int RAPuserenum(Session *s, Share *sp, Namelist **nlp);
extern int RAPuserenum2(Session *s, Share *sp, Namelist **nlp);
extern int RAPuserinfo(Session *s, Share *sp, char *user, Userinfo *uip);
extern int RAPServerenum2(Session *s, Share *sp, char *workgroup, int type, int *more, Serverinfo **si);
extern int RAPServerenum3(Session *s, Share *sp, char *workgroup, int type, int last, Serverinfo *si);
extern int RAPFileenum2(Session *s, Share *sp, char *user, char *path, Fileinfo **fip);
/* trans2.c */
extern int T2findfirst(Session *s, Share *sp, int slots, char *path, int *got, long *resume, FInfo *fip);
extern int T2findnext(Session *s, Share *sp, int slots, char *path, int *got, long *resume, FInfo *fip, int sh);
extern int T2queryall(Session *s, Share *sp, char *path, FInfo *fip);
extern int T2querystandard(Session *s, Share *sp, char *path, FInfo *fip);
extern int T2setpathinfo(Session *s, Share *sp, char *path, FInfo *fip);
extern int T2setfilelength(Session *s, Share *sp, int fh, FInfo *fip);
extern int T2fsvolumeinfo(Session *s, Share *sp, long *created, long *serialno, char *label, int labellen);
extern int T2fssizeinfo(Session *s, Share *sp, uvlong *total, uvlong *unused);
extern int T2getdfsreferral(Session *s, Share *sp, char *path, int *gflags, int *used, Refer *re, int nent);
extern int T2fsdeviceinfo(Session *s, Share *sp, int *type, int *flags);
/* transnt.c */
extern int TNTquerysecurity(Session *s, Share *sp, int fh, char **usid, char **gsid);