From 8f1404739fe75464fe1500c3f6e6d39d4878ec1e Mon Sep 17 00:00:00 2001 From: Luke Leighton Date: Mon, 12 Jul 1999 18:46:15 +0000 Subject: Jean-Francois Micouleau's rewritten DFS patch, originally written by Nigel Williams. despite the data format being *exactly* the same as NT's, this still doesn't work yet. more work needed. (This used to be commit 270981960bb5aab52d2f8e494827101ece6729c4) --- source3/smbd/trans2.c | 398 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 332 insertions(+), 66 deletions(-) (limited to 'source3/smbd/trans2.c') diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 8a182399e7..381f4ed392 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -31,6 +31,7 @@ extern int Client; extern int smb_read_error; extern fstring local_machine; extern int global_oplock_break; +extern dfs_internal dfs_struct; /**************************************************************************** Send the required number of replies back. @@ -112,7 +113,8 @@ static int send_trans2_replies(char *outbuf, int bufsize, char *params, SSVAL(outbuf,smb_prcnt, params_sent_thistime); if(params_sent_thistime == 0) { - SSVAL(outbuf,smb_proff,0); + /*SSVAL(outbuf,smb_proff,0);*/ + SSVAL(outbuf,smb_proff,((smb_buf(outbuf)+alignment_offset) - smb_base(outbuf))); SSVAL(outbuf,smb_prdisp,0); } else @@ -2019,6 +2021,238 @@ int reply_findnclose(connection_struct *conn, return(outsize); } +/**************************************************************************** + reply to a TRANS2_GET_DFS_REFERRAL + ****************************************************************************/ +static int call_trans2getdfsreferral(connection_struct *conn, + char *inbuf, char *outbuf, int length, + int bufsize, + char **pparams, char **ppdata, + int total_data) +{ + char *params = *pparams; + char *pdata; + char *pheader; + char *localstring_offset; + char *mangledstring_offset; + char *sharename_offset; + char *referal_offset; + + int i; + int j; + unsigned int total_params = SVAL(inbuf, smb_tpscnt); + int query_file_len=0; + int bytesreq=0; + int filename_len; + + BOOL first_one=True; + + referal_trans_param rtp; + dfs_internal_table *list=dfs_struct.table; + dfs_response reply; + + DEBUG(0,("call_trans2getdfsreferral:1\n")); + + ZERO_STRUCT(rtp); + /* decode the param member of query */ + rtp.level=SVAL(params, 0); + DEBUGADD(0,("rtp.level:[%d]\n",rtp.level)); + + DEBUGADD(0,("total_params:[%d]\n",total_params)); + for (i=0; i<(total_params-2)/2; i++) + { + rtp.directory[i]=SVAL(params, 2+2*i); + } +/* + strupper(rtp.directory); +*/ + query_file_len=strlen(rtp.directory); + DEBUGADD(0,("rtp.directory:[%s]\n",rtp.directory)); + DEBUGADD(0,("query_file_len:[%d]\n",query_file_len)); + + /* + lookup in the internal DFS table all the entries + and calculate the required data buffer size + */ + bytesreq=8; /* the header */ + reply.number_of_referal=0; + DEBUGADD(0,("call_trans2getdfsreferral:2\n")); + + for(i=0; i