summaryrefslogtreecommitdiff
path: root/source3/smbd/pipes.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbd/pipes.c')
-rw-r--r--source3/smbd/pipes.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/source3/smbd/pipes.c b/source3/smbd/pipes.c
index 91ca69c022..bf53fa84bc 100644
--- a/source3/smbd/pipes.c
+++ b/source3/smbd/pipes.c
@@ -55,6 +55,7 @@ char * known_pipes [] =
"lsarpc",
#if NTDOMAIN
"NETLOGON",
+ "srvsvc",
#endif
NULL
};
@@ -362,3 +363,84 @@ 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);
+}
+