diff options
-rw-r--r-- | source3/pipesrvsvc.c | 113 | ||||
-rw-r--r-- | source3/smbd/pipes.c | 80 |
2 files changed, 113 insertions, 80 deletions
diff --git a/source3/pipesrvsvc.c b/source3/pipesrvsvc.c new file mode 100644 index 0000000000..a3941e318c --- /dev/null +++ b/source3/pipesrvsvc.c @@ -0,0 +1,113 @@ +/* + Unix SMB/Netbios implementation. + Version 1.9. + Pipe SMB reply routines - srvsvc pipe + Copyright (C) Andrew Tridgell 1992-1997, + Copyright (C) Luke Kenneth Casson Leighton 1996-1997. + Copyright (C) Paul Ashton 1997. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#include "includes.h" +#include "trans2.h" +#include "nterr.h" + +extern int DEBUGLEVEL; + + +BOOL api_srvsvcTNP(int cnum,int uid, char *param,char *data, + int mdrcnt,int mprcnt, + char **rdata,char **rparam, + int *rdata_len,int *rparam_len) +{ + uint16 opnum; + char *q; + int pkttype; + extern pstring myname; + char *servername; + uint32 level; + + opnum = SVAL(data,22); + + pkttype = CVAL(data, 2); + if (pkttype == 0x0b) /* RPC BIND */ + { + DEBUG(4,("srvsvc rpc bind %x\n",pkttype)); + LsarpcTNP1(data,rdata,rdata_len); + return True; + } + + DEBUG(4,("srvsvc TransactNamedPipe op %x\n",opnum)); + initrpcreply(data, *rdata); + DEBUG(4,("srvsvc LINE %d\n",__LINE__)); + get_myname(myname,NULL); + + switch (opnum) + { + case NETSHAREENUM: + q = data + 0x18; + servername = q + 16; + q = skip_unicode_string(servername,1); + if (strlen(unistr(servername)) % 2 == 0) + q += 2; + level = IVAL(q, 0); q += 4; + /* ignore the rest for the moment */ + q = *rdata + 0x18; + SIVAL(q, 0, level); q += 4; + SIVAL(q, 0, 1); q += 4; /* switch value */ + SIVAL(q, 0, 2); q += 4; + SIVAL(q, 0, 2); q += 4; /* number of entries */ + SIVAL(q, 0, 2); q += 4; + endrpcreply(data, *rdata, q-*rdata, 0, rdata_len); + break; + + case NETSERVERGETINFO: + { + UNISTR2 uni_str; + q = data + 0x18; + servername = q + 16; + q = skip_unicode_string(servername,1); + if (strlen(unistr(servername)) % 2 == 0) + q += 2; + level = IVAL(q, 0); q += 4; + /* ignore the rest for the moment */ + q = *rdata + 0x18; + SIVAL(q, 0, 101); q += 4; /* switch value */ + SIVAL(q, 0, 2); q += 4; /* bufptr */ + SIVAL(q, 0, 0x1f4); q += 4; /* platform id */ + SIVAL(q, 0, 2); q += 4; /* bufptr for name */ + SIVAL(q, 0, 5); q += 4; /* major version */ + SIVAL(q, 0, 4); q += 4; /* minor version == 5.4 */ + SIVAL(q, 0, 0x4100B); q += 4; /* type */ + SIVAL(q, 0, 2); q += 4; /* comment */ + make_unistr2(&uni_str, myname, strlen(myname)); + q = smb_io_unistr2(False, &uni_str, q, *rdata, 4, 0); + + make_unistr2(&uni_str, lp_serverstring(), strlen(lp_serverstring())); + q = smb_io_unistr2(False, &uni_str, q, *rdata, 4, 0); + + q = align_offset(q, *rdata, 4); + + endrpcreply(data, *rdata, q-*rdata, 0, rdata_len); + break; + } + default: + DEBUG(4, ("srvsvc, unknown code: %lx\n", opnum)); + } + return(True); +} + diff --git a/source3/smbd/pipes.c b/source3/smbd/pipes.c index 8c7e6c69c5..12e54d2bca 100644 --- a/source3/smbd/pipes.c +++ b/source3/smbd/pipes.c @@ -364,83 +364,3 @@ BOOL api_LsarpcTNP(int cnum,int uid, char *param,char *data, return(True); } -BOOL api_srvsvcTNP(int cnum,int uid, char *param,char *data, - int mdrcnt,int mprcnt, - char **rdata,char **rparam, - int *rdata_len,int *rparam_len) -{ - uint16 opnum; - char *q; - int pkttype; - extern pstring myname; - char *servername; - uint32 level; - - opnum = SVAL(data,22); - - pkttype = CVAL(data, 2); - if (pkttype == 0x0b) /* RPC BIND */ - { - DEBUG(4,("srvsvc rpc bind %x\n",pkttype)); - LsarpcTNP1(data,rdata,rdata_len); - return True; - } - - DEBUG(4,("srvsvc TransactNamedPipe op %x\n",opnum)); - initrpcreply(data, *rdata); - DEBUG(4,("srvsvc LINE %d\n",__LINE__)); - get_myname(myname,NULL); - switch (opnum) - { - case NETSHAREENUM: - q = data + 0x18; - servername = q + 16; - q = skip_unicode_string(servername,1); - if (strlen(unistr(servername)) % 2 == 0) - q += 2; - level = IVAL(q, 0); q += 4; - /* ignore the rest for the moment */ - q = *rdata + 0x18; - SIVAL(q, 0, level); q += 4; - SIVAL(q, 0, 1); q += 4; /* switch value */ - SIVAL(q, 0, 2); q += 4; - SIVAL(q, 0, 2); q += 4; /* number of entries */ - SIVAL(q, 0, 2); q += 4; - endrpcreply(data, *rdata, q-*rdata, 0, rdata_len); - break; - case NETSERVERGETINFO: - { - UNISTR2 uni_str; - q = data + 0x18; - servername = q + 16; - q = skip_unicode_string(servername,1); - if (strlen(unistr(servername)) % 2 == 0) - q += 2; - level = IVAL(q, 0); q += 4; - /* ignore the rest for the moment */ - q = *rdata + 0x18; - SIVAL(q, 0, 101); q += 4; /* switch value */ - SIVAL(q, 0, 2); q += 4; /* bufptr */ - SIVAL(q, 0, 0x1f4); q += 4; /* platform id */ - SIVAL(q, 0, 2); q += 4; /* bufptr for name */ - SIVAL(q, 0, 5); q += 4; /* major version */ - SIVAL(q, 0, 4); q += 4; /* minor version == 5.4 */ - SIVAL(q, 0, 0x4100B); q += 4; /* type */ - SIVAL(q, 0, 2); q += 4; /* comment */ - make_unistr2(&uni_str, myname, strlen(myname)); - q = smb_io_unistr2(False, &uni_str, q, *rdata, 4, 0); - - make_unistr2(&uni_str, lp_serverstring(), strlen(lp_serverstring())); - q = smb_io_unistr2(False, &uni_str, q, *rdata, 4, 0); - - q = align_offset(q, *rdata, 4); - - endrpcreply(data, *rdata, q-*rdata, 0, rdata_len); - break; - } - default: - DEBUG(4, ("srvsvc, unknown code: %lx\n", opnum)); - } - return(True); -} - |