diff options
Diffstat (limited to 'source3')
104 files changed, 0 insertions, 41410 deletions
diff --git a/source3/browserd/browserd.c b/source3/browserd/browserd.c deleted file mode 100644 index dde62721ea..0000000000 --- a/source3/browserd/browserd.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Main SMB server routines - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -fstring pipe_name; - -pstring servicesf = CONFIGFILE; -extern pstring debugf; -extern BOOL append_log; - -/************************************************************************* - initialise an msrpc service - *************************************************************************/ -void msrpc_service_init(void) -{ -} - -/**************************************************************************** - reload the services file - **************************************************************************/ -BOOL reload_services(BOOL test) -{ - BOOL ret; - - if (lp_loaded()) { - pstring fname; - pstrcpy(fname,lp_configfile()); - if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) { - pstrcpy(servicesf,fname); - test = False; - } - } - - reopen_logs(); - - if (test && !lp_file_list_changed()) - return(True); - - lp_killunused(NULL); - - ret = lp_load(servicesf,False,False,True); - - /* perhaps the config filename is now set */ - if (!test) - reload_services(True); - - reopen_logs(); - - load_interfaces(); - - return(ret); -} - -/**************************************************************************** - main program -****************************************************************************/ - int main(int argc,char *argv[]) -{ -#ifdef HAVE_SET_AUTH_PARAMETERS - set_auth_parameters(argc,argv); -#endif - -#ifdef HAVE_SETLUID - /* needed for SecureWare on SCO */ - setluid(0); -#endif - - append_log = True; - - TimeInit(); - - setup_logging(argv[0],False); - fstrcpy(pipe_name, "browser"); - slprintf(debugf, sizeof(debugf), "%s/log.%s", LOGFILEBASE, pipe_name); - add_msrpc_command_processor( pipe_name, argv[0], api_brs_rpc ); - - return msrpc_main(argc, argv); -} diff --git a/source3/client/clientutil.c b/source3/client/clientutil.c deleted file mode 100644 index efa836dede..0000000000 --- a/source3/client/clientutil.c +++ /dev/null @@ -1,975 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB client - Copyright (C) Andrew Tridgell 1994-1998 - - 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. -*/ - -#define NO_SYSLOG - -#include "includes.h" - -#ifndef REGISTER -#define REGISTER 0 -#endif - -pstring service=""; -pstring desthost=""; -extern pstring global_myname; -pstring password = ""; -pstring smb_login_passwd = ""; -pstring username=""; -pstring workgroup=WORKGROUP; -BOOL got_pass = False; -BOOL no_pass = False; -BOOL connect_as_printer = False; -BOOL connect_as_ipc = False; - -char cryptkey[8]; -BOOL doencrypt=False; - -extern pstring user_socket_options; - -/* 30 second timeout on most commands */ -#define CLIENT_TIMEOUT (30*1000) -#define SHORT_TIMEOUT (5*1000) - -int name_type = 0x20; - -int max_protocol = PROTOCOL_NT1; - -BOOL readbraw_supported = False; -BOOL writebraw_supported = False; - -extern int DEBUGLEVEL; - -uint16 cnum = 0; -uint16 pid = 0; -uint16 vuid = 0; -uint16 mid = 0; - -int max_xmit = BUFFER_SIZE; - -BOOL have_ip = False; - -extern struct in_addr dest_ip; - -extern int Protocol; - -extern int Client; - - -/**************************************************************************** -setup basics in a outgoing packet -****************************************************************************/ -void cli_setup_pkt(char *outbuf) -{ - SSVAL(outbuf,smb_pid,pid); - SSVAL(outbuf,smb_uid,vuid); - SSVAL(outbuf,smb_mid,mid); - if (Protocol > PROTOCOL_COREPLUS) - { - SCVAL(outbuf,smb_flg,0x8); - SSVAL(outbuf,smb_flg2,0x1); - } -} - -/**************************************************************************** -call a remote api -****************************************************************************/ -BOOL cli_call_api(char *pipe_name, int pipe_name_len, - int prcnt,int drcnt, int srcnt, - int mprcnt,int mdrcnt, - int *rprcnt,int *rdrcnt, - char *param,char *data, uint16 *setup, - char **rparam,char **rdata) -{ - static char *inbuf=NULL; - static char *outbuf=NULL; - - if (!inbuf) inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN); - if (!outbuf) outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN); - - if(!inbuf || !outbuf) { - DEBUG(0,("cli_call_api: malloc fail.\n")); - return False; - } - - if (pipe_name_len == 0) pipe_name_len = strlen(pipe_name); - - cli_send_trans_request(outbuf,SMBtrans,pipe_name, pipe_name_len, 0,0, - data, param, setup, - drcnt, prcnt, srcnt, - mdrcnt, mprcnt, 0); - - return (cli_receive_trans_response(inbuf,SMBtrans, - rdrcnt,rprcnt, - rdata,rparam)); -} - - -/**************************************************************************** - receive a SMB trans or trans2 response allocating the necessary memory - ****************************************************************************/ -BOOL cli_receive_trans_response(char *inbuf,int trans, - int *data_len,int *param_len, - char **data,char **param) -{ - int total_data=0; - int total_param=0; - int this_data,this_param; - - *data_len = *param_len = 0; - - client_receive_smb(Client,inbuf,CLIENT_TIMEOUT); - show_msg(inbuf); - - /* sanity check */ - if (CVAL(inbuf,smb_com) != trans) - { - DEBUG(0,("Expected %s response, got command 0x%02x\n", - trans==SMBtrans?"SMBtrans":"SMBtrans2", CVAL(inbuf,smb_com))); - return(False); - } - if (CVAL(inbuf,smb_rcls) != 0) - return(False); - - /* parse out the lengths */ - total_data = SVAL(inbuf,smb_tdrcnt); - total_param = SVAL(inbuf,smb_tprcnt); - - /* allocate it */ - *data = Realloc(*data,total_data); - *param = Realloc(*param,total_param); - - if((total_data && !data) || (total_param && !param)) { - DEBUG(0,("cli_receive_trans_response: Realloc fail !\n")); - return(False); - } - - while (1) - { - this_data = SVAL(inbuf,smb_drcnt); - this_param = SVAL(inbuf,smb_prcnt); - if (this_data) - memcpy(*data + SVAL(inbuf,smb_drdisp), - smb_base(inbuf) + SVAL(inbuf,smb_droff), - this_data); - if (this_param) - memcpy(*param + SVAL(inbuf,smb_prdisp), - smb_base(inbuf) + SVAL(inbuf,smb_proff), - this_param); - *data_len += this_data; - *param_len += this_param; - - /* parse out the total lengths again - they can shrink! */ - total_data = SVAL(inbuf,smb_tdrcnt); - total_param = SVAL(inbuf,smb_tprcnt); - - if (total_data <= *data_len && total_param <= *param_len) - break; - - client_receive_smb(Client,inbuf,CLIENT_TIMEOUT); - show_msg(inbuf); - - /* sanity check */ - if (CVAL(inbuf,smb_com) != trans) - { - DEBUG(0,("Expected %s response, got command 0x%02x\n", - trans==SMBtrans?"SMBtrans":"SMBtrans2", CVAL(inbuf,smb_com))); - return(False); - } - if (CVAL(inbuf,smb_rcls) != 0) - return(False); - } - - return(True); -} - - - -/**************************************************************************** - send a SMB trans or trans2 request - ****************************************************************************/ -BOOL cli_send_trans_request(char *outbuf,int trans, - char *name,int namelen, int fid,int flags, - char *data,char *param,uint16 *setup, - int ldata,int lparam,int lsetup, - int mdata,int mparam,int msetup) -{ - int i; - int this_ldata,this_lparam; - int tot_data=0,tot_param=0; - char *outdata,*outparam; - pstring inbuf; - char *p; - - this_lparam = MIN(lparam,max_xmit - (500+lsetup*SIZEOFWORD)); /* hack */ - this_ldata = MIN(ldata,max_xmit - (500+lsetup*SIZEOFWORD+this_lparam)); - - bzero(outbuf,smb_size); - set_message(outbuf,14+lsetup,0,True); - CVAL(outbuf,smb_com) = trans; - SSVAL(outbuf,smb_tid,cnum); - cli_setup_pkt(outbuf); - - outparam = smb_buf(outbuf)+(trans==SMBtrans ? namelen+1 : 3); - outdata = outparam+this_lparam; - - /* primary request */ - SSVAL(outbuf,smb_tpscnt,lparam); /* tpscnt */ - SSVAL(outbuf,smb_tdscnt,ldata); /* tdscnt */ - SSVAL(outbuf,smb_mprcnt,mparam); /* mprcnt */ - SSVAL(outbuf,smb_mdrcnt,mdata); /* mdrcnt */ - SCVAL(outbuf,smb_msrcnt,msetup); /* msrcnt */ - SSVAL(outbuf,smb_flags,flags); /* flags */ - SIVAL(outbuf,smb_timeout,0); /* timeout */ - SSVAL(outbuf,smb_pscnt,this_lparam); /* pscnt */ - SSVAL(outbuf,smb_psoff,smb_offset(outparam,outbuf)); /* psoff */ - SSVAL(outbuf,smb_dscnt,this_ldata); /* dscnt */ - SSVAL(outbuf,smb_dsoff,smb_offset(outdata,outbuf)); /* dsoff */ - SCVAL(outbuf,smb_suwcnt,lsetup); /* suwcnt */ - for (i=0;i<lsetup;i++) /* setup[] */ - SSVAL(outbuf,smb_setup+i*SIZEOFWORD,setup[i]); - p = smb_buf(outbuf); - if (trans==SMBtrans) - memcpy(p,name, namelen+1); /* name[] */ - else - { - *p++ = 0; /* put in a null smb_name */ - *p++ = 'D'; *p++ = ' '; /* this was added because OS/2 does it */ - } - if (this_lparam) /* param[] */ - memcpy(outparam,param,this_lparam); - if (this_ldata) /* data[] */ - memcpy(outdata,data,this_ldata); - set_message(outbuf,14+lsetup, /* wcnt, bcc */ - PTR_DIFF(outdata+this_ldata,smb_buf(outbuf)),False); - - show_msg(outbuf); - send_smb(Client,outbuf); - - if (this_ldata < ldata || this_lparam < lparam) - { - /* receive interim response */ - if (!client_receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0) - { - DEBUG(0,("%s request failed (%s)\n", - trans==SMBtrans?"SMBtrans":"SMBtrans2", smb_errstr(inbuf))); - return(False); - } - - tot_data = this_ldata; - tot_param = this_lparam; - - while (tot_data < ldata || tot_param < lparam) - { - this_lparam = MIN(lparam-tot_param,max_xmit - 500); /* hack */ - this_ldata = MIN(ldata-tot_data,max_xmit - (500+this_lparam)); - - set_message(outbuf,trans==SMBtrans?8:9,0,True); - CVAL(outbuf,smb_com) = trans==SMBtrans ? SMBtranss : SMBtranss2; - - outparam = smb_buf(outbuf); - outdata = outparam+this_lparam; - - /* secondary request */ - SSVAL(outbuf,smb_tpscnt,lparam); /* tpscnt */ - SSVAL(outbuf,smb_tdscnt,ldata); /* tdscnt */ - SSVAL(outbuf,smb_spscnt,this_lparam); /* pscnt */ - SSVAL(outbuf,smb_spsoff,smb_offset(outparam,outbuf)); /* psoff */ - SSVAL(outbuf,smb_spsdisp,tot_param); /* psdisp */ - SSVAL(outbuf,smb_sdscnt,this_ldata); /* dscnt */ - SSVAL(outbuf,smb_sdsoff,smb_offset(outdata,outbuf)); /* dsoff */ - SSVAL(outbuf,smb_sdsdisp,tot_data); /* dsdisp */ - if (trans==SMBtrans2) - SSVAL(outbuf,smb_sfid,fid); /* fid */ - if (this_lparam) /* param[] */ - memcpy(outparam,param,this_lparam); - if (this_ldata) /* data[] */ - memcpy(outdata,data,this_ldata); - set_message(outbuf,trans==SMBtrans?8:9, /* wcnt, bcc */ - PTR_DIFF(outdata+this_ldata,smb_buf(outbuf)),False); - - show_msg(outbuf); - send_smb(Client,outbuf); - - tot_data += this_ldata; - tot_param += this_lparam; - } - } - - return(True); -} - - -/**************************************************************************** -send a session request -****************************************************************************/ -BOOL cli_send_session_request(char *inbuf,char *outbuf) -{ - fstring dest; - char *p; - int len = 4; - /* send a session request (RFC 8002) */ - - fstrcpy(dest,desthost); - p = strchr(dest,'.'); - if (p) *p = 0; - - /* put in the destination name */ - p = outbuf+len; - name_mangle(dest,p,name_type); /* 0x20 is the SMB server NetBIOS type. */ - len += name_len(p); - - /* and my name */ - p = outbuf+len; - name_mangle(global_myname,p,0); - len += name_len(p); - - /* setup the packet length */ - _smb_setlen(outbuf,len); - CVAL(outbuf,0) = 0x81; - -#ifdef WITH_SSL -retry: -#endif /* WITH_SSL */ - - send_smb(Client,outbuf); - DEBUG(5,("Sent session request\n")); - - client_receive_smb(Client,inbuf,CLIENT_TIMEOUT); - - if (CVAL(inbuf,0) == 0x84) /* C. Hoch 9/14/95 Start */ - { - /* For information, here is the response structure. - * We do the byte-twiddling to for portability. - struct RetargetResponse{ - unsigned char type; - unsigned char flags; - int16 length; - int32 ip_addr; - int16 port; - }; - */ - extern int Client; - int port = (CVAL(inbuf,8)<<8)+CVAL(inbuf,9); - /* SESSION RETARGET */ - putip((char *)&dest_ip,inbuf+4); - - close_sockets(); - Client = open_socket_out(SOCK_STREAM, &dest_ip, port, LONG_CONNECT_TIMEOUT); - if (Client == -1) - return False; - - DEBUG(3,("Retargeted\n")); - - set_socket_options(Client,user_socket_options); - - /* Try again */ - return cli_send_session_request(inbuf,outbuf); - } /* C. Hoch 9/14/95 End */ - -#ifdef WITH_SSL - if(CVAL(inbuf,0) == 0x83 && CVAL(inbuf,4) == 0x8e) { /* use ssl */ - fprintf(stderr, "Making secure connection\n"); - if(!sslutil_fd_is_ssl(Client)){ - if(sslutil_connect(Client) == 0) - goto retry; - } - } -#endif - - if (CVAL(inbuf,0) != 0x82) - { - int ecode = CVAL(inbuf,4); - DEBUG(0,("Session request failed (%d,%d) with myname=%s destname=%s\n", - CVAL(inbuf,0),ecode,global_myname,desthost)); - switch (ecode) - { - case 0x80: - DEBUG(0,("Not listening on called name\n")); - DEBUG(0,("Try to connect to another name (instead of %s)\n",desthost)); - DEBUG(0,("You may find the -I option useful for this\n")); - break; - case 0x81: - DEBUG(0,("Not listening for calling name\n")); - DEBUG(0,("Try to connect as another name (instead of %s)\n",global_myname)); - DEBUG(0,("You may find the -n option useful for this\n")); - break; - case 0x82: - DEBUG(0,("Called name not present\n")); - DEBUG(0,("Try to connect to another name (instead of %s)\n",desthost)); - DEBUG(0,("You may find the -I option useful for this\n")); - break; - case 0x83: - DEBUG(0,("Called name present, but insufficient resources\n")); - DEBUG(0,("Perhaps you should try again later?\n")); - break; - default: - DEBUG(0,("Unspecified error 0x%X\n",ecode)); - DEBUG(0,("Your server software is being unfriendly\n")); - break; - } - return(False); - } - return(True); -} - -static struct { - int prot; - char *name; -} prots[] = { - {PROTOCOL_CORE,"PC NETWORK PROGRAM 1.0"}, - {PROTOCOL_COREPLUS,"MICROSOFT NETWORKS 1.03"}, - {PROTOCOL_LANMAN1,"MICROSOFT NETWORKS 3.0"}, - {PROTOCOL_LANMAN1,"LANMAN1.0"}, - {PROTOCOL_LANMAN2,"LM1.2X002"}, - {PROTOCOL_LANMAN2,"Samba"}, - {PROTOCOL_NT1,"NT LM 0.12"}, - {PROTOCOL_NT1,"NT LANMAN 1.0"}, - {-1,NULL} -}; - - -/**************************************************************************** -send a login command. -****************************************************************************/ -BOOL cli_send_login(char *inbuf,char *outbuf,BOOL start_session,BOOL use_setup, struct connection_options *options) -{ - BOOL was_null = (!inbuf && !outbuf); - time_t servertime = 0; - extern int serverzone; - int crypt_len=0; - char *pass = NULL; - uchar enc_ntpass[24]; - int ntpasslen = 0; - pstring dev; - char *p; - int numprots; - int tries=0; - struct connection_options opt; - - bzero(&opt, sizeof(opt)); - - if (was_null) - { - inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN); - outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN); - - if(!inbuf || !outbuf) { - DEBUG(0,("cli_send_login: malloc fail !\n")); - return False; - } - } - - if (strstr(service,"IPC$")) connect_as_ipc = True; - - pstrcpy(dev,"A:"); - if (connect_as_printer) - pstrcpy(dev,"LPT1:"); - if (connect_as_ipc) - pstrcpy(dev,"IPC"); - - - if (start_session && !cli_send_session_request(inbuf,outbuf)) - { - if (was_null) - { - free(inbuf); - free(outbuf); - } - return(False); - } - - bzero(outbuf,smb_size); - - /* setup the protocol strings */ - { - int plength; - - for (plength=0,numprots=0; - prots[numprots].name && prots[numprots].prot<=max_protocol; - numprots++) - plength += strlen(prots[numprots].name)+2; - - set_message(outbuf,0,plength,True); - - p = smb_buf(outbuf); - for (numprots=0; - prots[numprots].name && prots[numprots].prot<=max_protocol; - numprots++) - { - *p++ = 2; - pstrcpy(p,prots[numprots].name); - p += strlen(p) + 1; - } - } - - CVAL(outbuf,smb_com) = SMBnegprot; - cli_setup_pkt(outbuf); - - CVAL(smb_buf(outbuf),0) = 2; - - send_smb(Client,outbuf); - client_receive_smb(Client,inbuf,CLIENT_TIMEOUT); - - show_msg(inbuf); - - if (CVAL(inbuf,smb_rcls) != 0 || ((int)SVAL(inbuf,smb_vwv0) >= numprots)) - { - DEBUG(0,("SMBnegprot failed. myname=%s destname=%s - %s \n", - global_myname,desthost,smb_errstr(inbuf))); - if (was_null) - { - free(inbuf); - free(outbuf); - } - return(False); - } - - opt.protocol = Protocol = prots[SVAL(inbuf,smb_vwv0)].prot; - - - if (Protocol < PROTOCOL_LANMAN1) { - /* no extra params */ - } else if (Protocol < PROTOCOL_NT1) { - opt.sec_mode = SVAL(inbuf,smb_vwv1); - opt.max_xmit = max_xmit = SVAL(inbuf,smb_vwv2); - opt.sesskey = IVAL(inbuf,smb_vwv6); - opt.serverzone = serverzone = SVALS(inbuf,smb_vwv10)*60; - /* this time is converted to GMT by make_unix_date */ - servertime = make_unix_date(inbuf+smb_vwv8); - if (Protocol >= PROTOCOL_COREPLUS) { - opt.rawmode = SVAL(inbuf,smb_vwv5); - readbraw_supported = ((SVAL(inbuf,smb_vwv5) & 0x1) != 0); - writebraw_supported = ((SVAL(inbuf,smb_vwv5) & 0x2) != 0); - } - crypt_len = smb_buflen(inbuf); - memcpy(cryptkey,smb_buf(inbuf),8); - DEBUG(3,("max mux %d\n",SVAL(inbuf,smb_vwv3))); - opt.max_vcs = SVAL(inbuf,smb_vwv4); - DEBUG(3,("max vcs %d\n",opt.max_vcs)); - DEBUG(3,("max blk %d\n",SVAL(inbuf,smb_vwv5))); - } else { - /* NT protocol */ - opt.sec_mode = CVAL(inbuf,smb_vwv1); - opt.max_xmit = max_xmit = IVAL(inbuf,smb_vwv3+1); - opt.sesskey = IVAL(inbuf,smb_vwv7+1); - opt.serverzone = SVALS(inbuf,smb_vwv15+1)*60; - /* this time arrives in real GMT */ - servertime = interpret_long_date(inbuf+smb_vwv11+1); - crypt_len = CVAL(inbuf,smb_vwv16+1); - memcpy(cryptkey,smb_buf(inbuf),8); - if (IVAL(inbuf,smb_vwv9+1) & 1) - readbraw_supported = writebraw_supported = True; - DEBUG(3,("max mux %d\n",SVAL(inbuf,smb_vwv1+1))); - opt.max_vcs = SVAL(inbuf,smb_vwv2+1); - DEBUG(3,("max vcs %d\n",opt.max_vcs)); - DEBUG(3,("max raw %d\n",IVAL(inbuf,smb_vwv5+1))); - DEBUG(3,("capabilities 0x%x\n",IVAL(inbuf,smb_vwv9+1))); - } - - DEBUG(3,("Sec mode %d\n",SVAL(inbuf,smb_vwv1))); - DEBUG(3,("max xmt %d\n",max_xmit)); - DEBUG(3,("Got %d byte crypt key\n",crypt_len)); - DEBUG(3,("Chose protocol [%s]\n",prots[SVAL(inbuf,smb_vwv0)].name)); - - doencrypt = ((opt.sec_mode & 2) != 0); - - if (servertime) { - static BOOL done_time = False; - if (!done_time) { - DEBUG(1,("Server time is %sTimezone is UTC%+02.1f\n", - asctime(LocalTime(&servertime)), - -(double)(serverzone/3600.0))); - done_time = True; - } - } - - get_pass: - - if (got_pass) - pass = password; - else - pass = (char *)getpass("Password: "); - - if(!pass) - pass = ""; - - pstrcpy(smb_login_passwd, pass); - - /* use a blank username for the 2nd try with a blank password */ - if (tries++ && !*pass) - *username = 0; - - if (Protocol >= PROTOCOL_LANMAN1 && use_setup) - { - fstring pword; - int passlen = strlen(pass)+1; - fstrcpy(pword,pass); - - if (doencrypt && *pass) - { - DEBUG(3,("Using encrypted passwords\n")); - passlen = 24; - SMBencrypt((uchar *)pass,(uchar *)cryptkey,(uchar *)pword); - ntpasslen = 24; - SMBNTencrypt((uchar *)pass,(uchar *)cryptkey,enc_ntpass); - } - - /* if in share level security then don't send a password now */ - if (!(opt.sec_mode & 1)) {fstrcpy(pword, "");passlen=1;} - - /* send a session setup command */ - bzero(outbuf,smb_size); - - if (Protocol < PROTOCOL_NT1) - { - set_message(outbuf,10,1 + strlen(username) + passlen,True); - CVAL(outbuf,smb_com) = SMBsesssetupX; - cli_setup_pkt(outbuf); - - CVAL(outbuf,smb_vwv0) = 0xFF; - SSVAL(outbuf,smb_vwv2,max_xmit); - SSVAL(outbuf,smb_vwv3,2); - SSVAL(outbuf,smb_vwv4,opt.max_vcs-1); - SIVAL(outbuf,smb_vwv5,opt.sesskey); - SSVAL(outbuf,smb_vwv7,passlen); - p = smb_buf(outbuf); - memcpy(p,pword,passlen); - p += passlen; - pstrcpy(p,username); - } - else - { - if (!doencrypt) passlen--; - /* for Win95 */ - set_message(outbuf,13,0,True); - CVAL(outbuf,smb_com) = SMBsesssetupX; - cli_setup_pkt(outbuf); - - CVAL(outbuf,smb_vwv0) = 0xFF; - SSVAL(outbuf,smb_vwv2,BUFFER_SIZE); - SSVAL(outbuf,smb_vwv3,2); - SSVAL(outbuf,smb_vwv4,getpid()); - SIVAL(outbuf,smb_vwv5,opt.sesskey); - SSVAL(outbuf,smb_vwv7,passlen); - SSVAL(outbuf,smb_vwv8,doencrypt ? ntpasslen : 0); - p = smb_buf(outbuf); - memcpy(p,pword,passlen); p += SVAL(outbuf,smb_vwv7); - if(doencrypt) - memcpy(p,enc_ntpass,ntpasslen); p += SVAL(outbuf,smb_vwv8); - pstrcpy(p,username);p = skip_string(p,1); - pstrcpy(p,workgroup);p = skip_string(p,1); - pstrcpy(p,"Unix");p = skip_string(p,1); - pstrcpy(p,"Samba");p = skip_string(p,1); - set_message(outbuf,13,PTR_DIFF(p,smb_buf(outbuf)),False); - } - - send_smb(Client,outbuf); - client_receive_smb(Client,inbuf,CLIENT_TIMEOUT); - - show_msg(inbuf); - - if (CVAL(inbuf,smb_rcls) != 0) - { - if (! *pass && - ((CVAL(inbuf,smb_rcls) == ERRDOS && - SVAL(inbuf,smb_err) == ERRnoaccess) || - (CVAL(inbuf,smb_rcls) == ERRSRV && - SVAL(inbuf,smb_err) == ERRbadpw))) - { - got_pass = False; - DEBUG(3,("resending login\n")); - if (! no_pass) - goto get_pass; - } - - DEBUG(0,("Session setup failed for username=%s myname=%s destname=%s %s\n", - username,global_myname,desthost,smb_errstr(inbuf))); - DEBUG(0,("You might find the -U, -W or -n options useful\n")); - DEBUG(0,("Sometimes you have to use `-n USERNAME' (particularly with OS/2)\n")); - DEBUG(0,("Some servers also insist on uppercase-only passwords\n")); - if (was_null) - { - free(inbuf); - free(outbuf); - } - return(False); - } - - if (Protocol >= PROTOCOL_NT1) - { - char *domain,*os,*lanman; - p = smb_buf(inbuf); - os = p; - lanman = skip_string(os,1); - domain = skip_string(lanman,1); - if (*domain || *os || *lanman) - DEBUG(1,("Domain=[%s] OS=[%s] Server=[%s]\n",domain,os,lanman)); - } - - /* use the returned uid from now on */ - if (SVAL(inbuf,smb_uid) != vuid) - DEBUG(3,("Server gave us a UID of %d. We gave %d\n", - SVAL(inbuf,smb_uid),(int)vuid)); - opt.server_vuid = vuid = SVAL(inbuf,smb_uid); - } - - if (opt.sec_mode & 1) { - if (SVAL(inbuf, smb_vwv2) & 1) - DEBUG(1,("connected as guest ")); - DEBUG(1,("security=user\n")); - } else { - DEBUG(1,("security=share\n")); - } - - /* now we've got a connection - send a tcon message */ - bzero(outbuf,smb_size); - - if (strncmp(service,"\\\\",2) != 0) - { - DEBUG(0,("\nWarning: Your service name doesn't start with \\\\. This is probably incorrect.\n")); - DEBUG(0,("Perhaps try replacing each \\ with \\\\ on the command line?\n\n")); - } - - - again2: - - { - int passlen = strlen(pass)+1; - fstring pword; - fstrcpy(pword,pass); - - if (doencrypt && *pass) { - passlen=24; - SMBencrypt((uchar *)pass,(uchar *)cryptkey,(uchar *)pword); - } - - /* if in user level security then don't send a password now */ - if ((opt.sec_mode & 1)) { - fstrcpy(pword, ""); passlen=1; - } - - if (Protocol <= PROTOCOL_COREPLUS) { - set_message(outbuf,0,6 + strlen(service) + passlen + strlen(dev),True); - CVAL(outbuf,smb_com) = SMBtcon; - cli_setup_pkt(outbuf); - - p = smb_buf(outbuf); - *p++ = 0x04; - pstrcpy(p, service); - p = skip_string(p,1); - *p++ = 0x04; - memcpy(p,pword,passlen); - p += passlen; - *p++ = 0x04; - pstrcpy(p, dev); - } - else { - set_message(outbuf,4,2 + strlen(service) + passlen + strlen(dev),True); - CVAL(outbuf,smb_com) = SMBtconX; - cli_setup_pkt(outbuf); - - SSVAL(outbuf,smb_vwv0,0xFF); - SSVAL(outbuf,smb_vwv3,passlen); - - p = smb_buf(outbuf); - memcpy(p,pword,passlen); - p += passlen; - pstrcpy(p,service); - p = skip_string(p,1); - pstrcpy(p,dev); - } - } - - send_smb(Client,outbuf); - client_receive_smb(Client,inbuf,CLIENT_TIMEOUT); - - /* trying again with a blank password */ - if (CVAL(inbuf,smb_rcls) != 0 && - (int)strlen(pass) > 0 && - !doencrypt && - Protocol >= PROTOCOL_LANMAN1) - { - DEBUG(2,("first SMBtconX failed, trying again. %s\n",smb_errstr(inbuf))); - pstrcpy(pass,""); - goto again2; - } - - if (CVAL(inbuf,smb_rcls) != 0) - { - DEBUG(0,("SMBtconX failed. %s\n",smb_errstr(inbuf))); - DEBUG(0,("Perhaps you are using the wrong sharename, username or password?\n")); - DEBUG(0,("Some servers insist that these be in uppercase\n")); - if (was_null) - { - free(inbuf); - free(outbuf); - } - return(False); - } - - - if (Protocol <= PROTOCOL_COREPLUS) { - max_xmit = SVAL(inbuf,smb_vwv0); - - cnum = SVAL(inbuf,smb_vwv1); - } - else { - max_xmit = MIN(max_xmit,BUFFER_SIZE-4); - if (max_xmit <= 0) - max_xmit = BUFFER_SIZE - 4; - - cnum = SVAL(inbuf,smb_tid); - } - opt.max_xmit = max_xmit; - opt.tid = cnum; - - DEBUG(3,("Connected with cnum=%d max_xmit=%d\n",cnum,max_xmit)); - - if (was_null) - { - free(inbuf); - free(outbuf); - } - - if (options != NULL) - { - *options = opt; - } - - return True; -} - - -/**************************************************************************** -send a logout command -****************************************************************************/ -void cli_send_logout(char *dum_in, char *dum_out) -{ - pstring inbuf,outbuf; - - DEBUG(5,("cli_send_logout\n")); - - bzero(outbuf,smb_size); - set_message(outbuf,0,0,True); - CVAL(outbuf,smb_com) = SMBtdis; - SSVAL(outbuf,smb_tid,cnum); - cli_setup_pkt(outbuf); - - send_smb(Client,outbuf); - client_receive_smb(Client,inbuf,SHORT_TIMEOUT); - - if (CVAL(inbuf,smb_rcls) != 0) - { - DEBUG(0,("SMBtdis failed %s\n",smb_errstr(inbuf))); - } - - -#ifdef STATS - stats_report(); -#endif - exit(0); -} - - -/**************************************************************************** -open the client sockets -****************************************************************************/ -BOOL cli_open_sockets(int port ) -{ - static int last_port; - char *host; - pstring service2; - extern int Client; - - if (port == 0) port=last_port; - last_port=port; - - strupper(service); - - if (*desthost) - { - host = desthost; - } - else - { - pstrcpy(service2,service); - host = strtok(service2,"\\/"); - if (!host) { - DEBUG(0,("Badly formed host name\n")); - return(False); - } - pstrcpy(desthost,host); - } - - if (!(*global_myname)) { - get_myname(global_myname,NULL); - } - strupper(global_myname); - - DEBUG(3,("Opening sockets\n")); - - if (!have_ip) - { - if(!resolve_name( host, &dest_ip, 0x20)) - { - DEBUG(0,("cli_open_sockets: Unknown host %s.\n",host)); - return False; - } - } - - Client = open_socket_out(SOCK_STREAM, &dest_ip, port, LONG_CONNECT_TIMEOUT); - if (Client == -1) - return False; - - DEBUG(3,("Connected\n")); - - set_socket_options(Client,user_socket_options); - - return True; -} - -/**************************************************************************** -close and open the connection again -****************************************************************************/ -BOOL cli_reopen_connection(char *inbuf,char *outbuf) -{ - static int open_count=0; - - open_count++; - - if (open_count>5) return(False); - - DEBUG(1,("Trying to re-open connection\n")); - - set_message(outbuf,0,0,True); - SCVAL(outbuf,smb_com,SMBtdis); - SSVAL(outbuf,smb_tid,cnum); - cli_setup_pkt(outbuf); - - send_smb(Client,outbuf); - client_receive_smb(Client,inbuf,SHORT_TIMEOUT); - - close_sockets(); - if (!cli_open_sockets(0)) return(False); - - return(cli_send_login(inbuf,outbuf,True,True,NULL)); -} - diff --git a/source3/groupdb/aliasldap.c b/source3/groupdb/aliasldap.c deleted file mode 100644 index 1e9a72a9d4..0000000000 --- a/source3/groupdb/aliasldap.c +++ /dev/null @@ -1,425 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2.0. - LDAP local group database for SAMBA - Copyright (C) Matthew Chapman 1998 - - 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" - -#ifdef WITH_LDAP - -#include <lber.h> -#include <ldap.h> - -extern int DEBUGLEVEL; - -/* Internal state */ -extern LDAP *ldap_struct; -extern LDAPMessage *ldap_results; -extern LDAPMessage *ldap_entry; - -/* Static structure filled for requests */ -static LOCAL_GRP localgrp; - - -/*************************************************************** - Get group and membership information. - ****************************************************************/ - -static LOCAL_GRP *ldapalias_getgrp(LOCAL_GRP *group, - LOCAL_GRP_MEMBER **members, int *num_membs) -{ - fstring temp; - char **values; - LOCAL_GRP_MEMBER *memblist; - char *value, *sep; - int i; - - if(!ldap_entry) - return NULL; - - if(!ldap_get_attribute("cn", group->name)) { - DEBUG(0, ("Missing cn\n")); - return NULL; } - - DEBUG(2,("Retrieving alias [%s]\n", group->name)); - - if(ldap_get_attribute("rid", temp)) { - group->rid = strtol(temp, NULL, 16); - } else { - DEBUG(0, ("Missing rid\n")); - return NULL; - } - - if(!ldap_get_attribute("description", group->comment)) - group->comment[0] = 0; - - if(!members || !num_membs) { - ldap_entry = ldap_next_entry(ldap_struct, ldap_entry); - return group; - } - - if(values = ldap_get_values(ldap_struct, ldap_entry, "member")) { - - *num_membs = i = ldap_count_values(values); - *members = memblist = malloc(i * sizeof(LOCAL_GRP_MEMBER)); - - do { - value = values[--i]; - - if(!(sep = strchr(value, ','))) { - DEBUG(0, ("Malformed alias member\n")); - return NULL; - } - *(sep++) = 0; - fstrcpy(memblist[i].name, value); - - if(!(value = strchr(sep, ','))) { - DEBUG(0, ("Malformed alias member\n")); - return NULL; - } - *(value++) = 0; - string_to_sid(&memblist[i].sid, sep); - - if((memblist[i].sid_use = atoi(value)) - >= SID_NAME_UNKNOWN) - DEBUG(0, ("Invalid SID use in alias")); - - } while(i > 0); - - ldap_value_free(values); - - } else { - *num_membs = 0; - *members = NULL; - } - - return group; -} - - -/************************************************************************ - Queues the necessary modifications to save a LOCAL_GRP structure - ************************************************************************/ - -static void ldapalias_grpmods(LOCAL_GRP *group, LDAPMod ***mods, int operation) -{ - fstring temp; - - *mods = NULL; - - if(operation == LDAP_MOD_ADD) { /* immutable attributes */ - ldap_make_mod(mods, LDAP_MOD_ADD, "objectClass", "sambaAlias"); - ldap_make_mod(mods, LDAP_MOD_ADD, "cn", group->name); - - slprintf(temp, sizeof(temp)-1, "%x", group->rid); - ldap_make_mod(mods, LDAP_MOD_ADD, "rid", temp); - } - - ldap_make_mod(mods, operation, "description", group->comment); -} - - -/************************************************************************ - Create a alias member entry - ************************************************************************/ - -static BOOL ldapalias_memmods(DOM_SID *user_sid, LDAPMod ***mods, - int operation) -{ - pstring member; - pstring sid_str; - fstring name; - uint8 type; - - if (lookup_sid(user_sid, name, &type)) - return (False); - sid_to_string(sid_str, user_sid); - - slprintf(member, sizeof(member)-1, "%s,%s,%d", name, sid_str, type); - - *mods = NULL; - ldap_make_mod(mods, operation, "member", member); - return True; -} - - -/*************************************************************** - Begin/end smbgrp enumeration. - ****************************************************************/ - -static void *ldapalias_enumfirst(BOOL update) -{ - if (lp_server_role() == ROLE_DOMAIN_NONE) - return NULL; - - if (!ldap_connect()) - return NULL; - - ldap_search_for("objectClass=sambaAlias"); - - return ldap_struct; -} - -static void ldapalias_enumclose(void *vp) -{ - ldap_disconnect(); -} - - -/************************************************************************* - Save/restore the current position in a query - *************************************************************************/ - -static SMB_BIG_UINT ldapalias_getdbpos(void *vp) -{ - return (SMB_BIG_UINT)((ulong)ldap_entry); -} - -static BOOL ldapalias_setdbpos(void *vp, SMB_BIG_UINT tok) -{ - ldap_entry = (LDAPMessage *)((ulong)tok); - return (True); -} - - -/************************************************************************* - Return limited smb_passwd information, and group membership. - *************************************************************************/ - -static LOCAL_GRP *ldapalias_getgrpbynam(const char *name, - LOCAL_GRP_MEMBER **members, int *num_membs) -{ - fstring filter; - LOCAL_GRP *ret; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(cn=%s)(objectClass=sambaAlias))", name); - ldap_search_for(filter); - - ret = ldapalias_getgrp(&localgrp, members, num_membs); - - ldap_disconnect(); - return ret; -} - -static LOCAL_GRP *ldapalias_getgrpbygid(gid_t grp_id, - LOCAL_GRP_MEMBER **members, int *num_membs) -{ - fstring filter; - LOCAL_GRP *ret; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(gidNumber=%d)(objectClass=sambaAlias))", grp_id); - ldap_search_for(filter); - ret = ldapalias_getgrp(&localgrp, members, num_membs); - - ldap_disconnect(); - return ret; -} - -static LOCAL_GRP *ldapalias_getgrpbyrid(uint32 grp_rid, - LOCAL_GRP_MEMBER **members, int *num_membs) -{ - fstring filter; - LOCAL_GRP *ret; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(rid=%x)(objectClass=sambaAlias))", grp_rid); - ldap_search_for(filter); - ret = ldapalias_getgrp(&localgrp, members, num_membs); - - ldap_disconnect(); - return ret; -} - -static LOCAL_GRP *ldapalias_getcurrentgrp(void *vp, - LOCAL_GRP_MEMBER **members, int *num_membs) -{ - return ldapalias_getgrp(&localgrp, members, num_membs); -} - - -/************************************************************************* - Add/modify/delete aliases. - *************************************************************************/ - -static BOOL ldapalias_addgrp(LOCAL_GRP *group) -{ - LDAPMod **mods; - - if (!ldap_allocaterid(&group->rid)) - { - DEBUG(0,("RID generation failed\n")); - return (False); - } - - ldapalias_grpmods(group, &mods, LDAP_MOD_ADD); - return ldap_makemods("cn", group->name, mods, True); -} - -static BOOL ldapalias_modgrp(LOCAL_GRP *group) -{ - LDAPMod **mods; - - ldapalias_grpmods(group, &mods, LDAP_MOD_REPLACE); - return ldap_makemods("cn", group->name, mods, False); -} - -static BOOL ldapalias_delgrp(uint32 grp_rid) -{ - fstring filter; - char *dn; - int err; - - if (!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(rid=%x)(objectClass=sambaAlias))", grp_rid); - ldap_search_for(filter); - - if (!ldap_entry || !(dn = ldap_get_dn(ldap_struct, ldap_entry))) - { - ldap_disconnect(); - return (False); - } - - err = ldap_delete_s(ldap_struct, dn); - free(dn); - ldap_disconnect(); - - if (err != LDAP_SUCCESS) - { - DEBUG(0, ("delete: %s\n", ldap_err2string(err))); - return (False); - } - - return True; -} - - -/************************************************************************* - Add users to/remove users from aliases. - *************************************************************************/ - -static BOOL ldapalias_addmem(uint32 grp_rid, DOM_SID *user_sid) -{ - LDAPMod **mods; - fstring rid_str; - - slprintf(rid_str, sizeof(rid_str)-1, "%x", grp_rid); - - if(!ldapalias_memmods(user_sid, &mods, LDAP_MOD_ADD)) - return (False); - - return ldap_makemods("rid", rid_str, mods, False); -} - -static BOOL ldapalias_delmem(uint32 grp_rid, DOM_SID *user_sid) -{ - LDAPMod **mods; - fstring rid_str; - - slprintf(rid_str, sizeof(rid_str)-1, "%x", grp_rid); - - if(!ldapalias_memmods(user_sid, &mods, LDAP_MOD_DELETE)) - return (False); - - return ldap_makemods("rid", rid_str, mods, False); -} - - -/************************************************************************* - Return aliases that a user is in. - *************************************************************************/ - -static BOOL ldapalias_getusergroups(const char *name, LOCAL_GRP **groups, - int *num_grps) -{ - LOCAL_GRP *grouplist; - fstring filter; - int i; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(pstring)-1, - "(&(member=%s,*)(objectclass=sambaAlias))", name); - ldap_search_for(filter); - - *num_grps = i = ldap_count_entries(ldap_struct, ldap_results); - - if(!i) { - *groups = NULL; - ldap_disconnect(); - return (True); - } - - *groups = grouplist = malloc(i * sizeof(LOCAL_GRP)); - do { - i--; - } while(ldapalias_getgrp(&grouplist[i], NULL, NULL) && (i > 0)); - - ldap_disconnect(); - return (True); -} - - -static struct aliasdb_ops ldapalias_ops = -{ - ldapalias_enumfirst, - ldapalias_enumclose, - ldapalias_getdbpos, - ldapalias_setdbpos, - - ldapalias_getgrpbynam, - ldapalias_getgrpbygid, - ldapalias_getgrpbyrid, - ldapalias_getcurrentgrp, - - ldapalias_addgrp, - ldapalias_modgrp, - ldapalias_delgrp, - - ldapalias_addmem, - ldapalias_delmem, - - ldapalias_getusergroups -}; - -struct aliasdb_ops *ldap_initialise_alias_db(void) -{ - return &ldapalias_ops; -} - -#else - void aliasldap_dummy_function(void); - void aliasldap_dummy_function(void) { } /* stop some compilers complaining */ -#endif - diff --git a/source3/groupdb/aliasunix.c b/source3/groupdb/aliasunix.c deleted file mode 100644 index c53692f328..0000000000 --- a/source3/groupdb/aliasunix.c +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup - * Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995. - * - * 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" - -#ifdef USE_SMBUNIX_DB - -extern int DEBUGLEVEL; - - -extern DOM_SID global_sam_sid; -extern fstring global_sam_name; - -struct unix_entries -{ - struct group *grps; - int num_grps; - int grp_idx; -}; - -/*************************************************************** - Start to enumerate the alspasswd list. Returns a void pointer - to ensure no modification outside this module. -****************************************************************/ - -static void *startalsunixpwent(BOOL update) -{ - struct unix_entries *grps; - grps = (struct unix_entries*)malloc(sizeof(struct unix_entries)); - - if (grps == NULL) - { - return NULL; - } - - if (!get_unix_grps(&grps->num_grps, &grps->grps)) - { - free(grps); - return NULL; - } - - grps->grp_idx = 0; - - return (void*)grps; -} - -/*************************************************************** - End enumeration of the alspasswd list. -****************************************************************/ - -static void endalsunixpwent(void *vp) -{ - struct unix_entries *grps = (struct unix_entries *)vp; - - if (grps != NULL) - { - free_unix_grps(grps->num_grps, grps->grps); - free(vp); - } -} - -/************************************************************************* - Return the current position in the alspasswd list as an SMB_BIG_UINT. - This must be treated as an opaque token. -*************************************************************************/ -static SMB_BIG_UINT getalsunixpwpos(void *vp) -{ - return (SMB_BIG_UINT)0; -} - -/************************************************************************* - Set the current position in the alspasswd list from an SMB_BIG_UINT. - This must be treated as an opaque token. -*************************************************************************/ -static BOOL setalsunixpwpos(void *vp, SMB_BIG_UINT tok) -{ - return False; -} - -/************************************************************************* - Routine to return the next entry in the smbdomainalias list. - *************************************************************************/ -BOOL get_unixalias_members(struct group *grp, - int *num_mem, LOCAL_GRP_MEMBER **members) -{ - int i; - char *unix_name; - - if (num_mem == NULL || members == NULL) - { - return False; - } - - (*num_mem) = 0; - (*members) = NULL; - - for (i = 0; (unix_name = grp->gr_mem[i]) != NULL; i++) - { - fstring name; - DOM_NAME_MAP gmep; - LOCAL_GRP_MEMBER *mem; - - fstrcpy(name, unix_name); - - if (!lookupsmbpwnam (name, &gmep) && - !lookupsmbgrpnam(name, &gmep)) - { - continue; - } - - if (!sid_front_equal(&global_sam_sid, &gmep.sid)) - { - DEBUG(0,("alias database: could not resolve name %s (wrong Domain SID)\n", - name)); - continue; - } - - (*num_mem)++; - (*members) = Realloc((*members), (*num_mem) * sizeof(LOCAL_GRP_MEMBER)); - if ((*members) == NULL) - { - DEBUG(0,("get_unixalias_members: could not realloc LOCAL_GRP_MEMBERs\n")); - return False; - } - - mem = &(*members)[(*num_mem)-1]; - slprintf(mem->name, sizeof(mem->name)-1, "%s\\%s", - gmep.nt_domain, gmep.nt_name); - sid_copy(&mem->sid, &gmep.sid); - mem->sid_use = gmep.type; - - DEBUG(10,("get_unixalias_members: adding alias %s\n", - mem->name)); - } - return True; -} - -/************************************************************************* - Routine to return the next entry in the domain alias list. - - when we are a PDC or BDC, then unix groups that are explicitly NOT mapped - to aliases are treated as DOMAIN groups (see groupunix.c). - - when we are a member of a domain (not a PDC or BDC) then unix groups - that are explicitly NOT mapped to aliases (map_alias_gid) are treated - as LOCAL groups. - - the reasoning behind this is to make it as simple as possible (not an easy - task) for people to set up a domain-aware samba server, in each role that - the server can take. - - *************************************************************************/ -static LOCAL_GRP *getalsunixpwent(void *vp, LOCAL_GRP_MEMBER **mem, int *num_mem) -{ - /* Static buffers we will return. */ - static LOCAL_GRP gp_buf; - struct group unix_grp; - struct unix_entries *grps = (struct unix_entries *)vp; - - if (lp_server_role() == ROLE_DOMAIN_NONE) - { - /* - * no domain role, no domain aliases (or domain groups, - * but that's dealt with by groupdb...). - */ - - return NULL; - } - - aldb_init_als(&gp_buf); - - /* get array of unix names + gids. this function does NOT - get a copy of the unix group members - */ - - /* cycle through unix groups */ - for (; grps->grp_idx < grps->num_grps; grps->grp_idx++) - { - DOM_NAME_MAP gmep; - fstring sid_str; - - memcpy(&unix_grp, &grps->grps[grps->grp_idx], sizeof(unix_grp)); - - DEBUG(10,("getgrpunixpwent: enum unix group entry %s\n", - unix_grp.gr_name)); - - if (!lookupsmbgrpgid(unix_grp.gr_gid, &gmep)) - { - continue; - } - - sid_to_string(sid_str, &gmep.sid); - DEBUG(10,("group %s found, sid %s type %d\n", - gmep.nt_name, sid_str, gmep.type)); - - if (gmep.type != SID_NAME_ALIAS) - { - continue; - } - - sid_split_rid(&gmep.sid, &gp_buf.rid); - if (!sid_equal(&global_sam_sid, &gmep.sid)) - { - continue; - } - - fstrcpy(gp_buf.name, gmep.nt_name); - break; - } - - if (grps->grp_idx >= grps->num_grps) - { - return NULL; - } - - /* get the user's domain aliases. there are a maximum of 32 */ - - if (mem != NULL && num_mem != NULL) - { - (*mem) = NULL; - (*num_mem) = 0; - - memcpy(&unix_grp, getgrgid(unix_grp.gr_gid), sizeof(unix_grp)); - get_unixalias_members(&unix_grp, num_mem, mem); - } - - { - pstring linebuf; - make_alias_line(linebuf, sizeof(linebuf), &gp_buf, mem, num_mem); - DEBUG(10,("line: '%s'\n", linebuf)); - } - - grps->grp_idx++; /* advance so next enum gets next entry */ - return &gp_buf; -} - -/************************************************************************ - Routine to add an entry to the alspasswd file. -*************************************************************************/ - -static BOOL add_alsunixgrp_entry(LOCAL_GRP *newals) -{ - DEBUG(0, ("add_alsunixgrp_entry: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to search the alspasswd file for an entry matching the aliasname. - and then modify its alias entry. -************************************************************************/ - -static BOOL mod_alsunixgrp_entry(LOCAL_GRP* als) -{ - DEBUG(0, ("mod_alsunixgrp_entry: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to search the grppasswd file for an entry matching the rid. - and then delete it. -************************************************************************/ - -static BOOL del_alsunixgrp_entry(uint32 rid) -{ - DEBUG(0, ("del_alsunixgrp_entry: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to add a member to an entry to the grppasswd file. -*************************************************************************/ -static BOOL add_alsunixgrp_member(uint32 rid, DOM_SID *member_sid) -{ - DEBUG(0, ("add_alsunixgrp_member: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to delete a member from an entry to the grppasswd file. -*************************************************************************/ -static BOOL del_alsunixgrp_member(uint32 rid, DOM_SID *member_sid) -{ - DEBUG(0, ("del_alsunixgrp_member: NOT IMPLEMENTED\n")); - return False; -} - - -static struct aliasdb_ops unix_ops = -{ - startalsunixpwent, - endalsunixpwent, - getalsunixpwpos, - setalsunixpwpos, - - iterate_getaliasntnam, /* In aliasdb.c */ - iterate_getaliasgid, /* In aliasdb.c */ - iterate_getaliasrid, /* In aliasdb.c */ - getalsunixpwent, - - add_alsunixgrp_entry, - mod_alsunixgrp_entry, - del_alsunixgrp_entry, - - add_alsunixgrp_member, - del_alsunixgrp_member, - - iterate_getuseraliasntnam /* in aliasdb.c */ -}; - -struct aliasdb_ops *unix_initialise_alias_db(void) -{ - return &unix_ops; -} - -#else - /* Do *NOT* make this function static. It breaks the compile on gcc. JRA */ - void unix_alspass_dummy_function(void) { } /* stop some compilers complaining */ -#endif /* USE_SMBPASS_DB */ diff --git a/source3/groupdb/builtindb.c b/source3/groupdb/builtindb.c deleted file mode 100644 index 3b09b6225d..0000000000 --- a/source3/groupdb/builtindb.c +++ /dev/null @@ -1,475 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Pasesword and authentication handling - Copyright (C) Jeremy Allison 1996-1998 - Copyright (C) Luke Kenneth Caseson Leighton 1996-1998 - - 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 Mases Ave, Cambridge, MA 02139, USA. -*/ - -#include "includes.h" -#include "nterr.h" - -extern int DEBUGLEVEL; - -extern fstring global_sam_name; -extern DOM_SID global_sam_sid; - -/* - * NOTE. All these functions are abstracted into a structure - * that points to the correct function for the selected database. JRA. - */ - -static struct aliasdb_ops *bidb_ops = NULL; - -/*************************************************************** - Initialise the builtin db operations. -***************************************************************/ - -BOOL initialise_builtin_db(void) -{ - if (bidb_ops) - { - return True; - } - -#ifdef WITH_NISPLUS - bidb_ops = nisplus_initialise_builtin_db(); -#elif defined(WITH_LDAP) - bidb_ops = ldap_initialise_builtin_db(); -#elif defined(USE_SMBUNIX_DB) - bidb_ops = unix_initialise_builtin_db(); -#endif - - return (bidb_ops != NULL); -} - -/* - * Functions that return/manipulate a LOCAL_GRP. - */ - -/************************************************************************ - Utility function to search builtin database by gid: the LOCAL_GRP - structure does not have a gid member, so we have to convert here - from gid to builtin rid. -*************************************************************************/ -LOCAL_GRP *iterate_getbuiltingid(gid_t gid, LOCAL_GRP_MEMBER **mem, int *num_mem) -{ - DOM_NAME_MAP gmep; - uint32 rid; - if (!lookupsmbgrpgid(gid, &gmep)) - { - DEBUG(0,("iterate_getbuiltingid: gid %d does not map to one of our Domain's Aliases\n", gid)); - return NULL; - } - - if (gmep.type != SID_NAME_ALIAS ) - { - DEBUG(0,("iterate_getbuiltingid: gid %d does not map to one of our Domain's Aliases\n", gid)); - return NULL; - } - - sid_split_rid(&gmep.sid, &rid); - if (!sid_equal(&gmep.sid, &global_sam_sid)) - { - DEBUG(0,("iterate_getbuiltingid: gid %d does not map into our Domain SID\n", gid)); - return NULL; - } - - return iterate_getbuiltinrid(rid, mem, num_mem); -} - -/************************************************************************ - Utility function to search builtin database by rid. use this if your database - does not have search facilities. -*************************************************************************/ -LOCAL_GRP *iterate_getbuiltinrid(uint32 rid, LOCAL_GRP_MEMBER **mem, int *num_mem) -{ - LOCAL_GRP *blt = NULL; - void *fp = NULL; - - DEBUG(10, ("search by rid: 0x%x\n", rid)); - - /* Open the builtin database file - not for update. */ - fp = startbuiltinent(False); - - if (fp == NULL) - { - DEBUG(0, ("unable to open builtin database.\n")); - return NULL; - } - - while ((blt = getbuiltinent(fp, mem, num_mem)) != NULL && blt->rid != rid) - { - DEBUG(10,("iterate: %s 0x%x", blt->name, blt->rid)); - } - - if (blt != NULL) - { - DEBUG(10, ("found builtin %s by rid: 0x%x\n", blt->name, rid)); - } - - endbuiltinent(fp); - return blt; -} - -/************************************************************************ - Utility function to search builtin database by name. use this if your database - does not have search facilities. -*************************************************************************/ -LOCAL_GRP *iterate_getbuiltinntnam(const char *name, LOCAL_GRP_MEMBER **mem, int *num_mem) -{ - LOCAL_GRP *blt = NULL; - void *fp = NULL; - - DEBUG(10, ("search by name: %s\n", name)); - - /* Open the builtin database file - not for update. */ - fp = startbuiltinent(False); - - if (fp == NULL) - { - DEBUG(0, ("unable to open builtin database.\n")); - return NULL; - } - - while ((blt = getbuiltinent(fp, mem, num_mem)) != NULL && !strequal(blt->name, name)) - { - } - - if (blt != NULL) - { - DEBUG(10, ("found by name: %s\n", name)); - } - - endbuiltinent(fp); - return blt; -} - -/************************************************************************* - Routine to return the next entry in the smbdomainbuiltin list. - *************************************************************************/ -BOOL add_domain_builtin(LOCAL_GRP **blts, int *num_blts, LOCAL_GRP *blt) -{ - if (blts == NULL || num_blts == NULL || blt == NULL) - { - return False; - } - - (*blts) = Realloc((*blts), ((*num_blts)+1) * sizeof(LOCAL_GRP)); - if ((*blts) == NULL) - { - return False; - } - - DEBUG(10,("adding builtin %s(%s)\n", blt->name, blt->comment)); - - fstrcpy((*blts)[(*num_blts)].name , blt->name); - fstrcpy((*blts)[(*num_blts)].comment, blt->comment); - (*blts)[(*num_blts)].rid = blt->rid; - - (*num_blts)++; - - return True; -} - -/************************************************************************* - checks to see if a user is a member of a domain builtin - *************************************************************************/ -static BOOL user_is_member(const char *user_name, LOCAL_GRP_MEMBER *mem, int num_mem) -{ - int i; - pstring name; - slprintf(name, sizeof(name)-1, "%s\\%s", global_sam_name, user_name); - - for (i = 0; i < num_mem; i++) - { - DEBUG(10,("searching against user %s...\n", mem[i].name)); - if (strequal(mem[i].name, name)) - { - DEBUG(10,("searching for user %s: found\n", name)); - return True; - } - } - DEBUG(10,("searching for user %s: not found\n", name)); - return False; -} - -/************************************************************************* - gets an array of builtin aliases that a user is in. use this if your database - does not have search facilities - *************************************************************************/ -BOOL iterate_getuserbuiltinntnam(const char *user_name, LOCAL_GRP **blts, int *num_blts) -{ - LOCAL_GRP *blt = NULL; - LOCAL_GRP_MEMBER *mem = NULL; - int num_mem = 0; - void *fp = NULL; - - DEBUG(10, ("search for userbuiltin by name: %s\n", user_name)); - - if (user_name == NULL || blts == NULL || num_blts == NULL) - { - return False; - } - - (*blts) = NULL; - (*num_blts) = 0; - - /* Open the builtin database file - not for update. */ - fp = startbuiltinent(False); - - if (fp == NULL) - { - DEBUG(0, ("unable to open builtin database.\n")); - return False; - } - - /* iterate through all builtin aliases. search members for required user */ - while ((blt = getbuiltinent(fp, &mem, &num_mem)) != NULL) - { - DEBUG(5,("builtin name %s members: %d\n", blt->name, num_mem)); - if (num_mem != 0 && mem != NULL) - { - BOOL ret = True; - if (user_is_member(user_name, mem, num_mem)) - { - ret = add_domain_builtin(blts, num_blts, blt); - } - - free(mem); - mem = NULL; - num_mem = 0; - - if (!ret) - { - (*num_blts) = 0; - break; - } - } - } - - if ((*num_blts) != 0) - { - DEBUG(10, ("found %d user builtin aliases:\n", (*num_blts))); - } - - endbuiltinent(fp); - return True; -} - -/************************************************************************* - gets an array of builtin aliases that a user is in. use this if your database - does not have search facilities - *************************************************************************/ -BOOL enumdombuiltins(LOCAL_GRP **blts, int *num_blts) -{ - LOCAL_GRP *blt = NULL; - void *fp = NULL; - - DEBUG(10, ("enum user builtin aliases\n")); - - if (blts == NULL || num_blts == NULL) - { - return False; - } - - (*blts) = NULL; - (*num_blts) = 0; - - /* Open the builtin database file - not for update. */ - fp = startbuiltinent(False); - - if (fp == NULL) - { - DEBUG(0, ("unable to open builtin database.\n")); - return False; - } - - /* iterate through all builtin aliases. */ - while ((blt = getbuiltinent(fp, NULL, NULL)) != NULL) - { - if (!add_domain_builtin(blts, num_blts, blt)) - { - DEBUG(0,("unable to add builtin while enumerating\n")); - return False; - } - } - - if ((*num_blts) != 0) - { - DEBUG(10, ("found %d user builtin aliases:\n", (*num_blts))); - } - - endbuiltinent(fp); - return True; -} - -/*************************************************************** - Start to enumerate the builtin database list. Returns a void pointer - to ensure no modification outside this module. -****************************************************************/ - -void *startbuiltinent(BOOL update) -{ - return bidb_ops->startaliasent(update); -} - -/*************************************************************** - End enumeration of the builtin database list. -****************************************************************/ - -void endbuiltinent(void *vp) -{ - bidb_ops->endaliasent(vp); -} - -/************************************************************************* - Routine to return the next entry in the builtin database list. - *************************************************************************/ - -LOCAL_GRP *getbuiltinent(void *vp, LOCAL_GRP_MEMBER **mem, int *num_mem) -{ - return bidb_ops->getaliasent(vp, mem, num_mem); -} - -/************************************************************************ - Routine to add an entry to the builtin database file. -*************************************************************************/ - -BOOL add_builtin_entry(LOCAL_GRP *newblt) -{ - return bidb_ops->add_alias_entry(newblt); -} - -/************************************************************************ - Routine to search the builtin database file for an entry matching the builtinname. - and then replace the entry. -************************************************************************/ - -BOOL mod_builtin_entry(LOCAL_GRP* blt) -{ - return bidb_ops->mod_alias_entry(blt); -} - -/************************************************************************ - Routine to add a member to an entry in the builtin database file. -*************************************************************************/ -BOOL add_builtin_member(uint32 rid, DOM_SID *member_sid) -{ - return bidb_ops->add_alias_member(rid, member_sid); -} - -/************************************************************************ - Routine to delete a member from an entry in the builtindatabase file. -*************************************************************************/ -BOOL del_builtin_member(uint32 rid, DOM_SID *member_sid) -{ - return bidb_ops->del_alias_member(rid, member_sid); -} - -/************************************************************************ - Routine to search builtin database by name. -*************************************************************************/ - -LOCAL_GRP *getbuiltinntnam(const char *name, LOCAL_GRP_MEMBER **mem, int *num_mem) -{ - return bidb_ops->getaliasntnam(name, mem, num_mem); -} - -/************************************************************************ - Routine to search builtin database by builtin rid. -*************************************************************************/ - -LOCAL_GRP *getbuiltinrid(uint32 builtin_rid, LOCAL_GRP_MEMBER **mem, int *num_mem) -{ - return bidb_ops->getaliasrid(builtin_rid, mem, num_mem); -} - -/************************************************************************ - Routine to search builtin database by gid. -*************************************************************************/ - -LOCAL_GRP *getbuiltingid(gid_t gid, LOCAL_GRP_MEMBER **mem, int *num_mem) -{ - return bidb_ops->getaliasgid(gid, mem, num_mem); -} - -/************************************************************************* - gets an array of builtin aliases that a user is in. - *************************************************************************/ -BOOL getuserbuiltinntnam(const char *user_name, LOCAL_GRP **blt, int *num_blts) -{ - return bidb_ops->getuseraliasntnam(user_name, blt, num_blts); -} - -/************************************************************* - initialises a LOCAL_GRP. - **************************************************************/ -void bidb_init_blt(LOCAL_GRP *blt) -{ - if (blt == NULL) return; - ZERO_STRUCTP(blt); -} - -/************************************************************* - turns an builtin entry into a string. - **************************************************************/ -BOOL make_builtin_line(char *p, int max_len, - LOCAL_GRP *blt, - LOCAL_GRP_MEMBER **mem, int *num_mem) -{ - int i; - int len; - len = slprintf(p, max_len-1, "%s:%s:%d:", blt->name, blt->comment, blt->rid); - - if (len == -1) - { - DEBUG(0,("make_builtin_line: cannot create entry\n")); - return False; - } - - p += len; - max_len -= len; - - if (mem == NULL || num_mem == NULL) - { - return True; - } - - for (i = 0; i < (*num_mem); i++) - { - len = strlen((*mem)[i].name); - p = safe_strcpy(p, (*mem)[i].name, max_len); - - if (p == NULL) - { - DEBUG(0, ("make_builtin_line: out of space for builtin aliases!\n")); - return False; - } - - max_len -= len; - - if (i != (*num_mem)-1) - { - *p = ','; - p++; - max_len--; - } - } - - return True; -} diff --git a/source3/groupdb/builtinldap.c b/source3/groupdb/builtinldap.c deleted file mode 100644 index baac82f1ba..0000000000 --- a/source3/groupdb/builtinldap.c +++ /dev/null @@ -1,426 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2.0. - LDAP builtin group database for SAMBA - Copyright (C) Matthew Chapman 1998 - - 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" - -#ifdef WITH_LDAP - -#include <lber.h> -#include <ldap.h> - -extern int DEBUGLEVEL; - -/* Internal state */ -extern LDAP *ldap_struct; -extern LDAPMessage *ldap_results; -extern LDAPMessage *ldap_entry; - -/* Static structure filled for requests */ -static LOCAL_GRP localgrp; - - -/*************************************************************** - Get group and membership information. - ****************************************************************/ - -static LOCAL_GRP *ldapbuiltin_getgrp(LOCAL_GRP *group, - LOCAL_GRP_MEMBER **members, int *num_membs) -{ - fstring temp; - char **values; - LOCAL_GRP_MEMBER *memblist; - char *value, *sep; - int i; - - if(!ldap_entry) - return NULL; - - if(!ldap_get_attribute("cn", group->name)) { - DEBUG(0, ("Missing cn\n")); - return NULL; } - - DEBUG(2,("Retrieving builtin alias [%s]\n", group->name)); - - if(ldap_get_attribute("rid", temp)) { - group->rid = strtol(temp, NULL, 16); - } else { - DEBUG(0, ("Missing rid\n")); - return NULL; - } - - if(!ldap_get_attribute("description", group->comment)) - group->comment[0] = 0; - - if(!members || !num_membs) { - ldap_entry = ldap_next_entry(ldap_struct, ldap_entry); - return group; - } - - if(values = ldap_get_values(ldap_struct, ldap_entry, "member")) { - - *num_membs = i = ldap_count_values(values); - *members = memblist = malloc(i * sizeof(LOCAL_GRP_MEMBER)); - - do { - value = values[--i]; - - if(!(sep = strchr(value, ','))) { - DEBUG(0, ("Malformed alias member\n")); - return NULL; - } - *(sep++) = 0; - fstrcpy(memblist[i].name, value); - - if(!(value = strchr(sep, ','))) { - DEBUG(0, ("Malformed alias member\n")); - return NULL; - } - *(value++) = 0; - string_to_sid(&memblist[i].sid, sep); - - if((memblist[i].sid_use = atoi(value)) - >= SID_NAME_UNKNOWN) - DEBUG(0, ("Invalid SID use in alias")); - - } while(i > 0); - - ldap_value_free(values); - - } else { - *num_membs = 0; - *members = NULL; - } - - return group; -} - - -/************************************************************************ - Queues the necessary modifications to save a LOCAL_GRP structure - ************************************************************************/ - -static void ldapbuiltin_grpmods(LOCAL_GRP *group, LDAPMod ***mods, - int operation) -{ - fstring temp; - - *mods = NULL; - - if(operation == LDAP_MOD_ADD) { /* immutable attributes */ - ldap_make_mod(mods, LDAP_MOD_ADD, "objectClass", "sambaBuiltin"); - ldap_make_mod(mods, LDAP_MOD_ADD, "cn", group->name); - - slprintf(temp, sizeof(temp)-1, "%x", group->rid); - ldap_make_mod(mods, LDAP_MOD_ADD, "rid", temp); - } - - ldap_make_mod(mods, operation, "description", group->comment); -} - - -/************************************************************************ - Create a builtin alias member entry - ************************************************************************/ - -static BOOL ldapbuiltin_memmods(DOM_SID *user_sid, LDAPMod ***mods, - int operation) -{ - pstring member; - pstring sid_str; - fstring name; - uint8 type; - - if (lookup_sid(user_sid, name, &type)) - return (False); - sid_to_string(sid_str, user_sid); - - slprintf(member, sizeof(member)-1, "%s,%s,%d", name, sid_str, type); - - *mods = NULL; - ldap_make_mod(mods, operation, "member", member); - return True; -} - - -/*************************************************************** - Begin/end smbgrp enumeration. - ****************************************************************/ - -static void *ldapbuiltin_enumfirst(BOOL update) -{ - if (lp_server_role() == ROLE_DOMAIN_NONE) - return NULL; - - if (!ldap_connect()) - return NULL; - - ldap_search_for("objectClass=sambaBuiltin"); - - return ldap_struct; -} - -static void ldapbuiltin_enumclose(void *vp) -{ - ldap_disconnect(); -} - - -/************************************************************************* - Save/restore the current position in a query - *************************************************************************/ - -static SMB_BIG_UINT ldapbuiltin_getdbpos(void *vp) -{ - return (SMB_BIG_UINT)((ulong)ldap_entry); -} - -static BOOL ldapbuiltin_setdbpos(void *vp, SMB_BIG_UINT tok) -{ - ldap_entry = (LDAPMessage *)((ulong)tok); - return (True); -} - - -/************************************************************************* - Return limited smb_passwd information, and group membership. - *************************************************************************/ - -static LOCAL_GRP *ldapbuiltin_getgrpbynam(const char *name, - LOCAL_GRP_MEMBER **members, int *num_membs) -{ - fstring filter; - LOCAL_GRP *ret; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(cn=%s)(objectClass=sambaBuiltin))", name); - ldap_search_for(filter); - - ret = ldapbuiltin_getgrp(&localgrp, members, num_membs); - - ldap_disconnect(); - return ret; -} - -static LOCAL_GRP *ldapbuiltin_getgrpbygid(gid_t grp_id, - LOCAL_GRP_MEMBER **members, int *num_membs) -{ - fstring filter; - LOCAL_GRP *ret; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(gidNumber=%d)(objectClass=sambaBuiltin))", grp_id); - ldap_search_for(filter); - ret = ldapbuiltin_getgrp(&localgrp, members, num_membs); - - ldap_disconnect(); - return ret; -} - -static LOCAL_GRP *ldapbuiltin_getgrpbyrid(uint32 grp_rid, - LOCAL_GRP_MEMBER **members, int *num_membs) -{ - fstring filter; - LOCAL_GRP *ret; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(rid=%x)(objectClass=sambaBuiltin))", grp_rid); - ldap_search_for(filter); - ret = ldapbuiltin_getgrp(&localgrp, members, num_membs); - - ldap_disconnect(); - return ret; -} - -static LOCAL_GRP *ldapbuiltin_getcurrentgrp(void *vp, - LOCAL_GRP_MEMBER **members, int *num_membs) -{ - return ldapbuiltin_getgrp(&localgrp, members, num_membs); -} - - -/************************************************************************* - Add/modify/delete builtin aliases. - *************************************************************************/ - -static BOOL ldapbuiltin_addgrp(LOCAL_GRP *group) -{ - LDAPMod **mods; - - if (!ldap_allocaterid(&group->rid)) - { - DEBUG(0,("RID generation failed\n")); - return (False); - } - - ldapbuiltin_grpmods(group, &mods, LDAP_MOD_ADD); - return ldap_makemods("cn", group->name, mods, True); -} - -static BOOL ldapbuiltin_modgrp(LOCAL_GRP *group) -{ - LDAPMod **mods; - - ldapbuiltin_grpmods(group, &mods, LDAP_MOD_REPLACE); - return ldap_makemods("cn", group->name, mods, False); -} - -static BOOL ldapbuiltin_delgrp(uint32 grp_rid) -{ - fstring filter; - char *dn; - int err; - - if (!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(rid=%x)(objectClass=sambaBuiltin))", grp_rid); - ldap_search_for(filter); - - if (!ldap_entry || !(dn = ldap_get_dn(ldap_struct, ldap_entry))) - { - ldap_disconnect(); - return (False); - } - - err = ldap_delete_s(ldap_struct, dn); - free(dn); - ldap_disconnect(); - - if (err != LDAP_SUCCESS) - { - DEBUG(0, ("delete: %s\n", ldap_err2string(err))); - return (False); - } - - return True; -} - - -/************************************************************************* - Add users to/remove users from aliases. - *************************************************************************/ - -static BOOL ldapbuiltin_addmem(uint32 grp_rid, DOM_SID *user_sid) -{ - LDAPMod **mods; - fstring rid_str; - - slprintf(rid_str, sizeof(rid_str)-1, "%x", grp_rid); - - if(!ldapbuiltin_memmods(user_sid, &mods, LDAP_MOD_ADD)) - return (False); - - return ldap_makemods("rid", rid_str, mods, False); -} - -static BOOL ldapbuiltin_delmem(uint32 grp_rid, DOM_SID *user_sid) -{ - LDAPMod **mods; - fstring rid_str; - - slprintf(rid_str, sizeof(rid_str)-1, "%x", grp_rid); - - if(!ldapbuiltin_memmods(user_sid, &mods, LDAP_MOD_DELETE)) - return (False); - - return ldap_makemods("rid", rid_str, mods, False); -} - - -/************************************************************************* - Return builtin aliases that a user is in. - *************************************************************************/ - -static BOOL ldapbuiltin_getusergroups(const char *name, - LOCAL_GRP **groups, int *num_grps) -{ - LOCAL_GRP *grouplist; - fstring filter; - int i; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(pstring)-1, - "(&(member=%s,*)(objectclass=sambaBuiltin))", name); - ldap_search_for(filter); - - *num_grps = i = ldap_count_entries(ldap_struct, ldap_results); - - if(!i) { - *groups = NULL; - ldap_disconnect(); - return (True); - } - - *groups = grouplist = malloc(i * sizeof(LOCAL_GRP)); - do { - i--; - } while(ldapbuiltin_getgrp(&grouplist[i], NULL, NULL) && (i > 0)); - - ldap_disconnect(); - return (True); -} - - -static struct aliasdb_ops ldapbuiltin_ops = -{ - ldapbuiltin_enumfirst, - ldapbuiltin_enumclose, - ldapbuiltin_getdbpos, - ldapbuiltin_setdbpos, - - ldapbuiltin_getgrpbynam, - ldapbuiltin_getgrpbygid, - ldapbuiltin_getgrpbyrid, - ldapbuiltin_getcurrentgrp, - - ldapbuiltin_addgrp, - ldapbuiltin_modgrp, - ldapbuiltin_delgrp, - - ldapbuiltin_addmem, - ldapbuiltin_delmem, - - ldapbuiltin_getusergroups -}; - -struct aliasdb_ops *ldap_initialise_builtin_db(void) -{ - return &ldapbuiltin_ops; -} - -#else - void builtinldap_dummy_function(void); - void builtinldap_dummy_function(void) { } /* stop some compilers complaining */ -#endif - diff --git a/source3/groupdb/builtinunix.c b/source3/groupdb/builtinunix.c deleted file mode 100644 index 57421cc449..0000000000 --- a/source3/groupdb/builtinunix.c +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup - * Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995. - * - * 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" - -#ifdef USE_SMBUNIX_DB - -extern int DEBUGLEVEL; - -struct unix_entries -{ - struct group *grps; - int num_grps; - int grp_idx; -}; - -extern DOM_SID global_sid_S_1_5_20; -extern DOM_SID global_sam_sid; -extern fstring global_sam_name; - -/*************************************************************** - Start to enumerate the bltpasswd list. Returns a void pointer - to ensure no modification outside this module. -****************************************************************/ - -static void *startbltunixpwent(BOOL update) -{ - struct unix_entries *grps; - grps = (struct unix_entries*)malloc(sizeof(struct unix_entries)); - - if (grps == NULL) - { - return NULL; - } - - if (!get_unix_grps(&grps->num_grps, &grps->grps)) - { - free(grps); - return NULL; - } - - grps->grp_idx = 0; - - return (void*)grps; -} - -/*************************************************************** - End enumeration of the bltpasswd list. -****************************************************************/ - -static void endbltunixpwent(void *vp) -{ - struct unix_entries *grps = (struct unix_entries *)vp; - - if (grps != NULL) - { - free_unix_grps(grps->num_grps, grps->grps); - free(vp); - } -} - -/************************************************************************* - Return the current position in the bltpasswd list as an SMB_BIG_UINT. - This must be treated as an opaque token. -*************************************************************************/ -static SMB_BIG_UINT getbltunixpwpos(void *vp) -{ - return (SMB_BIG_UINT)0; -} - -/************************************************************************* - Set the current position in the bltpasswd list from an SMB_BIG_UINT. - This must be treated as an opaque token. -*************************************************************************/ -static BOOL setbltunixpwpos(void *vp, SMB_BIG_UINT tok) -{ - return False; -} - -/************************************************************************* - Routine to return the next entry in the smbdomainbuiltin list. - *************************************************************************/ -BOOL get_unixbuiltin_members(struct group *grp, - int *num_mem, LOCAL_GRP_MEMBER **members) -{ - int i; - char *unix_name; - - if (num_mem == NULL || members == NULL) - { - return False; - } - - (*num_mem) = 0; - (*members) = NULL; - - for (i = 0; (unix_name = grp->gr_mem[i]) != NULL; i++) - { - fstring name; - DOM_NAME_MAP gmep; - LOCAL_GRP_MEMBER *mem; - - fstrcpy(name, unix_name); - - if (!lookupsmbpwnam (name, &gmep) && - !lookupsmbgrpnam(name, &gmep)) - { - continue; - } - - if (!sid_front_equal(&global_sam_sid, &gmep.sid)) - { - DEBUG(0,("builtin database: could not resolve name %s (wrong Domain SID)\n", - name)); - continue; - } - - (*num_mem)++; - (*members) = Realloc((*members), (*num_mem) * sizeof(LOCAL_GRP_MEMBER)); - if ((*members) == NULL) - { - DEBUG(0,("get_unixbuiltin_members: could not realloc LOCAL_GRP_MEMBERs\n")); - return False; - } - - mem = &(*members)[(*num_mem)-1]; - slprintf(mem->name, sizeof(mem->name)-1, "%s\\%s", - gmep.nt_domain, gmep.nt_name); - sid_copy(&mem->sid, &gmep.sid); - mem->sid_use = gmep.type; - - DEBUG(10,("get_unixbuiltin_members: adding to builtin alias %s\n", - mem->name)); - } - return True; -} - -/************************************************************************* - Routine to return the next entry in the domain builtin list. - - when we are a PDC or BDC, then unix groups that are explicitly NOT mapped - to builtin aliases are treated as DOMAIN groups (see groupunix.c). - - when we are a member of a domain (not a PDC or BDC) then unix groups - that are explicitly NOT mapped to builtin aliases are treated - as LOCAL groups. - - the reasoning behind this is to make it as simple as possible (not an easy - task) for people to set up a domain-aware samba server, in each role that - the server can take. - - *************************************************************************/ -static LOCAL_GRP *getbltunixpwent(void *vp, LOCAL_GRP_MEMBER **mem, int *num_mem) -{ - /* Static buffers we will return. */ - static LOCAL_GRP gp_buf; - struct group unix_grp; - struct unix_entries *grps = (struct unix_entries *)vp; - - if (grps == NULL) - { - return NULL; - } - - if (lp_server_role() == ROLE_DOMAIN_NONE) - { - /* - * no domain role, no domain aliases (or domain groups, - * but that's dealt with by groupdb...). - */ - - return NULL; - } - - bidb_init_blt(&gp_buf); - - /* get array of unix names + gids. this function does NOT - get a copy of the unix group members - */ - - /* cycle through unix groups */ - for (; grps->grp_idx < grps->num_grps; grps->grp_idx++) - { - DOM_NAME_MAP gmep; - fstring sid_str; - - memcpy(&unix_grp, &grps->grps[grps->grp_idx], sizeof(unix_grp)); - - DEBUG(10,("getgrpunixpwent: enum unix group entry %s\n", - unix_grp.gr_name)); - - if (!lookupsmbgrpgid(unix_grp.gr_gid, &gmep)) - { - continue; - } - - sid_to_string(sid_str, &gmep.sid); - DEBUG(10,("group %s found, sid %s type %d\n", - gmep.nt_name, sid_str, gmep.type)); - - if (gmep.type != SID_NAME_ALIAS) - { - continue; - } - - sid_split_rid(&gmep.sid, &gp_buf.rid); - if (!sid_equal(&global_sam_sid, &gmep.sid)) - { - continue; - } - - fstrcpy(gp_buf.name, gmep.nt_name); - break; - } - - if (grps->grp_idx >= grps->num_grps) - { - return NULL; - } - - /* get the user's domain aliases. there are a maximum of 32 */ - - if (mem != NULL && num_mem != NULL) - { - (*mem) = NULL; - (*num_mem) = 0; - - memcpy(&unix_grp, getgrgid(unix_grp.gr_gid), sizeof(unix_grp)); - get_unixbuiltin_members(&unix_grp, num_mem, mem); - } - - { - pstring linebuf; - make_alias_line(linebuf, sizeof(linebuf), &gp_buf, mem, num_mem); - DEBUG(10,("line: '%s'\n", linebuf)); - } - - grps->grp_idx++; /* advance so next enum gets next entry */ - return &gp_buf; -} - -/************************************************************************ - Routine to add an entry to the bltpasswd file. -*************************************************************************/ - -static BOOL add_bltunixgrp_entry(LOCAL_GRP *newblt) -{ - DEBUG(0, ("add_bltunixgrp_entry: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to search the bltpasswd file for an entry matching the builtinname. - and then modify its builtin entry. -************************************************************************/ - -static BOOL mod_bltunixgrp_entry(LOCAL_GRP* blt) -{ - DEBUG(0, ("mod_bltunixgrp_entry: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to add a member to an entry to the bltpasswd file. -*************************************************************************/ -static BOOL add_bltunixgrp_member(uint32 rid, DOM_SID *member_sid) -{ - DEBUG(0, ("add_bltunixgrp_member: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to delete a member from an entry to the bltpasswd file. -*************************************************************************/ -static BOOL del_bltunixgrp_member(uint32 rid, DOM_SID *member_sid) -{ - DEBUG(0, ("del_bltunixgrp_member: NOT IMPLEMENTED\n")); - return False; -} - -static struct aliasdb_ops unix_ops = -{ - startbltunixpwent, - endbltunixpwent, - getbltunixpwpos, - setbltunixpwpos, - - iterate_getbuiltinntnam, /* In builtindb.c */ - iterate_getbuiltingid, /* In builtindb.c */ - iterate_getbuiltinrid, /* In builtindb.c */ - getbltunixpwent, - - add_bltunixgrp_entry, - mod_bltunixgrp_entry, - NULL, /* deliberately NULL: you can't delete builtin aliases */ - - add_bltunixgrp_member, - del_bltunixgrp_member, - - iterate_getuserbuiltinntnam /* in builtindb.c */ -}; - -struct aliasdb_ops *unix_initialise_builtin_db(void) -{ - return &unix_ops; -} - -#else - /* Do *NOT* make this function static. It breaks the compile on gcc. JRA */ - void unix_bltpass_dummy_function(void) { } /* stop some compilers complaining */ -#endif /* USE_SMBPASS_DB */ diff --git a/source3/groupdb/groupldap.c b/source3/groupdb/groupldap.c deleted file mode 100644 index d32332e1ab..0000000000 --- a/source3/groupdb/groupldap.c +++ /dev/null @@ -1,436 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2.0. - LDAP domain group database for SAMBA - Copyright (C) Matthew Chapman 1998 - - 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" - -#ifdef WITH_LDAP - -#include <lber.h> -#include <ldap.h> - -extern int DEBUGLEVEL; -extern DOM_SID global_sam_sid; - -/* Internal state */ -extern LDAP *ldap_struct; -extern LDAPMessage *ldap_results; -extern LDAPMessage *ldap_entry; - -/* Static structure filled for requests */ -static DOMAIN_GRP domgrp; - - -/*************************************************************** - Get group and membership information. - ****************************************************************/ - -static DOMAIN_GRP *ldapgroup_getgrp(DOMAIN_GRP *group, - DOMAIN_GRP_MEMBER **members, int *num_membs) -{ - fstring temp; - char **values; - DOMAIN_GRP_MEMBER *memblist; - char *value, *sep; - int i; - - if(!ldap_entry) - return NULL; - - if(!ldap_get_attribute("cn", group->name)) { - DEBUG(0, ("Missing cn\n")); - return NULL; } - - DEBUG(2,("Retrieving group [%s]\n", group->name)); - - if(ldap_get_attribute("rid", temp)) { - group->rid = strtol(temp, NULL, 16); - } else { - DEBUG(0, ("Missing rid\n")); - return NULL; - } - - if(!ldap_get_attribute("description", group->comment)) - group->comment[0] = 0; - - group->attr = 0x7; - - if(!members || !num_membs) { - ldap_entry = ldap_next_entry(ldap_struct, ldap_entry); - return group; - } - - if(values = ldap_get_values(ldap_struct, ldap_entry, "member")) { - - *num_membs = i = ldap_count_values(values); - *members = memblist = malloc(i * sizeof(DOMAIN_GRP_MEMBER)); - - do { - value = values[--i]; - - if(!(sep = strchr(value, ','))) { - DEBUG(0, ("Malformed group member\n")); - return NULL; - } - *(sep++) = 0; - fstrcpy(memblist[i].name, value); - - if(!(value = strchr(sep, ','))) { - DEBUG(0, ("Malformed group member\n")); - return NULL; - } - memblist[i].rid = strtol(sep, &value, 16); - - if((memblist[i].sid_use = atoi(value+1)) - >= SID_NAME_UNKNOWN) - DEBUG(0, ("Invalid SID use in group")); - - memblist[i].attr = 0x7; - - } while(i > 0); - - ldap_value_free(values); - - } else { - *num_membs = 0; - *members = NULL; - } - - ldap_entry = ldap_next_entry(ldap_struct, ldap_entry); - return group; -} - - -/************************************************************************ - Queues the necessary modifications to save a DOMAIN_GRP structure - ************************************************************************/ - -static void ldapgroup_grpmods(DOMAIN_GRP *group, LDAPMod ***mods, - int operation) -{ - fstring temp; - - *mods = NULL; - - if(operation == LDAP_MOD_ADD) { /* immutable attributes */ - ldap_make_mod(mods, LDAP_MOD_ADD, "objectClass", "sambaGroup"); - ldap_make_mod(mods, LDAP_MOD_ADD, "cn", group->name); - - slprintf(temp, sizeof(temp)-1, "%x", group->rid); - ldap_make_mod(mods, LDAP_MOD_ADD, "rid", temp); - } - - ldap_make_mod(mods, operation, "description", group->comment); -} - - -/************************************************************************ - Create a group member entry - ************************************************************************/ - -static BOOL ldapgroup_memmods(uint32 user_rid, LDAPMod ***mods, int operation) -{ - pstring member; - fstring name; - DOM_SID sid; - uint8 type; - - sid_copy(&sid, &global_sam_sid); - sid_append_rid(&sid, user_rid); - if (lookup_sid(&sid, name, &type)) - return (False); - - slprintf(member, sizeof(member)-1, "%s,%x,%d", name, user_rid, type); - - *mods = NULL; - ldap_make_mod(mods, operation, "member", member); - return True; -} - - -/*************************************************************** - Begin/end domain group enumeration. - ****************************************************************/ - -static void *ldapgroup_enumfirst(BOOL update) -{ - int server_role = lp_server_role(); - - if (server_role == ROLE_DOMAIN_NONE || - server_role == ROLE_DOMAIN_MEMBER) - return NULL; - - if (!ldap_connect()) - return NULL; - - ldap_search_for("objectclass=sambaGroup"); - - return ldap_struct; -} - -static void ldapgroup_enumclose(void *vp) -{ - ldap_disconnect(); -} - - -/************************************************************************* - Save/restore the current position in a query - *************************************************************************/ - -static SMB_BIG_UINT ldapgroup_getdbpos(void *vp) -{ - return (SMB_BIG_UINT)((ulong)ldap_entry); -} - -static BOOL ldapgroup_setdbpos(void *vp, SMB_BIG_UINT tok) -{ - ldap_entry = (LDAPMessage *)((ulong)tok); - return (True); -} - - -/************************************************************************* - Return information about domain groups and their members. - *************************************************************************/ - -static DOMAIN_GRP *ldapgroup_getgrpbynam(const char *name, - DOMAIN_GRP_MEMBER **members, int *num_membs) -{ - fstring filter; - DOMAIN_GRP *ret; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(cn=%s*)(objectClass=sambaGroup))", name); - ldap_search_for(filter); - - ret = ldapgroup_getgrp(&domgrp, members, num_membs); - - ldap_disconnect(); - return ret; -} - -static DOMAIN_GRP *ldapgroup_getgrpbygid(gid_t grp_id, - DOMAIN_GRP_MEMBER **members, int *num_membs) -{ - fstring filter; - DOMAIN_GRP *ret; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(gidNumber=%d)(objectClass=sambaGroup))", grp_id); - ldap_search_for(filter); - - ret = ldapgroup_getgrp(&domgrp, members, num_membs); - - ldap_disconnect(); - return ret; -} - -static DOMAIN_GRP *ldapgroup_getgrpbyrid(uint32 grp_rid, - DOMAIN_GRP_MEMBER **members, int *num_membs) -{ - fstring filter; - DOMAIN_GRP *ret; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(rid=%x)(objectClass=sambaGroup))", grp_rid); - ldap_search_for(filter); - - ret = ldapgroup_getgrp(&domgrp, members, num_membs); - - ldap_disconnect(); - return ret; -} - -static DOMAIN_GRP *ldapgroup_getcurrentgrp(void *vp, - DOMAIN_GRP_MEMBER **members, int *num_membs) -{ - return ldapgroup_getgrp(&domgrp, members, num_membs); -} - - -/************************************************************************* - Add/modify/delete domain groups. - *************************************************************************/ - -static BOOL ldapgroup_addgrp(DOMAIN_GRP *group) -{ - LDAPMod **mods; - - if (!ldap_allocaterid(&group->rid)) - { - DEBUG(0,("RID generation failed\n")); - return (False); - } - - ldapgroup_grpmods(group, &mods, LDAP_MOD_ADD); - return ldap_makemods("cn", group->name, mods, True); -} - -static BOOL ldapgroup_modgrp(DOMAIN_GRP *group) -{ - LDAPMod **mods; - - ldapgroup_grpmods(group, &mods, LDAP_MOD_REPLACE); - return ldap_makemods("cn", group->name, mods, False); -} - -static BOOL ldapgroup_delgrp(uint32 grp_rid) -{ - fstring filter; - char *dn; - int err; - - if (!ldap_connect()) - return (False); - - slprintf(filter, sizeof(filter)-1, - "(&(rid=%x)(objectClass=sambaGroup))", grp_rid); - ldap_search_for(filter); - - if (!ldap_entry || !(dn = ldap_get_dn(ldap_struct, ldap_entry))) - { - ldap_disconnect(); - return (False); - } - - err = ldap_delete_s(ldap_struct, dn); - free(dn); - ldap_disconnect(); - - if (err != LDAP_SUCCESS) - { - DEBUG(0, ("delete: %s\n", ldap_err2string(err))); - return (False); - } - - return True; -} - - -/************************************************************************* - Add users to/remove users from groups. - *************************************************************************/ - -static BOOL ldapgroup_addmem(uint32 grp_rid, uint32 user_rid) -{ - LDAPMod **mods; - fstring rid_str; - - slprintf(rid_str, sizeof(rid_str)-1, "%x", grp_rid); - - if(!ldapgroup_memmods(user_rid, &mods, LDAP_MOD_ADD)) - return (False); - - return ldap_makemods("rid", rid_str, mods, False); -} - -static BOOL ldapgroup_delmem(uint32 grp_rid, uint32 user_rid) -{ - LDAPMod **mods; - fstring rid_str; - - slprintf(rid_str, sizeof(rid_str)-1, "%x", grp_rid); - - if(!ldapgroup_memmods(user_rid, &mods, LDAP_MOD_DELETE)) - return (False); - - return ldap_makemods("rid", rid_str, mods, False); -} - - -/************************************************************************* - Return domain groups that a user is in. - *************************************************************************/ - -static BOOL ldapgroup_getusergroups(const char *name, DOMAIN_GRP **groups, - int *num_grps) -{ - DOMAIN_GRP *grouplist; - fstring filter; - int i; - - if(!ldap_connect()) - return (False); - - slprintf(filter, sizeof(pstring)-1, - "(&(member=%s,*)(objectclass=sambaGroup))", name); - ldap_search_for(filter); - - *num_grps = i = ldap_count_entries(ldap_struct, ldap_results); - - if(!i) { - *groups = NULL; - ldap_disconnect(); - return (True); - } - - *groups = grouplist = malloc(i * sizeof(DOMAIN_GRP)); - do { - i--; - } while(ldapgroup_getgrp(&grouplist[i], NULL, NULL) && (i > 0)); - - ldap_disconnect(); - return (True); -} - - -static struct groupdb_ops ldapgroup_ops = -{ - ldapgroup_enumfirst, - ldapgroup_enumclose, - ldapgroup_getdbpos, - ldapgroup_setdbpos, - - ldapgroup_getgrpbynam, - ldapgroup_getgrpbygid, - ldapgroup_getgrpbyrid, - ldapgroup_getcurrentgrp, - - ldapgroup_addgrp, - ldapgroup_modgrp, - ldapgroup_delgrp, - - ldapgroup_addmem, - ldapgroup_delmem, - - ldapgroup_getusergroups -}; - -struct groupdb_ops *ldap_initialise_group_db(void) -{ - return &ldapgroup_ops; -} - -#else - void groupldap_dummy_function(void); - void groupldap_dummy_function(void) { } /* stop some compilers complaining */ -#endif - diff --git a/source3/groupdb/groupunix.c b/source3/groupdb/groupunix.c deleted file mode 100644 index 306e499858..0000000000 --- a/source3/groupdb/groupunix.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup - * Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995. - * - * 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" - -#ifdef USE_SMBUNIX_DB - -extern int DEBUGLEVEL; - - -extern DOM_SID global_sam_sid; - -/*************************************************************** - Start to enumerate the grppasswd list. Returns a void pointer - to ensure no modification outside this module. -****************************************************************/ - -struct unix_entries -{ - struct group *grps; - int num_grps; - int grp_idx; -}; - -static void *startgrpunixpwent(BOOL update) -{ - struct unix_entries *grps; - grps = (struct unix_entries*)malloc(sizeof(struct unix_entries)); - - if (grps == NULL) - { - return NULL; - } - - if (!get_unix_grps(&grps->num_grps, &grps->grps)) - { - free(grps); - return NULL; - } - - grps->grp_idx = 0; - - return (void*)grps; -} - -/*************************************************************** - End enumeration of the grppasswd list. -****************************************************************/ - -static void endgrpunixpwent(void *vp) -{ - struct unix_entries *grps = (struct unix_entries *)vp; - - if (grps != NULL) - { - free_unix_grps(grps->num_grps, grps->grps); - free(vp); - } -} - -/************************************************************************* - Return the current position in the grppasswd list as an SMB_BIG_UINT. - This must be treated as an opaque token. -*************************************************************************/ -static SMB_BIG_UINT getgrpunixpwpos(void *vp) -{ - return (SMB_BIG_UINT)0; -} - -/************************************************************************* - Set the current position in the grppasswd list from an SMB_BIG_UINT. - This must be treated as an opaque token. -*************************************************************************/ -static BOOL setgrpunixpwpos(void *vp, SMB_BIG_UINT tok) -{ - return False; -} - -/************************************************************************* - Routine to return the next entry in the smbdomaingroup list. - *************************************************************************/ -BOOL get_unixgroup_members(struct group *grp, - int *num_mem, DOMAIN_GRP_MEMBER **members) -{ - int i; - char *unix_name; - - if (num_mem == NULL || members == NULL) - { - return False; - } - - (*num_mem) = 0; - (*members) = NULL; - - for (i = 0; (unix_name = grp->gr_mem[i]) != NULL; i++) - { - DOM_NAME_MAP gmep; - DOMAIN_GRP_MEMBER *mem; - uint32 rid; - - if (!lookupsmbpwnam (unix_name, &gmep) && - !lookupsmbgrpnam(unix_name, &gmep)) - { - continue; - } - - if (gmep.type != SID_NAME_DOM_GRP && - gmep.type != SID_NAME_USER && - gmep.type != SID_NAME_WKN_GRP) - { - DEBUG(0,("group database: name %s is not in a Domain Group\n", - unix_name)); - continue; - } - - sid_split_rid(&gmep.sid, &rid); - if (!sid_equal(&global_sam_sid, &gmep.sid)) - { - DEBUG(0,("group database: could not resolve name %s (wrong Domain SID)\n", - unix_name)); - continue; - } - - (*members) = Realloc((*members), ((*num_mem)+1) * sizeof(DOMAIN_GRP_MEMBER)); - if ((*members) == NULL) - { - return False; - } - - mem = &(*members)[(*num_mem)]; - (*num_mem)++; - - fstrcpy(mem->name, gmep.nt_name); - mem->attr = 0x07; - mem->sid_use = gmep.type; - mem->rid = rid; - } - return True; -} - -/************************************************************************* - Routine to return the next entry in the domain group list. - - if we are not a PDC or BDC, then we do NOT support Domain groups, only - aliases. try running MUSRMGR.EXE or running USRMGR.EXE selected on a - workstation, you will find that no Domain groups are listed: only aliases. - - so, as a PDC or BDC, all unix groups not explicitly mapped using - map_group_gid() are treated as Domain groups. - - *************************************************************************/ -static DOMAIN_GRP *getgrpunixpwent(void *vp, DOMAIN_GRP_MEMBER **mem, int *num_mem) -{ - /* Static buffers we will return. */ - static DOMAIN_GRP gp_buf; - struct group unix_grp; - struct unix_entries *grps = (struct unix_entries *)vp; - - if (grps == NULL) - { - return NULL; - } - - if (lp_server_role() == ROLE_DOMAIN_NONE || - lp_server_role() == ROLE_DOMAIN_MEMBER) - { - /* - * only PDC and BDC have domain groups in the SAM. - * (however as member of domain you can have LOCAL groups, - * but that's dealt with in the aliasdb...) - */ - - return NULL; - } - - gpdb_init_grp(&gp_buf); - - fstrcpy(gp_buf.comment, ""); - gp_buf.attr = 0x07; - - /* get array of unix names + gids. this function does NOT - get a copy of the unix group members - */ - - /* cycle through unix groups */ - for (; grps->grp_idx < grps->num_grps; grps->grp_idx++) - { - DOM_NAME_MAP gmep; - - memcpy(&unix_grp, &grps->grps[grps->grp_idx], sizeof(unix_grp)); - - DEBUG(10,("getgrpunixpwent: enum unix group entry %s\n", - unix_grp.gr_name)); - - if (!lookupsmbgrpgid(unix_grp.gr_gid, &gmep)) - { - continue; - } - - if (gmep.type != SID_NAME_DOM_GRP && - gmep.type != SID_NAME_WKN_GRP) - { - continue; - } - - sid_split_rid(&gmep.sid, &gp_buf.rid); - if (!sid_equal(&gmep.sid, &global_sam_sid)) - { - continue; - } - - fstrcpy(gp_buf.name, gmep.nt_name); - break; - } - - if (grps->grp_idx >= grps->num_grps) - { - return NULL; - } - - /* get the user's domain groups. there are a maximum of 32 */ - - if (mem != NULL && num_mem != NULL) - { - (*mem) = NULL; - (*num_mem) = 0; - - memcpy(&unix_grp, getgrgid(unix_grp.gr_gid), sizeof(unix_grp)); - get_unixgroup_members(&unix_grp, num_mem, mem); - } - - { - pstring linebuf; - make_group_line(linebuf, sizeof(linebuf), &gp_buf, mem, num_mem); - DEBUG(10,("line: '%s'\n", linebuf)); - } - - grps->grp_idx++; /* advance so next enum gets next entry */ - return &gp_buf; -} - -/************************************************************************ - Routine to add an entry to the grppasswd file. -*************************************************************************/ - -static BOOL add_grpunixgrp_entry(DOMAIN_GRP *newgrp) -{ - DEBUG(0, ("add_grpunixgrp_entry: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to search database for entry matching the groupname and/or rid. - and then modify its group entry. -************************************************************************/ - -static BOOL mod_grpunixgrp_entry(DOMAIN_GRP* grp) -{ - DEBUG(0, ("mod_grpunixgrp_entry: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to search the grppasswd file for an entry matching the rid. - and then delete it. -************************************************************************/ - -static BOOL del_grpunixgrp_entry(uint32 rid) -{ - DEBUG(0, ("del_grpunixgrp_entry: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to add a member to an entry to the grppasswd file. -*************************************************************************/ -static BOOL add_grpunixgrp_member(uint32 rid, uint32 member_rid) -{ - DEBUG(0, ("add_grpunixgrp_member: NOT IMPLEMENTED\n")); - return False; -} - -/************************************************************************ - Routine to delete a member from an entry to the grppasswd file. -*************************************************************************/ -static BOOL del_grpunixgrp_member(uint32 rid, uint32 member_rid) -{ - DEBUG(0, ("del_grpunixgrp_member: NOT IMPLEMENTED\n")); - return False; -} - -static struct groupdb_ops unix_ops = -{ - startgrpunixpwent, - endgrpunixpwent, - getgrpunixpwpos, - setgrpunixpwpos, - - iterate_getgroupntnam, /* In groupdb.c */ - iterate_getgroupgid, /* In groupdb.c */ - iterate_getgrouprid, /* In groupdb.c */ - getgrpunixpwent, - - add_grpunixgrp_entry, - mod_grpunixgrp_entry, - del_grpunixgrp_entry, - - add_grpunixgrp_member, - del_grpunixgrp_member, - - iterate_getusergroupsnam /* in groupdb.c */ -}; - -struct groupdb_ops *unix_initialise_group_db(void) -{ - return &unix_ops; -} - -#else - /* Do *NOT* make this function static. It breaks the compile on gcc. JRA */ - void unix_grppass_dummy_function(void) { } /* stop some compilers complaining */ -#endif /* USE_SMBPASS_DB */ diff --git a/source3/include/DesktopDB.h b/source3/include/DesktopDB.h deleted file mode 100644 index c0efa2b4a4..0000000000 --- a/source3/include/DesktopDB.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - service (connection) opening and closing - Copyright (C) Andrew Tridgell 1992-1998 - - 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. -*/ - - -#define DESKTOPDB_FOLDER "./.streams/.DesktopDBFolder/" -#define DESKTOPDB_DF_PATH "./.streams/.DesktopDBFolder/DesktopDF" -#define THE_ZERO_DB_ENTRY "ZERO_DB" - -typedef struct IconKey -{ - uint32 ftype; /* The file type */ - uint32 isize; /* Size of the Icon */ - uint16 itype; /* Icon Type */ -} IconKey; diff --git a/source3/include/debug.h b/source3/include/debug.h deleted file mode 100644 index df74da0b41..0000000000 --- a/source3/include/debug.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB debug stuff - Copyright (C) Andrew Tridgell 1992-1998 - Copyright (C) John H Terpstra 1996-1998 - Copyright (C) Luke Kenneth Casson Leighton 1996-1998 - Copyright (C) Paul Ashton 1998 - - 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. -*/ - -#ifndef _DEBUG_H -#define _DEBUG_H - -/* -------------------------------------------------------------------------- ** - * Debugging code. See also debug.c - */ - -/* mkproto.awk has trouble with ifdef'd function definitions (it ignores - * the #ifdef directive and will read both definitions, thus creating two - * diffferent prototype declarations), so we must do these by hand. - */ -/* I know the __attribute__ stuff is ugly, but it does ensure we get the - arguemnts to DEBUG() right. We have got them wrong too often in the - past. - */ -#ifdef HAVE_STDARG_H -int Debug1( char *, ... ) -#ifdef __GNUC__ - __attribute__ ((format (printf, 1, 2))) -#endif -; -BOOL dbgtext( char *, ... ) -#ifdef __GNUC__ - __attribute__ ((format (printf, 1, 2))) -#endif -; -#else -int Debug1(); -BOOL dbgtext(); -#endif - -/* If we have these macros, we can add additional info to the header. */ -#ifdef HAVE_FILE_MACRO -#define FILE_MACRO (__FILE__) -#else -#define FILE_MACRO ("") -#endif - -#ifdef HAVE_FUNCTION_MACRO -#define FUNCTION_MACRO (__FUNCTION__) -#else -#define FUNCTION_MACRO ("") -#endif - -/* Debugging macros. - * DEBUGLVL() - If level is <= the system-wide DEBUGLEVEL then generate a - * header using the default macros for file, line, and - * function name. - * Returns True if the debug level was <= DEBUGLEVEL. - * Example usage: - * if( DEBUGLVL( 2 ) ) - * dbgtext( "Some text.\n" ); - * DEGUG() - Good old DEBUG(). Each call to DEBUG() will generate a new - * header *unless* the previous debug output was unterminated - * (i.e., no '\n'). See debug.c:dbghdr() for more info. - * Example usage: - * DEBUG( 2, ("Some text.\n") ); - * DEBUGADD() - If level <= DEBUGLEVEL, then the text is appended to the - * current message (i.e., no header). - * Usage: - * DEBUGADD( 2, ("Some additional text.\n") ); - */ -#define DEBUGLVL( level ) \ - ( (DEBUGLEVEL >= (level)) \ - && dbghdr( level, FILE_MACRO, FUNCTION_MACRO, (__LINE__) ) ) - -#define DEBUG( level, body ) \ - (void)( (DEBUGLEVEL >= (level)) \ - && (dbghdr( level, FILE_MACRO, FUNCTION_MACRO, (__LINE__) )) \ - && (dbgtext body) ) - -#define DEBUGADD( level, body ) \ - (void)( (DEBUGLEVEL >= (level)) && (dbgtext body) ) - -/* -------------------------------------------------------------------------- ** - * These are the tokens returned by dbg_char2token(). - */ - -typedef enum - { - dbg_null = 0, - dbg_ignore, - dbg_header, - dbg_timestamp, - dbg_level, - dbg_sourcefile, - dbg_function, - dbg_lineno, - dbg_message, - dbg_eof - } dbg_Token; - -/* End Debugging code section. - * -------------------------------------------------------------------------- ** - */ - -#endif diff --git a/source3/include/dfs.h b/source3/include/dfs.h deleted file mode 100644 index 1bf26e230b..0000000000 --- a/source3/include/dfs.h +++ /dev/null @@ -1,53 +0,0 @@ - -typedef struct _referal_trans_param -{ - uint16 level; - char directory[255]; - uint16 type; -} referal_trans_param; - -typedef struct _referal_ver_2 -{ - uint16 version; - uint16 size; - uint16 server_type; - uint16 flags; - uint32 proximity; - uint32 ttl; - uint16 filename_offset; - uint16 mangledname_offset; - uint16 sharename_offset; - char sharename[255]; -} referal_ver_2; - -typedef struct _dfs_response -{ - uint16 path_consumed; - uint16 number_of_referal; - uint32 server_function; - referal_ver_2 *referal; - char filename[255]; - char mangledname[255]; - struct _dfs_response *next; -} dfs_response; - - -typedef struct _dfs_internal_table -{ - pstring localpath; - pstring mangledpath; - pstring sharename; - unsigned int proximity; - unsigned int type; - int localpath_length; - int mangledpath_length; - int sharename_length; -} dfs_internal_table; - -typedef struct _dfs_internal -{ - - dfs_internal_table *table; - int size; - BOOL ready; -} dfs_internal; diff --git a/source3/include/hmacmd5.h b/source3/include/hmacmd5.h deleted file mode 100644 index adb52058a8..0000000000 --- a/source3/include/hmacmd5.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Interface header: Scheduler service - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - Copyright (C) Andrew Tridgell 1992-1999 - - 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. -*/ - -#ifndef _HMAC_MD5_H - -typedef struct -{ - struct MD5Context ctx; - uchar k_ipad[65]; - uchar k_opad[65]; - -} HMACMD5Context; - -#endif /* _HMAC_MD5_H */ diff --git a/source3/include/md5.h b/source3/include/md5.h deleted file mode 100644 index 070d8c307d..0000000000 --- a/source3/include/md5.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - -#ifndef MD5_H -#define MD5_H - -struct MD5Context -{ - uint32 buf[4]; - uint32 bits[2]; - uchar in[64]; -}; - -#endif /* !MD5_H */ diff --git a/source3/include/nt_printing.h b/source3/include/nt_printing.h deleted file mode 100644 index a575c01e49..0000000000 --- a/source3/include/nt_printing.h +++ /dev/null @@ -1,102 +0,0 @@ -typedef struct nt_printer_driver_info_level_3 -{ - uint32 cversion; - - fstring name; - fstring environment; - fstring driverpath; - fstring datafile; - fstring configfile; - fstring helpfile; - fstring monitorname; - fstring defaultdatatype; - char **dependentfiles; - -} NT_PRINTER_DRIVER_INFO_LEVEL_3; - -typedef struct nt_printer_driver_info_level -{ - NT_PRINTER_DRIVER_INFO_LEVEL_3 *info_3; -} NT_PRINTER_DRIVER_INFO_LEVEL; - -typedef struct nt_printer_param -{ - fstring value; - uint32 type; - uint8 *data; - int data_len; - struct nt_printer_param *next; -} NT_PRINTER_PARAM; - -typedef struct ntdevicemode -{ - fstring devicename; - uint16 specversion; - uint16 driverversion; - uint16 size; - uint16 driverextra; - uint32 fields; - uint16 orientation; - uint16 papersize; - uint16 paperlength; - uint16 paperwidth; - uint16 scale; - uint16 copies; - uint16 defaultsource; - uint16 printquality; - uint16 color; - uint16 duplex; - uint16 yresolution; - uint16 ttoption; - uint16 collate; - fstring formname; - uint16 logpixels; - uint32 bitsperpel; - uint32 pelswidth; - uint32 pelsheight; - uint32 displayflags; - uint32 displayfrequency; - uint32 icmmethod; - uint32 icmintent; - uint32 mediatype; - uint32 dithertype; - uint32 reserved1; - uint32 reserved2; - uint32 panningwidth; - uint32 panningheight; - uint8 *private; -} NT_DEVICEMODE; - -typedef struct nt_printer_info_level_2 -{ - uint32 attributes; - uint32 priority; - uint32 default_priority; - uint32 starttime; - uint32 untiltime; - uint32 status; - uint32 cjobs; - uint32 averageppm; - fstring servername; - fstring printername; - fstring sharename; - fstring portname; - fstring drivername; - fstring comment; - fstring location; - NT_DEVICEMODE *devmode; - fstring sepfile; - fstring printprocessor; - fstring datatype; - fstring parameters; - NT_PRINTER_PARAM *specific; - /* SEC_DESC_BUF *secdesc; */ - /* not used but ... and how ??? */ -} NT_PRINTER_INFO_LEVEL_2; - -typedef struct nt_printer_info_level -{ - NT_PRINTER_INFO_LEVEL_2 *info_2; -} NT_PRINTER_INFO_LEVEL; - - diff --git a/source3/include/rpc_atsvc.h b/source3/include/rpc_atsvc.h deleted file mode 100644 index 2b983f438e..0000000000 --- a/source3/include/rpc_atsvc.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Interface header: Scheduler service - Copyright (C) Matthew Chapman 1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - Copyright (C) Andrew Tridgell 1992-1999 - - 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. -*/ - -#ifndef _RPC_ATSVC_H -#define _RPC_ATSVC_H - -#define AT_ADD_JOB 0x00 -#define AT_DEL_JOB 0x01 -#define AT_ENUM_JOBS 0x02 -#define AT_QUERY_JOB 0x03 - - -#define JOB_PERIODIC 0x01 -#define JOB_EXEC_ERR 0x02 -#define JOB_RUNS_TODAY 0x04 -#define JOB_INCLUDE_TODAY 0x08 -#define JOB_NONINTERACTIVE 0x10 - -/* AT_JOB_INFO */ -typedef struct at_job_info_info -{ - uint32 time; /* milliseconds after midnight */ - uint32 monthdays; /* bitmask of days of month */ - uint8 weekdays; /* bitmask of days of week */ - uint8 flags; /* JOB_xx */ - - uint32 ptr_command; - -} AT_JOB_INFO; - -/* AT_Q_ADD_JOB */ -typedef struct q_at_add_job_info -{ - uint32 ptr_srv_name; - UNISTR2 uni_srv_name; - - AT_JOB_INFO info; - UNISTR2 command; - -} AT_Q_ADD_JOB; - -/* AT_R_ADD_JOB */ -typedef struct r_at_add_job_info -{ - uint32 jobid; - uint32 status; - -} AT_R_ADD_JOB; - - -/* AT_Q_DEL_JOB */ -typedef struct q_at_del_job_info -{ - uint32 ptr_srv_name; - UNISTR2 uni_srv_name; - - uint32 min_jobid; - uint32 max_jobid; - -} AT_Q_DEL_JOB; - -/* AT_R_DEL_JOB */ -typedef struct r_at_del_job_info -{ - uint32 status; - -} AT_R_DEL_JOB; - - -/* AT_Q_ENUM_JOBS */ -typedef struct q_at_enum_jobs_info -{ - uint32 ptr_srv_name; - UNISTR2 uni_srv_name; - - uint32 unknown0; /* 0 */ - uint32 unknown1; /* 0 */ - uint32 max_len; /* preferred max length */ - - uint32 ptr_resume; - uint32 hnd_resume; /* resume handle */ - -} AT_Q_ENUM_JOBS; - -/* AT_ENUM_INFO */ -typedef struct q_at_enum_info_info -{ - uint32 jobid; - AT_JOB_INFO info; - -} AT_ENUM_INFO; - -#define AT_MAX_JOBS 256 - -/* AT_R_ENUM_JOBS */ -typedef struct r_at_enum_jobs_info -{ - uint32 num_entries; /* entries returned */ - uint32 ptr_entries; - uint32 num_entries2; - - AT_ENUM_INFO info[AT_MAX_JOBS]; - UNISTR2 command[AT_MAX_JOBS]; - - uint32 total_entries; /* total entries */ - uint32 ptr_resume; - uint32 hnd_resume; /* resume handle */ - - uint32 status; - -} AT_R_ENUM_JOBS; - - -/* AT_Q_QUERY_JOB */ -typedef struct q_at_query_job_info -{ - uint32 ptr_srv_name; - UNISTR2 uni_srv_name; - - uint32 jobid; - -} AT_Q_QUERY_JOB; - -/* AT_R_QUERY_JOB */ -typedef struct r_at_query_job_info -{ - uint32 ptr_info; - AT_JOB_INFO info; - UNISTR2 command; - - uint32 status; - -} AT_R_QUERY_JOB; - -#endif /* _RPC_ATSVC_H */ diff --git a/source3/include/rpc_brs.h b/source3/include/rpc_brs.h deleted file mode 100644 index 36d89ec151..0000000000 --- a/source3/include/rpc_brs.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB parameters and setup - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - -#ifndef _RPC_BRS_H /* _RPC_BRS_H */ -#define _RPC_BRS_H - - -/* brssvc pipe */ -#define BRS_QUERY_INFO 0x02 - - -/* BRS_Q_QUERY_INFO - probably a capabilities request */ -typedef struct q_brs_query_info_info -{ - uint32 ptr_srv_name; /* pointer (to server name?) */ - UNISTR2 uni_srv_name; /* unicode server name starting with '\\' */ - - uint16 switch_value1; /* info level 100 (0x64) */ - /* align */ - uint16 switch_value2; /* info level 100 (0x64) */ - - uint32 ptr; - uint32 pad1; - uint32 pad2; - -} BRS_Q_QUERY_INFO; - - -/* BRS_INFO_100 - level 100 info */ -typedef struct brs_info_100_info -{ - uint32 pad1; - uint32 ptr2; - uint32 pad2; - uint32 pad3; - -} BRS_INFO_100; - - -/* BRS_R_QUERY_INFO - probably a capabilities request */ -typedef struct r_brs_query_info_info -{ - uint16 switch_value1; /* 100 (0x64) - switch value */ - /* align */ - uint16 switch_value2; /* info level 100 (0x64) */ - - /* for now, only level 100 is supported. this should be an enum container */ - uint32 ptr_1; /* pointer 1 */ - - union - { - BRS_INFO_100 *brs100; /* browser info level 100 */ - void *id; - - } info; - - uint32 status; /* return status */ - -} BRS_R_QUERY_INFO; - -#endif /* _RPC_BRS_H */ - diff --git a/source3/include/rpc_creds.h b/source3/include/rpc_creds.h deleted file mode 100644 index c389c64d1d..0000000000 --- a/source3/include/rpc_creds.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB parameters and setup - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - -#ifndef _RPC_CREDS_H /* _RPC_CREDS_H */ -#define _RPC_CREDS_H - -typedef struct ntuser_creds -{ - fstring user_name; - fstring domain; - struct pwd_info pwd; - - uint32 ntlmssp_flags; - -} CREDS_NT; - -typedef struct unixuser_creds -{ - fstring user_name; - fstring requested_name; - fstring real_name; - BOOL guest; - -} CREDS_UNIX; - -typedef struct unixsec_creds -{ - uint32 uid; - uint32 gid; - int num_grps; - uint32 *grps; - -} CREDS_UNIX_SEC; - -typedef struct ntsec_creds -{ - DOM_SID sid; - uint32 num_grps; - uint32 *grp_rids; - -} CREDS_NT_SEC; - -typedef struct user_creds -{ - BOOL reuse; - uint32 ptr_ntc; - uint32 ptr_uxc; - uint32 ptr_nts; - uint32 ptr_uxs; - - CREDS_NT ntc; - CREDS_UNIX uxc; - - CREDS_NT_SEC nts; - CREDS_UNIX_SEC uxs; - - -} CREDS_HYBRID; - -typedef struct cred_command -{ - uint16 version; - uint16 command; - - fstring name; - - uint32 ptr_creds; - CREDS_HYBRID *cred; - -} CREDS_CMD; - -#endif /* _RPC_CREDS_H */ - diff --git a/source3/include/rpc_eventlog.h b/source3/include/rpc_eventlog.h deleted file mode 100644 index 14e5570c9b..0000000000 --- a/source3/include/rpc_eventlog.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Interface header: Scheduler service - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - Copyright (C) Andrew Tridgell 1992-1999 - - 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. -*/ - -#ifndef _RPC_EVENTLOG_H -#define _RPC_EVENTLOG_H - -#define EVENTLOG_OPEN 0x07 -#define EVENTLOG_CLOSE 0x02 -#define EVENTLOG_NUMOFEVENTLOGRECORDS 0x04 -#define EVENTLOG_READEVENTLOG 0x0a - -#define EVENTLOG_READ_SEQUENTIAL 0x01 -#define EVENTLOG_READ_SEEK 0x02 -#define EVENTLOG_READ_FORWARD 0x04 -#define EVENTLOG_READ_BACKWARD 0x08 - -#define EVENTLOG_OK 0X00 -#define EVENTLOG_ERROR 0x01 -#define EVENTLOG_WARNING 0x02 -#define EVENTLOG_INFORMATION 0x04 -#define EVENTLOG_AUDIT_OK 0x08 -#define EVENTLOG_AUDIT_ERROR 0x10 - -typedef struct eventlogrecord -{ - uint32 size; - uint32 reserved; - uint32 recordnumber; - uint32 creationtime; - uint32 writetime; - uint32 eventnumber; - uint16 eventtype; - uint16 num_of_strings; - uint16 category; - uint16 reserved_flag; - uint32 closingrecord; - uint32 stringoffset; - uint32 sid_length; - uint32 sid_offset; - uint32 data_length; - uint32 data_offset; - UNISTR sourcename; - UNISTR computername; - UNISTR sid; - UNISTR strings; - UNISTR data; - uint32 size2; -} EVENTLOGRECORD; - -typedef struct eventlog_q_open -{ - uint32 ptr0; - - uint16 unk0; - uint16 unk1; - - UNIHDR hdr_source; - UNISTR2 uni_source; - - UNIHDR hdr_unk; - UNISTR2 uni_unk; - - uint32 unk6; - uint32 unk7; - -} EVENTLOG_Q_OPEN; - -typedef struct eventlog_r_open -{ - POLICY_HND pol; - uint32 status; - -} EVENTLOG_R_OPEN; - -typedef struct eventlog_q_close -{ - POLICY_HND pol; -} EVENTLOG_Q_CLOSE; - -typedef struct eventlog_r_close -{ - POLICY_HND pol; - uint32 status; -} EVENTLOG_R_CLOSE; - -typedef struct eventlog_q_numofeventlogrec -{ - POLICY_HND pol; -} EVENTLOG_Q_NUMOFEVENTLOGREC; - -typedef struct eventlog_r_numofeventlogrec -{ - uint32 number; - uint32 status; -} EVENTLOG_R_NUMOFEVENTLOGREC; - -typedef struct eventlog_q_readeventlog -{ - POLICY_HND pol; - uint32 flags; - uint32 offset; - uint32 number_of_bytes; -} EVENTLOG_Q_READEVENTLOG; - -typedef struct eventlog_r_readeventlog -{ - uint32 number_of_bytes; - EVENTLOGRECORD *event; - uint32 sent_size; - uint32 real_size; - uint32 status; -} EVENTLOG_R_READEVENTLOG; - -#endif /* _RPC_EVENTLOG_H */ diff --git a/source3/include/rpc_spoolss.h b/source3/include/rpc_spoolss.h deleted file mode 100755 index 5143b389fc..0000000000 --- a/source3/include/rpc_spoolss.h +++ /dev/null @@ -1,1492 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB parameters and setup - Copyright (C) Andrew Tridgell 1992-1998 - Copyright (C) Luke Kenneth Casson Leighton 1996-1998 - Copyright (C) Jean Francois Micouleau 1998-1999 - - 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. -*/ - -#ifndef _RPC_SPOOLSS_H /* _RPC_SPOOLSS_H */ -#define _RPC_SPOOLSS_H - -#define INTEGER 1 -#define STRING 2 - -/* spoolss pipe: this are the calls which are not implemented ... -#define SPOOLSS_OPENPRINTER 0x01 -#define SPOOLSS_DELETEPRINTER 0x06 -#define SPOOLSS_GETPRINTERDRIVER 0x0b -#define SPOOLSS_DELETEPRINTERDRIVER 0x0d -#define SPOOLSS_ADDPRINTPROCESSOR 0x0e -#define SPOOLSS_GETPRINTPROCESSORDIRECTORY 0x10 -#define SPOOLSS_ABORTPRINTER 0x15 -#define SPOOLSS_READPRINTER 0x16 -#define SPOOLSS_WAITFORPRINTERCHANGE 0x1c -#define SPOOLSS_DELETEFORM 0x1f -#define SPOOLSS_GETFORM 0x20 -#define SPOOLSS_ADDPORT 0x25 -#define SPOOLSS_CONFIGUREPORT 0x26 -#define SPOOLSS_DELETEPORT 0x27 -#define SPOOLSS_CREATEPRINTERIC 0x28 -#define SPOOLSS_PLAYGDISCRIPTONPRINTERIC 0x29 -#define SPOOLSS_DELETEPRINTERIC 0x2a -#define SPOOLSS_ADDPRINTERCONNECTION 0x2b -#define SPOOLSS_DELETEPRINTERCONNECTION 0x2c -#define SPOOLSS_PRINTERMESSAGEBOX 0x2d -#define SPOOLSS_ADDMONITOR 0x2e -#define SPOOLSS_DELETEMONITOR 0x2f -#define SPOOLSS_DELETEPRINTPROCESSOR 0x30 -#define SPOOLSS_ADDPRINTPROVIDOR 0x31 -#define SPOOLSS_DELETEPRINTPROVIDOR 0x32 -#define SPOOLSS_RESETPRINTER 0x34 -#define SPOOLSS_FINDFIRSTPRINTERCHANGENOTIFICATION 0x36 -#define SPOOLSS_FINDNEXTPRINTERCHANGENOTIFICATION 0x37 -#define SPOOLSS_ROUTERFINDFIRSTPRINTERNOTIFICATIONOLD 0x39 -#define SPOOLSS_REPLYOPENPRINTER 0x3a -#define SPOOLSS_ROUTERREPLYPRINTER 0x3b -#define SPOOLSS_REPLYCLOSEPRINTER 0x3c -#define SPOOLSS_ADDPORTEX 0x3d -#define SPOOLSS_REMOTEFINDFIRSTPRINTERCHANGENOTIFICATION0x3e -#define SPOOLSS_SPOOLERINIT 0x3f -#define SPOOLSS_RESETPRINTEREX 0x40 -#define SPOOLSS_ROUTERREFRESHPRINTERCHANGENOTIFICATION 0x42 -*/ - -/* those are implemented */ - -#define SPOOLSS_ENUMPRINTERS 0x00 -#define SPOOLSS_SETJOB 0x02 -#define SPOOLSS_GETJOB 0x03 -#define SPOOLSS_ENUMJOBS 0x04 -#define SPOOLSS_ADDPRINTER 0x05 -#define SPOOLSS_SETPRINTER 0x07 -#define SPOOLSS_GETPRINTER 0x08 -#define SPOOLSS_ADDPRINTERDRIVER 0x09 -#define SPOOLSS_ENUMPRINTERDRIVERS 0x0a -#define SPOOLSS_GETPRINTERDRIVERDIRECTORY 0x0c -#define SPOOLSS_ENUMPRINTPROCESSORS 0x0f -#define SPOOLSS_STARTDOCPRINTER 0x11 -#define SPOOLSS_STARTPAGEPRINTER 0x12 -#define SPOOLSS_WRITEPRINTER 0x13 -#define SPOOLSS_ENDPAGEPRINTER 0x14 -#define SPOOLSS_ENDDOCPRINTER 0x17 -#define SPOOLSS_ADDJOB 0x18 -#define SPOOLSS_SCHEDULEJOB 0x19 -#define SPOOLSS_GETPRINTERDATA 0x1a -#define SPOOLSS_SETPRINTERDATA 0x1b -#define SPOOLSS_CLOSEPRINTER 0x1d -#define SPOOLSS_ADDFORM 0x1e -#define SPOOLSS_SETFORM 0x21 -#define SPOOLSS_ENUMFORMS 0x22 -#define SPOOLSS_ENUMPORTS 0x23 -#define SPOOLSS_ENUMMONITORS 0x24 -#define SPOOLSS_ENUMPRINTPROCESSORDATATYPES 0x33 -#define SPOOLSS_GETPRINTERDRIVER2 0x35 -/* find close printer notification */ -#define SPOOLSS_FCPN 0x38 -/* remote find first printer change notifyEx */ -#define SPOOLSS_RFFPCNEX 0x41 -/* remote find next printer change notifyEx */ -#define SPOOLSS_RFNPCNEX 0x43 -#define SPOOLSS_OPENPRINTEREX 0x45 -#define SPOOLSS_ADDPRINTEREX 0x46 -#define SPOOLSS_ENUMPRINTERDATA 0x48 - - -#define SERVER_ACCESS_ADMINISTER 0x00000001 -#define SERVER_ACCESS_ENUMERATE 0x00000002 - -#define PRINTER_ACCESS_ADMINISTER 0x00000004 -#define PRINTER_ACCESS_USE 0x00000008 - -#define PRINTER_CONTROL_UNPAUSE 0x00000000 -#define PRINTER_CONTROL_PAUSE 0x00000001 -#define PRINTER_CONTROL_RESUME 0x00000002 -#define PRINTER_CONTROL_PURGE 0x00000003 -#define PRINTER_CONTROL_SET_STATUS 0x00000004 - -#define PRINTER_STATUS_PAUSED 0x00000001 -#define PRINTER_STATUS_ERROR 0x00000002 -#define PRINTER_STATUS_PENDING_DELETION 0x00000004 -#define PRINTER_STATUS_PAPER_JAM 0x00000008 - -#define PRINTER_STATUS_PAPER_OUT 0x00000010 -#define PRINTER_STATUS_MANUAL_FEED 0x00000020 -#define PRINTER_STATUS_PAPER_PROBLEM 0x00000040 -#define PRINTER_STATUS_OFFLINE 0x00000080 - -#define PRINTER_STATUS_IO_ACTIVE 0x00000100 -#define PRINTER_STATUS_BUSY 0x00000200 -#define PRINTER_STATUS_PRINTING 0x00000400 -#define PRINTER_STATUS_OUTPUT_BIN_FULL 0x00000800 - -#define PRINTER_STATUS_NOT_AVAILABLE 0x00001000 -#define PRINTER_STATUS_WAITING 0x00002000 -#define PRINTER_STATUS_PROCESSING 0x00004000 -#define PRINTER_STATUS_INITIALIZING 0x00008000 - -#define PRINTER_STATUS_WARMING_UP 0x00010000 -#define PRINTER_STATUS_TONER_LOW 0x00020000 -#define PRINTER_STATUS_NO_TONER 0x00040000 -#define PRINTER_STATUS_PAGE_PUNT 0x00080000 - -#define PRINTER_STATUS_USER_INTERVENTION 0x00100000 -#define PRINTER_STATUS_OUT_OF_MEMORY 0x00200000 -#define PRINTER_STATUS_DOOR_OPEN 0x00400000 -#define PRINTER_STATUS_SERVER_UNKNOWN 0x00800000 - -#define PRINTER_STATUS_POWER_SAVE 0x01000000 - -#define JOB_ACCESS_ADMINISTER 0x00000010 - -#define STANDARD_RIGHTS_READ 0x00020000 -#define STANDARD_RIGHTS_WRITE STANDARD_RIGHTS_READ -#define STANDARD_RIGHTS_EXECUTE STANDARD_RIGHTS_READ -#define STANDARD_RIGHTS_REQUIRED 0x000F0000 - -/* Access rights for print servers */ -#define SERVER_ALL_ACCESS STANDARD_RIGHTS_REQUIRED|SERVER_ACCESS_ADMINISTER|SERVER_ACCESS_ENUMERATE -#define SERVER_READ STANDARD_RIGHTS_READ|SERVER_ACCESS_ENUMERATE -#define SERVER_WRITE STANDARD_RIGHTS_WRITE|SERVER_ACCESS_ADMINISTER|SERVER_ACCESS_ENUMERATE -#define SERVER_EXECUTE STANDARD_RIGHTS_EXECUTE|SERVER_ACCESS_ENUMERATE - -/* Access rights for printers */ -#define PRINTER_ALL_ACCESS STANDARD_RIGHTS_REQUIRED|PRINTER_ACCESS_ADMINISTER|PRINTER_ACCESS_USE -#define PRINTER_READ STANDARD_RIGHTS_READ|PRINTER_ACCESS_USE -#define PRINTER_WRITE STANDARD_RIGHTS_WRITE|PRINTER_ACCESS_USE -#define PRINTER_EXECUTE STANDARD_RIGHTS_EXECUTE|PRINTER_ACCESS_USE - -/* Access rights for jobs */ -#define JOB_ALL_ACCESS STANDARD_RIGHTS_REQUIRED|JOB_ACCESS_ADMINISTER -#define JOB_READ STANDARD_RIGHTS_READ|JOB_ACCESS_ADMINISTER -#define JOB_WRITE STANDARD_RIGHTS_WRITE|JOB_ACCESS_ADMINISTER -#define JOB_EXECUTE STANDARD_RIGHTS_EXECUTE|JOB_ACCESS_ADMINISTER - -#define POLICY_HND_SIZE 20 - -#define ONE_VALUE 01 -#define TWO_VALUE 02 -#define POINTER 03 - -#define PRINTER_NOTIFY_TYPE 0x00 -#define JOB_NOTIFY_TYPE 0x01 - -#define MAX_PRINTER_NOTIFY 26 - -#define PRINTER_NOTIFY_SERVER_NAME 0x00 -#define PRINTER_NOTIFY_PRINTER_NAME 0x01 -#define PRINTER_NOTIFY_SHARE_NAME 0x02 -#define PRINTER_NOTIFY_PORT_NAME 0x03 -#define PRINTER_NOTIFY_DRIVER_NAME 0x04 -#define PRINTER_NOTIFY_COMMENT 0x05 -#define PRINTER_NOTIFY_LOCATION 0x06 -#define PRINTER_NOTIFY_DEVMODE 0x07 -#define PRINTER_NOTIFY_SEPFILE 0x08 -#define PRINTER_NOTIFY_PRINT_PROCESSOR 0x09 -#define PRINTER_NOTIFY_PARAMETERS 0x0A -#define PRINTER_NOTIFY_DATATYPE 0x0B -#define PRINTER_NOTIFY_SECURITY_DESCRIPTOR 0x0C -#define PRINTER_NOTIFY_ATTRIBUTES 0x0D -#define PRINTER_NOTIFY_PRIORITY 0x0E -#define PRINTER_NOTIFY_DEFAULT_PRIORITY 0x0F -#define PRINTER_NOTIFY_START_TIME 0x10 -#define PRINTER_NOTIFY_UNTIL_TIME 0x11 -#define PRINTER_NOTIFY_STATUS 0x12 -#define PRINTER_NOTIFY_STATUS_STRING 0x13 -#define PRINTER_NOTIFY_CJOBS 0x14 -#define PRINTER_NOTIFY_AVERAGE_PPM 0x15 -#define PRINTER_NOTIFY_TOTAL_PAGES 0x16 -#define PRINTER_NOTIFY_PAGES_PRINTED 0x17 -#define PRINTER_NOTIFY_TOTAL_BYTES 0x18 -#define PRINTER_NOTIFY_BYTES_PRINTED 0x19 - -#define MAX_JOB_NOTIFY 24 - -#define JOB_NOTIFY_PRINTER_NAME 0x00 -#define JOB_NOTIFY_MACHINE_NAME 0x01 -#define JOB_NOTIFY_PORT_NAME 0x02 -#define JOB_NOTIFY_USER_NAME 0x03 -#define JOB_NOTIFY_NOTIFY_NAME 0x04 -#define JOB_NOTIFY_DATATYPE 0x05 -#define JOB_NOTIFY_PRINT_PROCESSOR 0x06 -#define JOB_NOTIFY_PARAMETERS 0x07 -#define JOB_NOTIFY_DRIVER_NAME 0x08 -#define JOB_NOTIFY_DEVMODE 0x09 -#define JOB_NOTIFY_STATUS 0x0A -#define JOB_NOTIFY_STATUS_STRING 0x0B -#define JOB_NOTIFY_SECURITY_DESCRIPTOR 0x0C -#define JOB_NOTIFY_DOCUMENT 0x0D -#define JOB_NOTIFY_PRIORITY 0x0E -#define JOB_NOTIFY_POSITION 0x0F -#define JOB_NOTIFY_SUBMITTED 0x10 -#define JOB_NOTIFY_START_TIME 0x11 -#define JOB_NOTIFY_UNTIL_TIME 0x12 -#define JOB_NOTIFY_TIME 0x13 -#define JOB_NOTIFY_TOTAL_PAGES 0x14 -#define JOB_NOTIFY_PAGES_PRINTED 0x15 -#define JOB_NOTIFY_TOTAL_BYTES 0x16 -#define JOB_NOTIFY_BYTES_PRINTED 0x17 - -/* - * The printer attributes. - * I #defined all of them (grabbed form MSDN) - * I'm only using: - * ( SHARED | NETWORK | RAW_ONLY ) - * RAW_ONLY _MUST_ be present otherwise NT will send an EMF file - */ - -#define PRINTER_ATTRIBUTE_QUEUED 0x00000001 -#define PRINTER_ATTRIBUTE_DIRECT 0x00000002 -#define PRINTER_ATTRIBUTE_DEFAULT 0x00000004 -#define PRINTER_ATTRIBUTE_SHARED 0x00000008 - -#define PRINTER_ATTRIBUTE_NETWORK 0x00000010 -#define PRINTER_ATTRIBUTE_HIDDEN 0x00000020 -#define PRINTER_ATTRIBUTE_LOCAL 0x00000040 -#define PRINTER_ATTRIBUTE_ENABLE_DEVQ 0x00000080 - -#define PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS 0x00000100 -#define PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST 0x00000200 -#define PRINTER_ATTRIBUTE_WORK_OFFLINE 0x00000400 -#define PRINTER_ATTRIBUTE_ENABLE_BIDI 0x00000800 - -#define PRINTER_ATTRIBUTE_RAW_ONLY 0x00001000 - -#define NO_PRIORITY 0 -#define MAX_PRIORITY 99 -#define MIN_PRIORITY 1 -#define DEF_PRIORITY 1 - -#define PRINTER_ENUM_DEFAULT 0x00000001 -#define PRINTER_ENUM_LOCAL 0x00000002 -#define PRINTER_ENUM_CONNECTIONS 0x00000004 -#define PRINTER_ENUM_FAVORITE 0x00000004 -#define PRINTER_ENUM_NAME 0x00000008 -#define PRINTER_ENUM_REMOTE 0x00000010 -#define PRINTER_ENUM_SHARED 0x00000020 -#define PRINTER_ENUM_NETWORK 0x00000040 - -#define PRINTER_ENUM_EXPAND 0x00004000 -#define PRINTER_ENUM_CONTAINER 0x00008000 - -#define PRINTER_ENUM_ICONMASK 0x00ff0000 -#define PRINTER_ENUM_ICON1 0x00010000 -#define PRINTER_ENUM_ICON2 0x00020000 -#define PRINTER_ENUM_ICON3 0x00040000 -#define PRINTER_ENUM_ICON4 0x00080000 -#define PRINTER_ENUM_ICON5 0x00100000 -#define PRINTER_ENUM_ICON6 0x00200000 -#define PRINTER_ENUM_ICON7 0x00400000 -#define PRINTER_ENUM_ICON8 0x00800000 - -typedef struct -{ - char name[100]; - uint32 flag; - uint32 width; - uint32 length; - uint32 left; - uint32 top; - uint32 right; - uint32 bottom; -} nt_forms_struct; - -typedef struct -{ - char name[100]; - char architecture[100]; - uint32 version; - char default_form[30]; - uint32 color_flag; - char driver[100]; - char datafile[100]; - char configfile[100]; - char helpfile[100]; - char monitor[100]; - char monitor_name[100]; - char **dependant; -} nt_drivers_struct; - -typedef struct devicemode -{ - UNISTR devicename; - uint16 specversion; - uint16 driverversion; - uint16 size; - uint16 driverextra; - uint32 fields; - uint16 orientation; - uint16 papersize; - uint16 paperlength; - uint16 paperwidth; - uint16 scale; - uint16 copies; - uint16 defaultsource; - uint16 printquality; - uint16 color; - uint16 duplex; - uint16 yresolution; - uint16 ttoption; - uint16 collate; - UNISTR formname; - uint16 logpixels; - uint32 bitsperpel; - uint32 pelswidth; - uint32 pelsheight; - uint32 displayflags; - uint32 displayfrequency; - uint32 icmmethod; - uint32 icmintent; - uint32 mediatype; - uint32 dithertype; - uint32 reserved1; - uint32 reserved2; - uint32 panningwidth; - uint32 panningheight; - uint8 *private; -} DEVICEMODE; - -typedef struct devicemode_container -{ - DEVICEMODE *dm; - uint8 *buffer; - uint32 size_of_buffer; -} DEVICEMODE_CONTAINER; - -#define ORIENTATION 0x00000001L -#define PAPERSIZE 0x00000002L -#define PAPERLENGTH 0x00000004L -#define PAPERWIDTH 0x00000008L -#define SCALE 0x00000010L -#define COPIES 0x00000100L -#define DEFAULTSOURCE 0x00000200L -#define PRINTQUALITY 0x00000400L -#define COLOR 0x00000800L -#define DUPLEX 0x00001000L -#define YRESOLUTION 0x00002000L -#define TTOPTION 0x00004000L -#define COLLATE 0x00008000L -#define FORMNAME 0x00010000L -#define LOGPIXELS 0x00020000L -#define BITSPERPEL 0x00040000L -#define PELSWIDTH 0x00080000L -#define PELSHEIGHT 0x00100000L -#define DISPLAYFLAGS 0x00200000L -#define DISPLAYFREQUENCY 0x00400000L -#define PANNINGWIDTH 0x00800000L -#define PANNINGHEIGHT 0x01000000L - -#define ORIENT_PORTRAIT 1 -#define ORIENT_LANDSCAPE 2 - -#define PAPER_FIRST PAPER_LETTER -#define PAPER_LETTER 1 /* Letter 8 1/2 x 11 in */ -#define PAPER_LETTERSMALL 2 /* Letter Small 8 1/2 x 11 in */ -#define PAPER_TABLOID 3 /* Tabloid 11 x 17 in */ -#define PAPER_LEDGER 4 /* Ledger 17 x 11 in */ -#define PAPER_LEGAL 5 /* Legal 8 1/2 x 14 in */ -#define PAPER_STATEMENT 6 /* Statement 5 1/2 x 8 1/2 in */ -#define PAPER_EXECUTIVE 7 /* Executive 7 1/4 x 10 1/2 in */ -#define PAPER_A3 8 /* A3 297 x 420 mm */ -#define PAPER_A4 9 /* A4 210 x 297 mm */ -#define PAPER_A4SMALL 10 /* A4 Small 210 x 297 mm */ -#define PAPER_A5 11 /* A5 148 x 210 mm */ -#define PAPER_B4 12 /* B4 (JIS) 250 x 354 */ -#define PAPER_B5 13 /* B5 (JIS) 182 x 257 mm */ -#define PAPER_FOLIO 14 /* Folio 8 1/2 x 13 in */ -#define PAPER_QUARTO 15 /* Quarto 215 x 275 mm */ -#define PAPER_10X14 16 /* 10x14 in */ -#define PAPER_11X17 17 /* 11x17 in */ -#define PAPER_NOTE 18 /* Note 8 1/2 x 11 in */ -#define PAPER_ENV_9 19 /* Envelope #9 3 7/8 x 8 7/8 */ -#define PAPER_ENV_10 20 /* Envelope #10 4 1/8 x 9 1/2 */ -#define PAPER_ENV_11 21 /* Envelope #11 4 1/2 x 10 3/8 */ -#define PAPER_ENV_12 22 /* Envelope #12 4 \276 x 11 */ -#define PAPER_ENV_14 23 /* Envelope #14 5 x 11 1/2 */ -#define PAPER_CSHEET 24 /* C size sheet */ -#define PAPER_DSHEET 25 /* D size sheet */ -#define PAPER_ESHEET 26 /* E size sheet */ -#define PAPER_ENV_DL 27 /* Envelope DL 110 x 220mm */ -#define PAPER_ENV_C5 28 /* Envelope C5 162 x 229 mm */ -#define PAPER_ENV_C3 29 /* Envelope C3 324 x 458 mm */ -#define PAPER_ENV_C4 30 /* Envelope C4 229 x 324 mm */ -#define PAPER_ENV_C6 31 /* Envelope C6 114 x 162 mm */ -#define PAPER_ENV_C65 32 /* Envelope C65 114 x 229 mm */ -#define PAPER_ENV_B4 33 /* Envelope B4 250 x 353 mm */ -#define PAPER_ENV_B5 34 /* Envelope B5 176 x 250 mm */ -#define PAPER_ENV_B6 35 /* Envelope B6 176 x 125 mm */ -#define PAPER_ENV_ITALY 36 /* Envelope 110 x 230 mm */ -#define PAPER_ENV_MONARCH 37 /* Envelope Monarch 3.875 x 7.5 in */ -#define PAPER_ENV_PERSONAL 38 /* 6 3/4 Envelope 3 5/8 x 6 1/2 in */ -#define PAPER_FANFOLD_US 39 /* US Std Fanfold 14 7/8 x 11 in */ -#define PAPER_FANFOLD_STD_GERMAN 40 /* German Std Fanfold 8 1/2 x 12 in */ -#define PAPER_FANFOLD_LGL_GERMAN 41 /* German Legal Fanfold 8 1/2 x 13 in */ - -#define PAPER_LAST PAPER_FANFOLD_LGL_GERMAN -#define PAPER_USER 256 - -#define BIN_FIRST BIN_UPPER -#define BIN_UPPER 1 -#define BIN_ONLYONE 1 -#define BIN_LOWER 2 -#define BIN_MIDDLE 3 -#define BIN_MANUAL 4 -#define BIN_ENVELOPE 5 -#define BIN_ENVMANUAL 6 -#define BIN_AUTO 7 -#define BIN_TRACTOR 8 -#define BIN_SMALLFMT 9 -#define BIN_LARGEFMT 10 -#define BIN_LARGECAPACITY 11 -#define BIN_CASSETTE 14 -#define BIN_FORMSOURCE 15 -#define BIN_LAST BIN_FORMSOURCE - -#define BIN_USER 256 /* device specific bins start here */ - -#define RES_DRAFT (-1) -#define RES_LOW (-2) -#define RES_MEDIUM (-3) -#define RES_HIGH (-4) - -#define COLOR_MONOCHROME 1 -#define COLOR_COLOR 2 - -#define DUP_SIMPLEX 1 -#define DUP_VERTICAL 2 -#define DUP_HORIZONTAL 3 - -#define TT_BITMAP 1 /* print TT fonts as graphics */ -#define TT_DOWNLOAD 2 /* download TT fonts as soft fonts */ -#define TT_SUBDEV 3 /* substitute device fonts for TT fonts */ - -#define COLLATE_FALSE 0 -#define COLLATE_TRUE 1 - -typedef struct s_header_type -{ - uint32 type; - union - { - uint32 value; - UNISTR string; - } data; -} HEADER_TYPE; - -typedef struct s_buffer -{ - uint32 ptr; - uint32 size; - uint32 count; - uint8 *data; - HEADER_TYPE *header; -} BUFFER; - - -/* SPOOL_Q_OPEN_PRINTER_EX request to open a printer */ -typedef struct spool_q_open_printer_ex -{ - uint32 ptr; - UNISTR2 printername; - uint32 unknown0; - uint32 cbbuf; - uint32 devmod; - uint32 access_required; - uint32 unknown1; /* 0x0000 0001 */ - uint32 unknown2; /* 0x0000 0001 */ - uint32 unknown3; /* ??? pointer? */ - uint32 unknown4; /* 0x0000 001c */ - uint32 unknown5; /* ??? e.g 0xb94dd0 */ - uint32 unknown6; /* ??? pointer? */ - uint32 unknown7; /* 0x0000 0565 */ - uint32 unknown8; /* 0x0000 0002 */ - uint32 unknown9; /* 0x0000 0000 */ - uint32 unknown10; /* 0x0000 0000 */ - UNISTR2 station; - UNISTR2 username; - -} SPOOL_Q_OPEN_PRINTER_EX; - -/* SPOOL_Q_OPEN_PRINTER_EX reply to an open printer */ -typedef struct spool_r_open_printer_ex -{ - POLICY_HND handle; /* handle used along all transactions (20*uint8) */ - uint32 status; - -} SPOOL_R_OPEN_PRINTER_EX; - -typedef struct spool_q_getprinterdata -{ - POLICY_HND handle; - UNISTR2 valuename; - uint32 size; -} SPOOL_Q_GETPRINTERDATA; - -typedef struct spool_r_getprinterdata -{ - uint32 type; - uint32 size; - uint8 *data; - uint32 numeric_data; - uint32 needed; - uint32 status; -} SPOOL_R_GETPRINTERDATA; - -typedef struct spool_q_closeprinter -{ - POLICY_HND handle; -} SPOOL_Q_CLOSEPRINTER; - -typedef struct spool_r_closeprinter -{ - POLICY_HND handle; - uint32 status; -} SPOOL_R_CLOSEPRINTER; - -typedef struct spool_q_startpageprinter -{ - POLICY_HND handle; -} SPOOL_Q_STARTPAGEPRINTER; - -typedef struct spool_r_startpageprinter -{ - uint32 status; -} SPOOL_R_STARTPAGEPRINTER; - -typedef struct spool_q_endpageprinter -{ - POLICY_HND handle; -} SPOOL_Q_ENDPAGEPRINTER; - -typedef struct spool_r_endpageprinter -{ - uint32 status; -} SPOOL_R_ENDPAGEPRINTER; - -typedef struct spool_doc_info_1 -{ - uint32 p_docname; - uint32 p_outputfile; - uint32 p_datatype; - UNISTR2 docname; - UNISTR2 outputfile; - UNISTR2 datatype; -} DOC_INFO_1; - -typedef struct spool_doc_info -{ - uint32 switch_value; - DOC_INFO_1 doc_info_1; -} DOC_INFO; - -typedef struct spool_doc_info_container -{ - uint32 level; - DOC_INFO docinfo; -} DOC_INFO_CONTAINER; - -typedef struct spool_q_startdocprinter -{ - POLICY_HND handle; - DOC_INFO_CONTAINER doc_info_container; -} SPOOL_Q_STARTDOCPRINTER; - -typedef struct spool_r_startdocprinter -{ - uint32 jobid; - uint32 status; -} SPOOL_R_STARTDOCPRINTER; - -typedef struct spool_q_enddocprinter -{ - POLICY_HND handle; -} SPOOL_Q_ENDDOCPRINTER; - -typedef struct spool_r_enddocprinter -{ - uint32 status; -} SPOOL_R_ENDDOCPRINTER; - -typedef struct spool_q_writeprinter -{ - POLICY_HND handle; - uint32 buffer_size; - uint8 *buffer; - uint32 buffer_size2; -} SPOOL_Q_WRITEPRINTER; - -typedef struct spool_r_writeprinter -{ - uint32 buffer_written; - uint32 status; -} SPOOL_R_WRITEPRINTER; - -typedef struct spool_notify_option_type -{ - uint16 type; - uint16 reserved0; - uint32 reserved1; - uint32 reserved2; - uint32 count; - uint16 fields[16]; -} SPOOL_NOTIFY_OPTION_TYPE; - -typedef struct spool_notify_option -{ - uint32 version; - uint32 reserved; - uint32 count; - SPOOL_NOTIFY_OPTION_TYPE type[16]; /* totally arbitrary !!! */ -} SPOOL_NOTIFY_OPTION; - -typedef struct spool_notify_info_data -{ - uint16 type; - uint16 field; - uint32 reserved; - uint32 id; - union - { - uint32 value[2]; - struct - { - uint32 length; - uint16 string[1024]; - } data; - } notify_data; - uint32 size; - BOOL enc_type; -} SPOOL_NOTIFY_INFO_DATA; - -typedef struct spool_notify_info -{ - uint32 version; - uint32 flags; - uint32 count; - SPOOL_NOTIFY_INFO_DATA data[26*16]; - /* 26 differents data types */ - /* so size it for 16 printers at max */ - /* jfmxxxx: Have to make it dynamic !!!*/ -} SPOOL_NOTIFY_INFO; - -/* If the struct name looks obscure, yes it is ! */ -/* RemoteFindFirstPrinterChangeNotificationEx query struct */ -typedef struct spoolss_q_rffpcnex -{ - POLICY_HND handle; - uint32 flags; - uint32 options; - UNISTR2 localmachine; - uint32 printerlocal; - SPOOL_NOTIFY_OPTION option; -} SPOOL_Q_RFFPCNEX; - -typedef struct spool_r_rffpcnex -{ - uint32 status; -} SPOOL_R_RFFPCNEX; - -/* Remote Find Next Printer Change Notify Ex */ -typedef struct spool_q_rfnpcnex -{ - POLICY_HND handle; - uint32 change; - SPOOL_NOTIFY_OPTION option; -} SPOOL_Q_RFNPCNEX; - -typedef struct spool_r_rfnpcnex -{ - uint32 count; - SPOOL_NOTIFY_INFO info; -} SPOOL_R_RFNPCNEX; - -/* Find Close Printer Notify */ -typedef struct spool_q_fcpn -{ - POLICY_HND handle; -} SPOOL_Q_FCPN; - -typedef struct spool_r_fcpn -{ - uint32 status; -} SPOOL_R_FCPN; - - -typedef struct printer_info_0 -{ - UNISTR printername; - UNISTR servername; - uint32 cjobs; - uint32 attributes; - uint32 unknown0; - uint32 unknown1; - uint32 unknown2; - uint32 unknown3; - uint32 unknown4; - uint32 unknown5; - uint32 unknown6; - uint16 majorversion; - uint16 buildversion; - uint32 unknown7; - uint32 unknown8; - uint32 unknown9; - uint32 unknown10; - uint32 unknown11; - uint32 unknown12; - uint32 unknown13; - uint32 unknown14; - uint32 unknown15; - uint32 unknown16; - uint32 unknown17; - uint32 unknown18; - uint32 status; - uint32 unknown20; - uint32 unknown21; - uint16 unknown22; - uint32 unknown23; -} PRINTER_INFO_0; - -typedef struct printer_info_1 -{ - uint32 flags; - UNISTR description; - UNISTR name; - UNISTR comment; -} PRINTER_INFO_1; - -typedef struct printer_info_2 -{ - UNISTR servername; - UNISTR printername; - UNISTR sharename; - UNISTR portname; - UNISTR drivername; - UNISTR comment; - UNISTR location; - DEVICEMODE *devmode; - UNISTR sepfile; - UNISTR printprocessor; - UNISTR datatype; - UNISTR parameters; - /*SECURITY_DESCRIPTOR securitydescriptor;*/ - uint32 attributes; - uint32 priority; - uint32 defaultpriority; - uint32 starttime; - uint32 untiltime; - uint32 status; - uint32 cjobs; - uint32 averageppm; -} PRINTER_INFO_2; - -typedef struct spool_q_enumprinters -{ - uint32 flags; - UNISTR2 servername; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_ENUMPRINTERS; - -typedef struct spool_r_enumprinters -{ - uint32 offered; /* number of bytes offered */ - uint32 needed; /* bytes needed */ - uint32 returned; /* number of printers */ - uint32 status; - uint32 level; - UNISTR servername; - union { - PRINTER_INFO_1 **printers_1; - PRINTER_INFO_2 **printers_2; - void *info; - } printer; -} SPOOL_R_ENUMPRINTERS; - - -typedef struct spool_q_getprinter -{ - POLICY_HND handle; - uint32 level; - uint8* buffer; - uint32 offered; - -} SPOOL_Q_GETPRINTER; - -typedef struct spool_r_getprinter -{ - POLICY_HND handle; - uint32 level; - - uint32 offered; - uint32 needed; - uint32 status; - union { - PRINTER_INFO_0 *info0; - PRINTER_INFO_1 *info1; - PRINTER_INFO_2 *info2; - void *info; - } printer; -} SPOOL_R_GETPRINTER; - -struct s_notify_info_data_table -{ - uint16 type; - uint16 field; - char *name; - uint32 size; - void (*fn) (int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer); -}; - -typedef struct spool_q_getprinterdriver2 -{ - POLICY_HND handle; - UNISTR2 architecture; - uint32 level; - BUFFER buffer; - uint32 buf_size; - uint32 status; -} SPOOL_Q_GETPRINTERDRIVER2; - -typedef struct driver_info_1 -{ - UNISTR name; -} DRIVER_INFO_1; - -typedef struct driver_info_2 -{ - uint32 version; - UNISTR name; - UNISTR architecture; - UNISTR driverpath; - UNISTR datafile; - UNISTR configfile; -} DRIVER_INFO_2; - -typedef struct driver_info_3 -{ - uint32 version; - UNISTR name; - UNISTR architecture; - UNISTR driverpath; - UNISTR datafile; - UNISTR configfile; - UNISTR helpfile; - UNISTR **dependentfiles; - UNISTR monitorname; - UNISTR defaultdatatype; -} DRIVER_INFO_3; - -typedef struct spool_r_getprinterdriver2 -{ - uint32 needed; - uint32 offered; - uint32 returned; - uint32 status; - uint32 level; - union { - DRIVER_INFO_1 *info1; - DRIVER_INFO_2 *info2; - DRIVER_INFO_3 *info3; - } printer; -} SPOOL_R_GETPRINTERDRIVER2; - -typedef struct add_jobinfo_1 -{ - UNISTR path; - uint32 job_number; -} ADD_JOBINFO_1; - - -typedef struct spool_q_addjob -{ - POLICY_HND handle; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_ADDJOB; - -typedef struct spool_r_addjob -{ - uint32 status; -} SPOOL_R_ADDJOB; - -/* - * I'm really wondering how many different time formats - * I will have to cope with - * - * JFM, 09/13/98 In a mad mood ;-( -*/ -typedef struct systemtime -{ - uint16 year; - uint16 month; - uint16 dayofweek; - uint16 day; - uint16 hour; - uint16 minute; - uint16 second; - uint16 milliseconds; -} SYSTEMTIME; - -typedef struct s_job_info_1 -{ - uint32 jobid; - UNISTR printername; - UNISTR machinename; - UNISTR username; - UNISTR document; - UNISTR datatype; - UNISTR text_status; - uint32 status; - uint32 priority; - uint32 position; - uint32 totalpages; - uint32 pagesprinted; - SYSTEMTIME submitted; -} JOB_INFO_1; - -typedef struct s_job_info_2 -{ - uint32 jobid; - UNISTR printername; - UNISTR machinename; - UNISTR username; - UNISTR document; - UNISTR notifyname; - UNISTR datatype; - UNISTR printprocessor; - UNISTR parameters; - UNISTR drivername; - DEVICEMODE *devmode; - UNISTR text_status; -/* SEC_DESC sec_desc;*/ - uint32 status; - uint32 priority; - uint32 position; - uint32 starttime; - uint32 untiltime; - uint32 totalpages; - uint32 size; - SYSTEMTIME submitted; - uint32 timeelapsed; - uint32 pagesprinted; -} JOB_INFO_2; - -typedef struct spool_q_enumjobs -{ - POLICY_HND handle; - uint32 firstjob; - uint32 numofjobs; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_ENUMJOBS; - -typedef struct spool_r_enumjobs -{ - uint32 level; - union { - JOB_INFO_1 **job_info_1; - JOB_INFO_2 **job_info_2; - void *info; - } job; - uint32 offered; - uint32 numofjobs; - uint32 status; -} SPOOL_R_ENUMJOBS; - -typedef struct spool_q_schedulejob -{ - POLICY_HND handle; - uint32 jobid; -} SPOOL_Q_SCHEDULEJOB; - -typedef struct spool_r_schedulejob -{ - uint32 status; -} SPOOL_R_SCHEDULEJOB; - -typedef struct s_port_info_1 -{ - UNISTR port_name; -} PORT_INFO_1; - -typedef struct s_port_info_2 -{ - UNISTR port_name; - UNISTR monitor_name; - UNISTR description; - uint32 port_type; - uint32 reserved; -} PORT_INFO_2; - -typedef struct spool_q_enumports -{ - UNISTR2 name; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_ENUMPORTS; - -typedef struct spool_r_enumports -{ - uint32 level; - union { - PORT_INFO_1 *port_info_1; - PORT_INFO_2 *port_info_2; - } port; - uint32 offered; - uint32 numofports; - uint32 status; -} SPOOL_R_ENUMPORTS; - -#define JOB_CONTROL_PAUSE 1 -#define JOB_CONTROL_RESUME 2 -#define JOB_CONTROL_CANCEL 3 -#define JOB_CONTROL_RESTART 4 -#define JOB_CONTROL_DELETE 5 - -typedef struct spool_q_setjob -{ - POLICY_HND handle; - uint32 jobid; - uint32 level; - union { - JOB_INFO_1 job_info_1; - JOB_INFO_2 job_info_2; - } job; - uint32 command; -} SPOOL_Q_SETJOB; - -typedef struct spool_r_setjob -{ - uint32 status; -} SPOOL_R_SETJOB; - -typedef struct spool_q_enumprinterdrivers -{ - UNISTR2 name; - UNISTR2 environment; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_ENUMPRINTERDRIVERS; - -typedef struct spool_r_enumprinterdrivers -{ - uint32 level; - union { - DRIVER_INFO_1 *driver_info_1; - DRIVER_INFO_2 *driver_info_2; - DRIVER_INFO_3 *driver_info_3; - } driver; - uint32 offered; - uint32 numofdrivers; - uint32 status; -} SPOOL_R_ENUMPRINTERDRIVERS; - -typedef struct spool_form_1 -{ - uint32 flag; - UNISTR name; - uint32 width; - uint32 length; - uint32 left; - uint32 top; - uint32 right; - uint32 bottom; -} FORM_1; - -typedef struct spool_q_enumforms -{ - POLICY_HND handle; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_ENUMFORMS; - -typedef struct spool_r_enumforms -{ - uint32 level; - FORM_1 *forms_1; - uint32 offered; - uint32 numofforms; - uint32 status; -} SPOOL_R_ENUMFORMS; - - -typedef struct spool_printer_info_level_2 -{ - uint32 servername_ptr; - uint32 printername_ptr; - uint32 sharename_ptr; - uint32 portname_ptr; - uint32 drivername_ptr; - uint32 comment_ptr; - uint32 location_ptr; - uint32 devmode_ptr; - uint32 sepfile_ptr; - uint32 printprocessor_ptr; - uint32 datatype_ptr; - uint32 parameters_ptr; - uint32 secdesc_ptr; - uint32 attributes; - uint32 priority; - uint32 default_priority; - uint32 starttime; - uint32 untiltime; - uint32 status; - uint32 cjobs; - uint32 averageppm; - UNISTR2 servername; - UNISTR2 printername; - UNISTR2 sharename; - UNISTR2 portname; - UNISTR2 drivername; - UNISTR2 comment; - UNISTR2 location; - UNISTR2 sepfile; - UNISTR2 printprocessor; - UNISTR2 datatype; - UNISTR2 parameters; - SEC_DESC_BUF *secdesc; -} SPOOL_PRINTER_INFO_LEVEL_2; - -typedef struct spool_printer_info_level -{ - SPOOL_PRINTER_INFO_LEVEL_2 *info_2; -} SPOOL_PRINTER_INFO_LEVEL; - -typedef struct spool_printer_driver_info_level_3 -{ - uint32 cversion; - uint32 name_ptr; - uint32 environment_ptr; - uint32 driverpath_ptr; - uint32 datafile_ptr; - uint32 configfile_ptr; - uint32 helpfile_ptr; - uint32 monitorname_ptr; - uint32 defaultdatatype_ptr; - uint32 dependentfilessize; - uint32 dependentfiles_ptr; - - UNISTR2 name; - UNISTR2 environment; - UNISTR2 driverpath; - UNISTR2 datafile; - UNISTR2 configfile; - UNISTR2 helpfile; - UNISTR2 monitorname; - UNISTR2 defaultdatatype; - BUFFER5 dependentfiles; - -} SPOOL_PRINTER_DRIVER_INFO_LEVEL_3; - -typedef struct spool_printer_driver_info_level -{ - SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *info_3; -} SPOOL_PRINTER_DRIVER_INFO_LEVEL; - - -/* this struct is undocumented */ -/* thanks to the ddk ... */ -typedef struct spool_user_level_1 -{ - uint32 size; - uint32 client_name_ptr; - uint32 user_name_ptr; - uint32 build; - uint32 major; - uint32 minor; - uint32 processor; - UNISTR2 client_name; - UNISTR2 user_name; -} SPOOL_USER_LEVEL_1; - -typedef struct spool_user_level -{ - SPOOL_USER_LEVEL_1 *user_level_1; -} SPOOL_USER_LEVEL; - -typedef struct spool_q_setprinter -{ - POLICY_HND handle; - uint32 level; - SPOOL_PRINTER_INFO_LEVEL info; - - DEVICEMODE *devmode; - struct - { - uint32 size_of_buffer; - uint32 data; - } security; - - uint32 command; -} SPOOL_Q_SETPRINTER; - -typedef struct spool_r_setprinter -{ - uint32 status; -} SPOOL_R_SETPRINTER; - -typedef struct spool_q_addprinter -{ - UNISTR2 server_name; - uint32 level; - SPOOL_PRINTER_INFO_LEVEL info; - uint32 unk0; - uint32 unk1; - uint32 unk2; - uint32 unk3; - uint32 user_level; - SPOOL_USER_LEVEL user; -} SPOOL_Q_ADDPRINTER; - -typedef struct spool_r_addprinter -{ - uint32 status; -} SPOOL_R_ADDPRINTER; - -typedef struct spool_q_addprinterex -{ - UNISTR2 server_name; - uint32 level; - SPOOL_PRINTER_INFO_LEVEL info; - uint32 unk0; - uint32 unk1; - uint32 unk2; - uint32 unk3; - uint32 user_level; - SPOOL_USER_LEVEL user; -} SPOOL_Q_ADDPRINTEREX; - - -typedef struct spool_r_addprinterex -{ - POLICY_HND handle; - uint32 status; -} SPOOL_R_ADDPRINTEREX; - -typedef struct spool_q_addprinterdriver -{ - UNISTR2 server_name; - uint32 level; - SPOOL_PRINTER_DRIVER_INFO_LEVEL info; -} SPOOL_Q_ADDPRINTERDRIVER; - -typedef struct spool_r_addprinterdriver -{ - uint32 status; -} SPOOL_R_ADDPRINTERDRIVER; - -typedef struct spool_q_getprinterdriverdirectory -{ - UNISTR2 name; - UNISTR2 environment; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_GETPRINTERDRIVERDIR; - -typedef struct driver_directory_1 -{ - UNISTR name; -} DRIVER_DIRECTORY_1 ; - -typedef struct spool_r_getprinterdriverdirectory -{ - uint32 level; - union { - DRIVER_DIRECTORY_1 driver_info_1; - } driver; - uint32 offered; - uint32 status; -} SPOOL_R_GETPRINTERDRIVERDIR; - -typedef struct spool_q_enumprintprocessors -{ - UNISTR2 name; - UNISTR2 environment; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_ENUMPRINTPROCESSORS; - -typedef struct printprocessor_1 -{ - UNISTR name; -} PRINTPROCESSOR_1; - -typedef struct spool_r_enumprintprocessors -{ - uint32 level; - PRINTPROCESSOR_1 *info_1; - uint32 offered; - uint32 numofprintprocessors; - uint32 status; -} SPOOL_R_ENUMPRINTPROCESSORS; - -typedef struct spool_q_enumprintprocessordatatypes -{ - UNISTR2 name; - UNISTR2 printprocessor; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_ENUMPRINTPROCESSORDATATYPES; - -typedef struct ppdatatype_1 -{ - UNISTR name; -} PPDATATYPE_1; - -typedef struct spool_r_enumprintprocessordatatypes -{ - uint32 level; - PPDATATYPE_1 *info_1; - uint32 offered; - uint32 numofppdatatypes; - uint32 status; -} SPOOL_R_ENUMPRINTPROCESSORDATATYPES; - -typedef struct spool_q_enumprintmonitors -{ - UNISTR2 name; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_ENUMPRINTMONITORS; - -typedef struct printmonitor_1 -{ - UNISTR name; -} PRINTMONITOR_1; - -typedef struct spool_r_enumprintmonitors -{ - uint32 level; - PRINTMONITOR_1 *info_1; - uint32 offered; - uint32 numofprintmonitors; - uint32 status; -} SPOOL_R_ENUMPRINTMONITORS; - -typedef struct spool_q_enumprinterdata -{ - POLICY_HND handle; - uint32 index; - uint32 valuesize; - uint32 datasize; -} SPOOL_Q_ENUMPRINTERDATA; - -typedef struct spool_r_enumprinterdata -{ - uint32 valuesize; - UNISTR value; - uint32 realvaluesize; - uint32 type; - uint32 datasize; - uint8 *data; - uint32 realdatasize; - uint32 status; -} SPOOL_R_ENUMPRINTERDATA; - -typedef struct spool_q_setprinterdata -{ - POLICY_HND handle; - UNISTR2 value; - uint32 type; - uint32 max_len; - uint8 *data; - uint32 real_len; - uint32 numeric_data; -} SPOOL_Q_SETPRINTERDATA; - -typedef struct spool_r_setprinterdata -{ - uint32 status; -} SPOOL_R_SETPRINTERDATA; - -typedef struct _form -{ - uint32 flags; - uint32 name_ptr; - uint32 size_x; - uint32 size_y; - uint32 left; - uint32 top; - uint32 right; - uint32 bottom; - UNISTR2 name; -} FORM; - -typedef struct spool_q_addform -{ - POLICY_HND handle; - uint32 level; - uint32 level2; - FORM form; -} SPOOL_Q_ADDFORM; - -typedef struct spool_r_addform -{ - uint32 status; -} SPOOL_R_ADDFORM; - -typedef struct spool_q_setform -{ - POLICY_HND handle; - UNISTR2 name; - uint32 level; - uint32 level2; - FORM form; -} SPOOL_Q_SETFORM; - -typedef struct spool_r_setform -{ - uint32 status; -} SPOOL_R_SETFORM; - -typedef struct spool_q_getjob -{ - POLICY_HND handle; - uint32 jobid; - uint32 level; - BUFFER buffer; - uint32 buf_size; -} SPOOL_Q_GETJOB; - -typedef struct spool_r_getjob -{ - uint32 level; - union { - JOB_INFO_1 *job_info_1; - JOB_INFO_2 *job_info_2; - } job; - uint32 offered; - uint32 status; -} SPOOL_R_GETJOB; - -#define PRINTER_DRIVER_VERSION 2 -#define PRINTER_DRIVER_ARCHITECTURE "Windows NT x86" - - -#endif /* _RPC_SPOOLSS_H */ - diff --git a/source3/include/rpc_svcctl.h b/source3/include/rpc_svcctl.h deleted file mode 100644 index ecd1188fe8..0000000000 --- a/source3/include/rpc_svcctl.h +++ /dev/null @@ -1,288 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB parameters and setup - 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. -*/ - -#ifndef _RPC_SVCCTL_H /* _RPC_SVCCTL_H */ -#define _RPC_SVCCTL_H - - -/* svcctl pipe */ -#define SVC_OPEN_SC_MAN 0x0f -#define SVC_ENUM_SVCS_STATUS 0x0e -#define SVC_QUERY_SVC_CONFIG 0x11 -#define SVC_QUERY_DISP_NAME 0x14 -#define SVC_CHANGE_SVC_CONFIG 0x0b -#define SVC_OPEN_SERVICE 0x10 -#define SVC_START_SERVICE 0x13 -#define SVC_STOP_SERVICE 0x01 -#define SVC_CLOSE 0x00 - - -/* SVC_Q_OPEN_SC_MAN */ -typedef struct q_svc_open_sc_man_info -{ - uint32 ptr_srv_name; /* pointer (to server name?) */ - UNISTR2 uni_srv_name; /* unicode server name starting with '\\' */ - - uint32 ptr_db_name; /* pointer (to database name?) */ - UNISTR2 uni_db_name; /* unicode database name */ - - uint32 des_access; /* 0x80000004 - SC_MANAGER_xxxx */ - -} SVC_Q_OPEN_SC_MAN; - -/* SVC_R_OPEN_SC_MAN */ -typedef struct r_svc_open_sc_man_info -{ - POLICY_HND pol; - uint32 status; /* return status */ - -} SVC_R_OPEN_SC_MAN; - -/* SVC_Q_OPEN_SERVICE */ -typedef struct q_svc_open_service_info -{ - POLICY_HND scman_pol; - UNISTR2 uni_svc_name; /* unicode service name */ - uint32 des_access; /* 0x8000 0001 */ - -} SVC_Q_OPEN_SERVICE; - -/* SVC_R_OPEN_SERVICE */ -typedef struct r_svc_open_service_info -{ - POLICY_HND pol; - uint32 status; /* return status */ - -} SVC_R_OPEN_SERVICE; - -#define MAX_SVC_ARGS 10 - -/* SVC_Q_STOP_SERVICE */ -typedef struct q_svc_stop_service_info -{ - POLICY_HND pol; - - uint32 unknown; - -} SVC_Q_STOP_SERVICE; - -/* SVC_R_STOP_SERVICE */ -typedef struct r_svc_stop_service_info -{ - uint32 unknown0; /* 0x00000020 */ - uint32 unknown1; /* 0x00000001 */ - uint32 unknown2; /* 0x00000001 */ - uint32 unknown3; /* 0x00000000 */ - uint32 unknown4; /* 0x00000000 */ - uint32 unknown5; /* 0x00000000 */ - uint32 unknown6; /* 0x00000000 */ - uint32 status; - -} SVC_R_STOP_SERVICE; - -/* SVC_Q_START_SERVICE */ -typedef struct q_svc_start_service_info -{ - POLICY_HND pol; - - uint32 argc; - uint32 ptr_args; - uint32 argc2; - uint32 ptr_argv[MAX_SVC_ARGS]; - UNISTR2 argv[MAX_SVC_ARGS]; - -} SVC_Q_START_SERVICE; - -/* SVC_R_START_SERVICE */ -typedef struct r_svc_start_service_info -{ - uint32 status; - -} SVC_R_START_SERVICE; - - -/* QUERY_SERVICE_CONFIG */ -typedef struct query_service_config_info -{ - uint32 service_type; - uint32 start_type; - uint32 error_control; - uint32 ptr_bin_path_name; - uint32 ptr_load_order_grp; - uint32 tag_id; - uint32 ptr_dependencies; - uint32 ptr_service_start_name; - uint32 ptr_display_name; - - UNISTR2 uni_bin_path_name; - UNISTR2 uni_load_order_grp; - UNISTR2 uni_dependencies; - UNISTR2 uni_service_start_name; - UNISTR2 uni_display_name; - -} QUERY_SERVICE_CONFIG; - -/* SVC_STATUS */ -typedef struct svc_status_info -{ - uint32 svc_type; - uint32 current_state; - uint32 controls_accepted; - uint32 win32_exit_code; - uint32 svc_specific_exit_code; - uint32 check_point; - uint32 wait_hint; - -} SVC_STATUS; - -/* ENUM_SRVC_STATUS */ -typedef struct enum_svc_status_info -{ - UNISTR uni_srvc_name; - UNISTR uni_disp_name; - SVC_STATUS status; - -} ENUM_SRVC_STATUS; - -/* SVC_Q_ENUM_SVCS_STATUS */ -typedef struct q_svc_enum_svcs_status_info -{ - POLICY_HND pol; - uint32 service_type; /* 0x00000030 - win32 | 0x0000000b - driver */ - uint32 service_state; /* 0x00000003 - state_all */ - uint32 buf_size; /* max service buffer size */ - ENUM_HND resume_hnd; /* resume handle */ - -} SVC_Q_ENUM_SVCS_STATUS; - -/* SVC_R_ENUM_SVCS_STATUS */ -typedef struct r_svc_enum_svcs_status_info -{ - uint32 buf_size; /* service buffer size */ - ENUM_SRVC_STATUS *svcs; - uint32 more_buf_size; - uint32 num_svcs; - ENUM_HND resume_hnd; /* resume handle */ - uint32 dos_status; /* return status, DOS error code (wow!) */ - -} SVC_R_ENUM_SVCS_STATUS; - - -/* SVC_Q_QUERY_SVC_CONFIG */ -typedef struct q_svc_query_svc_cfg_info -{ - POLICY_HND pol; - uint32 buf_size; - -} SVC_Q_QUERY_SVC_CONFIG; - - -/* SVC_R_QUERY_SVC_CONFIG */ -typedef struct r_svc_query_svc_cfg_info -{ - QUERY_SERVICE_CONFIG *cfg; - uint32 buf_size; - uint32 status; /* return status */ - -} SVC_R_QUERY_SVC_CONFIG; - - -/* SVC_Q_QUERY_DISP_NAME */ -typedef struct q_svc_query_disp_name_info -{ - POLICY_HND scman_pol; - UNISTR2 uni_svc_name; - uint32 buf_size; - -} SVC_Q_QUERY_DISP_NAME; - - -/* SVC_R_QUERY_DISP_NAME */ -typedef struct r_svc_query_disp_name_info -{ - UNISTR2 uni_disp_name; - uint32 buf_size; - uint32 status; - -} SVC_R_QUERY_DISP_NAME; - - -/* SVC_Q_CLOSE */ -typedef struct q_svc_close_info -{ - POLICY_HND pol; - -} SVC_Q_CLOSE; - - - -/* SVC_R_CLOSE */ -typedef struct r_svc_close_info -{ - POLICY_HND pol; - uint32 status; /* return status */ - -} SVC_R_CLOSE; - -/* SVC_Q_CHANGE_SVC_CONFIG */ -typedef struct q_svc_change_svc_cfg_info -{ - POLICY_HND pol; - uint32 service_type; - uint32 start_type; - uint32 unknown_0; - uint32 error_control; - - uint32 ptr_bin_path_name; - UNISTR2 uni_bin_path_name; - - uint32 ptr_load_order_grp; - UNISTR2 uni_load_order_grp; - - uint32 tag_id; - - uint32 ptr_dependencies; - UNISTR2 uni_dependencies; - - uint32 ptr_service_start_name; - UNISTR2 uni_service_start_name; - - uint32 ptr_password; - STRING2 str_password; - - uint32 ptr_display_name; - UNISTR2 uni_display_name; - -} SVC_Q_CHANGE_SVC_CONFIG; - -/* SVC_R_CHANGE_SVC_CONFIG */ -typedef struct r_svc_change_svc_cfg_info -{ - uint32 unknown_0; /* */ - uint32 status; /* return status */ - -} SVC_R_CHANGE_SVC_CONFIG; - - -#endif /* _RPC_SVCCTL_H */ - diff --git a/source3/include/safe_string.h b/source3/include/safe_string.h deleted file mode 100644 index 3b2f2c32d6..0000000000 --- a/source3/include/safe_string.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Safe string handling routines. - Copyright (C) Andrew Tridgell 1994-1998 - - 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. -*/ - -#ifndef _SAFE_STRING_H -#define _SAFE_STRING_H - -#ifdef strcpy -#undef strcpy -#endif /* strcpy */ -#define strcpy(dest,src) __ERROR__XX__NEVER_USE_STRCPY___; - -#ifdef strcat -#undef strcat -#endif /* strcat */ -#define strcat(dest,src) __ERROR__XX__NEVER_USE_STRCAT___; - -#ifdef sprintf -#undef sprintf -#endif /* sprintf */ -#define sprintf __ERROR__XX__NEVER_USE_SPRINTF__; - -#define pstrcpy(d,s) safe_strcpy((d),(s),sizeof(pstring)-1) -#define pstrcat(d,s) safe_strcat((d),(s),sizeof(pstring)-1) -#define fstrcpy(d,s) safe_strcpy((d),(s),sizeof(fstring)-1) -#define fstrcat(d,s) safe_strcat((d),(s),sizeof(fstring)-1) - -#endif diff --git a/source3/include/smb_macros.h b/source3/include/smb_macros.h deleted file mode 100644 index 979aec1d2c..0000000000 --- a/source3/include/smb_macros.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB parameters and setup - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) John H Terpstra 1996-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - Copyright (C) Paul Ashton 1998 - 1999 - - 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. -*/ - -#ifndef _SMB_MACROS_H -#define _SMB_MACROS_H - -/* Misc bit macros */ -#define BOOLSTR(b) ((b) ? "Yes" : "No") -#define BITSETB(ptr,bit) ((((char *)ptr)[0] & (1<<(bit)))!=0) -#define BITSETW(ptr,bit) ((SVAL(ptr,0) & (1<<(bit)))!=0) - -#define IS_BITS_SET_ALL(var,bit) (((var)&(bit))==(bit)) -#define IS_BITS_SET_SOME(var,bit) (((var)&(bit))!=0) -#define IS_BITS_CLR_ALL(var,bit) (((var)&(bit))==0) -#define IS_BITS_CLR_SOME(var,bit) (((var)&(bit))!=(bit)) - -/* for readability... */ -#define IS_DOS_READONLY(test_mode) (((test_mode) & aRONLY) != 0) -#define IS_DOS_DIR(test_mode) (((test_mode) & aDIR) != 0) -#define IS_DOS_ARCHIVE(test_mode) (((test_mode) & aARCH) != 0) -#define IS_DOS_SYSTEM(test_mode) (((test_mode) & aSYSTEM) != 0) -#define IS_DOS_HIDDEN(test_mode) (((test_mode) & aHIDDEN) != 0) - -/* zero a structure */ -#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x)) - -/* zero a structure given a pointer to the structure */ -#define ZERO_STRUCTP(x) { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } - -/* zero an array - note that sizeof(array) must work - ie. it must not be a - pointer */ -#define ZERO_ARRAY(x) memset((char *)(x), 0, sizeof(x)) - -/* pointer difference macro */ -#define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2))) - -/* assert macros */ -#define SMB_ASSERT(b) ((b)?(void)0: \ - (DEBUG(0,("PANIC: assert failed at %s(%d)\n", \ - __FILE__, __LINE__)), smb_panic("assert failed"))) -#define SMB_ASSERT_ARRAY(a,n) SMB_ASSERT((sizeof(a)/sizeof((a)[0])) >= (n)) - -/* these are useful macros for checking validity of handles */ -#define OPEN_FSP(fsp) ((fsp) && (fsp)->open && !(fsp)->is_directory) -#define OPEN_CONN(conn) ((conn) && (conn)->open) -#define IS_IPC(conn) ((conn) && (conn)->ipc) -#define IS_PRINT(conn) ((conn) && (conn)->printer) -#define FNUM_OK(fsp,c) (OPEN_FSP(fsp) && (c)==(fsp)->conn) - -#define CHECK_FSP(fsp,conn) if (!FNUM_OK(fsp,conn)) \ - return(ERROR(ERRDOS,ERRbadfid)) -#define CHECK_READ(fsp) if (!(fsp)->can_read) \ - return(ERROR(ERRDOS,ERRbadaccess)) -#define CHECK_WRITE(fsp) if (!(fsp)->can_write) \ - return(ERROR(ERRDOS,ERRbadaccess)) -#define CHECK_ERROR(fsp) if (HAS_CACHED_ERROR(fsp)) \ - return(CACHED_ERROR(fsp)) - -/* translates a connection number into a service number */ -#define SNUM(conn) ((conn)?(conn)->service:-1) - -/* access various service details */ -#define SERVICE(snum) (lp_servicename(snum)) -#define PRINTCAP (lp_printcapname()) -#define PRINTCOMMAND(snum) (lp_printcommand(snum)) -#define PRINTERNAME(snum) (lp_printername(snum)) -#define CAN_WRITE(conn) (!conn->read_only) -#define VALID_SNUM(snum) (lp_snum_ok(snum)) -#define GUEST_OK(snum) (VALID_SNUM(snum) && lp_guest_ok(snum)) -#define GUEST_ONLY(snum) (VALID_SNUM(snum) && lp_guest_only(snum)) -#define CAN_SETDIR(snum) (!lp_no_set_dir(snum)) -#define CAN_PRINT(conn) ((conn) && lp_print_ok((conn)->service)) -#define MAP_HIDDEN(conn) ((conn) && lp_map_hidden((conn)->service)) -#define MAP_SYSTEM(conn) ((conn) && lp_map_system((conn)->service)) -#define MAP_ARCHIVE(conn) ((conn) && lp_map_archive((conn)->service)) -#define IS_HIDDEN_PATH(conn,path) ((conn) && is_in_path((path),(conn)->hide_list)) -#define IS_VETO_PATH(conn,path) ((conn) && is_in_path((path),(conn)->veto_list)) -#define IS_VETO_OPLOCK_PATH(conn,path) ((conn) && is_in_path((path),(conn)->veto_oplock_list)) - -/* - * Used by the stat cache code to check if a returned - * stat structure is valid. - */ - -#define VALID_STAT(st) (st.st_nlink != 0) -#define VALID_STAT_OF_DIR(st) (VALID_STAT(st) && S_ISDIR(st.st_mode)) - -#define SMBENCRYPT() (lp_encrypted_passwords()) - -#ifndef MIN -#define MIN(a,b) ((a)<(b)?(a):(b)) -#endif -#ifndef MAX -#define MAX(a,b) ((a)>(b)?(a):(b)) -#endif - -#ifndef ABS -#define ABS(a) ((a)>0?(a):(-(a))) -#endif - -/* Macros to get at offsets within smb_lkrng and smb_unlkrng - structures. We cannot define these as actual structures - due to possible differences in structure packing - on different machines/compilers. */ - -#define SMB_LPID_OFFSET(indx) (10 * (indx)) -#define SMB_LKOFF_OFFSET(indx) ( 2 + (10 * (indx))) -#define SMB_LKLEN_OFFSET(indx) ( 6 + (10 * (indx))) -#define SMB_LARGE_LKOFF_OFFSET_HIGH(indx) (4 + (20 * (indx))) -#define SMB_LARGE_LKOFF_OFFSET_LOW(indx) (8 + (20 * (indx))) -#define SMB_LARGE_LKLEN_OFFSET_HIGH(indx) (12 + (20 * (indx))) -#define SMB_LARGE_LKLEN_OFFSET_LOW(indx) (16 + (20 * (indx))) - -/* Macro to cache an error in a write_bmpx_struct */ -#define CACHE_ERROR(w,c,e) ((w)->wr_errclass = (c), (w)->wr_error = (e), \ - w->wr_discard = True, -1) -/* Macro to test if an error has been cached for this fnum */ -#define HAS_CACHED_ERROR(fsp) ((fsp)->open && (fsp)->wbmpx_ptr && \ - (fsp)->wbmpx_ptr->wr_discard) -/* Macro to turn the cached error into an error packet */ -#define CACHED_ERROR(fsp) cached_error_packet(inbuf,outbuf,fsp,__LINE__) - -/* these are the datagram types */ -#define DGRAM_DIRECT_UNIQUE 0x10 - -#define ERROR(class,x) error_packet(inbuf,outbuf,class,x,__LINE__) - -/* this is how errors are generated */ -#define UNIXERROR(defclass,deferror) unix_error_packet(inbuf,outbuf,defclass,deferror,__LINE__) - -#define SMB_ROUNDUP(x,g) (((x)+((g)-1))&~((g)-1)) - -#endif /* _SMB_MACROS_H */ diff --git a/source3/include/vagent.h b/source3/include/vagent.h deleted file mode 100644 index c8b85181e4..0000000000 --- a/source3/include/vagent.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Vagent structures and parameters - Copyright (C) Luke Kenneth Casson Leighton 1999 - - 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. -*/ - -#ifndef _VAGENT_H -#define _VAGENT_H - -/* Vagent operations structure */ - -struct sock_redir -{ - int c; - int s; - int c_id; - int s_id; - void *n; -}; - -struct vagent_ops -{ - void (*free_sock)(void* sock); - int (*get_agent_sock)(char* id); - - BOOL (*process_cli_sock)(struct sock_redir **socks, uint32 num_socks, - struct sock_redir *sock); - BOOL (*process_srv_sock)(struct sock_redir **socks, uint32 num_socks, - int fd); - - char* id; - struct sock_redir **socks; - uint32 num_socks; -}; - -#endif /* _VAGENT_H */ diff --git a/source3/include/vfs.h b/source3/include/vfs.h deleted file mode 100644 index d4ca8823ca..0000000000 --- a/source3/include/vfs.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - VFS structures and parameters - Copyright (C) Tim Potter 1999 - - 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. -*/ - -#ifndef _VFS_H -#define _VFS_H - -/* Types used in the definition of VFS operations. These are included - here so the vfs.h file can be included by VFS modules without - having to pull in unnecessary amounts of other stuff. Note to VFS - writers: you must include config.h before including this file. - The following type definitions reference the HAVE_* symbols which - are defined in config.h */ - -#ifndef SMB_OFF_T -# ifdef HAVE_OFF64_T -# define SMB_OFF_T off64_t -# else -# define SMB_OFF_T off_t -# endif -#endif - -#ifndef SMB_STRUCT_STAT -# if defined(HAVE_STAT64) && defined(HAVE_OFF64_T) -# define SMB_STRUCT_STAT struct stat64 -# else -# define SMB_STRUCT_STAT struct stat -# endif -#endif - -#ifndef _BOOL -typedef int BOOL; -#endif - -#ifndef _PSTRING -#define PSTRING_LEN 1024 -#define FSTRING_LEN 128 - -typedef char pstring[PSTRING_LEN]; -typedef char fstring[FSTRING_LEN]; -#define _PSTRING -#endif - -#if defined(HAVE_LONGLONG) -#define SMB_BIG_UINT unsigned long long -#else -#define SMB_BIG_UINT unsigned long -#endif - -/* Information from the connection_struct passed to the vfs layer */ - -struct vfs_connection_struct { - - /* Connection information */ - - BOOL printer; - BOOL ipc; - BOOL read_only; - BOOL admin_user; - - /* Paths */ - - pstring dirpath; - pstring connectpath; - pstring origpath; - pstring service; - - /* Information on user who *opened* this connection */ - - pstring user; - uid_t uid; - gid_t gid; - int ngroups; - gid_t *groups; -}; - -/* Avoid conflict with an AIX include file */ - -#ifdef vfs_ops -#undef vfs_ops -#endif - -/* VFS operations structure */ - -struct vfs_ops { - - /* Disk operations */ - - int (*connect)(struct vfs_connection_struct *conn, char *service, - char *user); - void (*disconnect)(void); - SMB_BIG_UINT (*disk_free)(char *path, SMB_BIG_UINT *bsize, - SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize); - - /* Directory operations */ - - DIR *(*opendir)(char *fname); - struct dirent *(*readdir)(DIR *dirp); - int (*mkdir)(char *path, mode_t mode); - int (*rmdir)(char *path); - int (*closedir)(DIR *dir); - - /* File operations */ - - int (*open)(char *fname, int flags, mode_t mode); - int (*close)(int fd); - ssize_t (*read)(int fd, char *data, size_t n); - ssize_t (*write)(int fd, char *data, size_t n); - SMB_OFF_T (*lseek)(int filedes, SMB_OFF_T offset, int whence); - int (*rename)(char *old, char *new); - void (*sync)(int fd); - int (*stat)(char *fname, SMB_STRUCT_STAT *sbuf); - int (*fstat)(int fd, SMB_STRUCT_STAT *sbuf); - int (*lstat)(char *path, SMB_STRUCT_STAT *sbuf); - BOOL (*lock)(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type); - int (*unlink)(char *path); - int (*chmod)(char *path, mode_t mode); - int (*utime)(char *path, struct utimbuf *times); -}; - -/* VFS options for configuration file */ - -struct vfs_options { - struct vfs_options *prev, *next; - char *name; - char *value; -}; - -#endif /* _VFS_H */ diff --git a/source3/lib/domain_namemap.c b/source3/lib/domain_namemap.c deleted file mode 100644 index 9c94783239..0000000000 --- a/source3/lib/domain_namemap.c +++ /dev/null @@ -1,1315 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Groupname handling - Copyright (C) Jeremy Allison 1998. - - 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. -*/ - -/* - * UNIX gid and Local or Domain SID resolution. This module resolves - * only those entries in the map files, it is *NOT* responsible for - * resolving UNIX groups not listed: that is an entirely different - * matter, altogether... - */ - -/* - * - * - - format of the file is: - - unixname NT Group name - unixname Domain Admins (well-known Domain Group) - unixname DOMAIN_NAME\NT Group name - unixname OTHER_DOMAIN_NAME\NT Group name - unixname DOMAIN_NAME\Domain Admins (well-known Domain Group) - .... - - if the DOMAIN_NAME\ component is left off, then your own domain is assumed. - - * - * - */ - - -#include "includes.h" -extern int DEBUGLEVEL; - -extern fstring global_myworkgroup; -extern DOM_SID global_member_sid; -extern fstring global_sam_name; -extern DOM_SID global_sam_sid; -extern DOM_SID global_sid_S_1_5_20; - -/******************************************************************* - converts UNIX uid to an NT User RID. NOTE: IS SOMETHING SPECIFIC TO SAMBA - ********************************************************************/ -static uid_t pwdb_user_rid_to_uid(uint32 user_rid) -{ - return ((user_rid & (~RID_TYPE_USER))- 1000)/RID_MULTIPLIER; -} - -/******************************************************************* - converts NT Group RID to a UNIX uid. NOTE: IS SOMETHING SPECIFIC TO SAMBA - ********************************************************************/ -static uint32 pwdb_group_rid_to_gid(uint32 group_rid) -{ - return ((group_rid & (~RID_TYPE_GROUP))- 1000)/RID_MULTIPLIER; -} - -/******************************************************************* - converts NT Alias RID to a UNIX uid. NOTE: IS SOMETHING SPECIFIC TO SAMBA - ********************************************************************/ -static uint32 pwdb_alias_rid_to_gid(uint32 alias_rid) -{ - return ((alias_rid & (~RID_TYPE_ALIAS))- 1000)/RID_MULTIPLIER; -} - -/******************************************************************* - converts NT Group RID to a UNIX uid. NOTE: IS SOMETHING SPECIFIC TO SAMBA - ********************************************************************/ -static uint32 pwdb_gid_to_group_rid(uint32 gid) -{ - uint32 grp_rid = ((((gid)*RID_MULTIPLIER) + 1000) | RID_TYPE_GROUP); - return grp_rid; -} - -/****************************************************************** - converts UNIX gid to an NT Alias RID. NOTE: IS SOMETHING SPECIFIC TO SAMBA - ********************************************************************/ -static uint32 pwdb_gid_to_alias_rid(uint32 gid) -{ - uint32 alias_rid = ((((gid)*RID_MULTIPLIER) + 1000) | RID_TYPE_ALIAS); - return alias_rid; -} - -/******************************************************************* - converts UNIX uid to an NT User RID. NOTE: IS SOMETHING SPECIFIC TO SAMBA - ********************************************************************/ -static uint32 pwdb_uid_to_user_rid(uint32 uid) -{ - uint32 user_rid = ((((uid)*RID_MULTIPLIER) + 1000) | RID_TYPE_USER); - return user_rid; -} - -/****************************************************************** - converts SID + SID_NAME_USE type to a UNIX id. the Domain SID is, - and can only be, our own SID. - ********************************************************************/ -static BOOL pwdb_sam_sid_to_unixid(DOM_SID *sid, uint8 type, uint32 *id) -{ - DOM_SID tmp_sid; - uint32 rid; - - sid_copy(&tmp_sid, sid); - sid_split_rid(&tmp_sid, &rid); - if (!sid_equal(&global_sam_sid, &tmp_sid)) - { - return False; - } - - switch (type) - { - case SID_NAME_USER: - { - *id = pwdb_user_rid_to_uid(rid); - return True; - } - case SID_NAME_ALIAS: - { - *id = pwdb_alias_rid_to_gid(rid); - return True; - } - case SID_NAME_DOM_GRP: - case SID_NAME_WKN_GRP: - { - *id = pwdb_group_rid_to_gid(rid); - return True; - } - } - return False; -} - -/****************************************************************** - converts UNIX gid + SID_NAME_USE type to a SID. the Domain SID is, - and can only be, our own SID. - ********************************************************************/ -static BOOL pwdb_unixid_to_sam_sid(uint32 id, uint8 type, DOM_SID *sid) -{ - sid_copy(sid, &global_sam_sid); - switch (type) - { - case SID_NAME_USER: - { - sid_append_rid(sid, pwdb_uid_to_user_rid(id)); - return True; - } - case SID_NAME_ALIAS: - { - sid_append_rid(sid, pwdb_gid_to_alias_rid(id)); - return True; - } - case SID_NAME_DOM_GRP: - case SID_NAME_WKN_GRP: - { - sid_append_rid(sid, pwdb_gid_to_group_rid(id)); - return True; - } - } - return False; -} - -/******************************************************************* - Decides if a RID is a well known RID. - ********************************************************************/ -static BOOL pwdb_rid_is_well_known(uint32 rid) -{ - return (rid < 1000); -} - -/******************************************************************* - determines a rid's type. NOTE: THIS IS SOMETHING SPECIFIC TO SAMBA - ********************************************************************/ -static uint32 pwdb_rid_type(uint32 rid) -{ - /* lkcl i understand that NT attaches an enumeration to a RID - * such that it can be identified as either a user, group etc - * type: SID_ENUM_TYPE. - */ - if (pwdb_rid_is_well_known(rid)) - { - /* - * The only well known user RIDs are DOMAIN_USER_RID_ADMIN - * and DOMAIN_USER_RID_GUEST. - */ - if (rid == DOMAIN_USER_RID_ADMIN || rid == DOMAIN_USER_RID_GUEST) - { - return RID_TYPE_USER; - } - if (DOMAIN_GROUP_RID_ADMINS <= rid && rid <= DOMAIN_GROUP_RID_GUESTS) - { - return RID_TYPE_GROUP; - } - if (BUILTIN_ALIAS_RID_ADMINS <= rid && rid <= BUILTIN_ALIAS_RID_REPLICATOR) - { - return RID_TYPE_ALIAS; - } - } - return (rid & RID_TYPE_MASK); -} - -/******************************************************************* - checks whether rid is a user rid. NOTE: THIS IS SOMETHING SPECIFIC TO SAMBA - ********************************************************************/ -BOOL pwdb_rid_is_user(uint32 rid) -{ - return pwdb_rid_type(rid) == RID_TYPE_USER; -} - -/************************************************************************** - Groupname map functionality. The code loads a groupname map file and - (currently) loads it into a linked list. This is slow and memory - hungry, but can be changed into a more efficient storage format - if the demands on it become excessive. -***************************************************************************/ - -typedef struct name_map -{ - ubi_slNode next; - DOM_NAME_MAP grp; - -} name_map_entry; - -static ubi_slList groupname_map_list; -static ubi_slList aliasname_map_list; -static ubi_slList ntusrname_map_list; - -static void delete_name_entry(name_map_entry *gmep) -{ - if (gmep->grp.nt_name) - { - free(gmep->grp.nt_name); - } - if (gmep->grp.nt_domain) - { - free(gmep->grp.nt_domain); - } - if (gmep->grp.unix_name) - { - free(gmep->grp.unix_name); - } - free((char*)gmep); -} - -/************************************************************************** - Delete all the entries in the name map list. -***************************************************************************/ - -static void delete_map_list(ubi_slList *map_list) -{ - name_map_entry *gmep; - - while ((gmep = (name_map_entry *)ubi_slRemHead(map_list )) != NULL) - { - delete_name_entry(gmep); - } -} - - -/************************************************************************** - makes a group sid out of a domain sid and a _unix_ gid. -***************************************************************************/ -static BOOL make_mydomain_sid(DOM_NAME_MAP *grp, DOM_MAP_TYPE type) -{ - int ret = False; - fstring sid_str; - - if (!map_domain_name_to_sid(&grp->sid, &(grp->nt_domain))) - { - DEBUG(0,("make_mydomain_sid: unknown domain %s\n", - grp->nt_domain)); - return False; - } - - if (sid_equal(&grp->sid, &global_sid_S_1_5_20)) - { - /* - * only builtin aliases are recognised in S-1-5-20 - */ - DEBUG(10,("make_mydomain_sid: group %s in builtin domain\n", - grp->nt_name)); - - if (lookup_builtin_alias_name(grp->nt_name, "BUILTIN", &grp->sid, &grp->type) != 0x0) - { - DEBUG(0,("unix group %s mapped to an unrecognised BUILTIN domain name %s\n", - grp->unix_name, grp->nt_name)); - return False; - } - ret = True; - } - else if (lookup_wk_user_name(grp->nt_name, grp->nt_domain, &grp->sid, &grp->type) == 0x0) - { - if (type != DOM_MAP_USER) - { - DEBUG(0,("well-known NT user %s\\%s listed in wrong map file\n", - grp->nt_domain, grp->nt_name)); - return False; - } - ret = True; - } - else if (lookup_wk_group_name(grp->nt_name, grp->nt_domain, &grp->sid, &grp->type) == 0x0) - { - if (type != DOM_MAP_DOMAIN) - { - DEBUG(0,("well-known NT group %s\\%s listed in wrong map file\n", - grp->nt_domain, grp->nt_name)); - return False; - } - ret = True; - } - else - { - switch (type) - { - case DOM_MAP_USER: - { - grp->type = SID_NAME_USER; - break; - } - case DOM_MAP_DOMAIN: - { - grp->type = SID_NAME_DOM_GRP; - break; - } - case DOM_MAP_LOCAL: - { - grp->type = SID_NAME_ALIAS; - break; - } - } - - ret = pwdb_unixid_to_sam_sid(grp->unix_id, grp->type, &grp->sid); - } - - sid_to_string(sid_str, &grp->sid); - DEBUG(10,("nt name %s\\%s gid %d mapped to %s\n", - grp->nt_domain, grp->nt_name, grp->unix_id, sid_str)); - return ret; -} - -/************************************************************************** - makes a group sid out of an nt domain, nt group name or a unix group name. -***************************************************************************/ -static BOOL unix_name_to_nt_name_info(DOM_NAME_MAP *map, DOM_MAP_TYPE type) -{ - /* - * Attempt to get the unix gid_t for this name. - */ - - DEBUG(5,("unix_name_to_nt_name_info: unix_name:%s\n", map->unix_name)); - - if (type == DOM_MAP_USER) - { - const struct passwd *pwptr = Get_Pwnam(map->unix_name, False); - if (pwptr == NULL) - { - DEBUG(0,("unix_name_to_nt_name_info: Get_Pwnam for user %s\ -failed. Error was %s.\n", map->unix_name, strerror(errno) )); - return False; - } - - map->unix_id = (uint32)pwptr->pw_uid; - } - else - { - struct group *gptr = getgrnam(map->unix_name); - if (gptr == NULL) - { - DEBUG(0,("unix_name_to_nt_name_info: getgrnam for group %s\ -failed. Error was %s.\n", map->unix_name, strerror(errno) )); - return False; - } - - map->unix_id = (uint32)gptr->gr_gid; - } - - DEBUG(5,("unix_name_to_nt_name_info: unix gid:%d\n", map->unix_id)); - - /* - * Now map the name to an NT SID+RID. - */ - - if (map->nt_domain != NULL && !strequal(map->nt_domain, global_sam_name)) - { - /* Must add client-call lookup code here, to - * resolve remote domain's sid and the group's rid, - * in that domain. - * - * NOTE: it is _incorrect_ to put code here that assumes - * we are responsible for lookups for foriegn domains' RIDs. - * - * for foriegn domains for which we are *NOT* the PDC, all - * we can be responsible for is the unix gid_t to which - * the foriegn SID+rid maps to, on this _local_ machine. - * we *CANNOT* make any short-cuts or assumptions about - * RIDs in a foriegn domain. - */ - - if (!map_domain_name_to_sid(&map->sid, &(map->nt_domain))) - { - DEBUG(0,("unix_name_to_nt_name_info: no known sid for %s\n", - map->nt_domain)); - return False; - } - } - - return make_mydomain_sid(map, type); -} - -static BOOL make_name_entry(name_map_entry **new_ep, - char *nt_domain, char *nt_group, char *unix_group, - DOM_MAP_TYPE type) -{ - /* - * Create the list entry and add it onto the list. - */ - - DEBUG(5,("make_name_entry:%s,%s,%s\n", nt_domain, nt_group, unix_group)); - - (*new_ep) = (name_map_entry *)malloc(sizeof(name_map_entry)); - if ((*new_ep) == NULL) - { - DEBUG(0,("make_name_entry: malloc fail for name_map_entry.\n")); - return False; - } - - ZERO_STRUCTP(*new_ep); - - (*new_ep)->grp.nt_name = strdup(nt_group ); - (*new_ep)->grp.nt_domain = strdup(nt_domain ); - (*new_ep)->grp.unix_name = strdup(unix_group); - - if ((*new_ep)->grp.nt_name == NULL || - (*new_ep)->grp.unix_name == NULL) - { - DEBUG(0,("make_name_entry: malloc fail for names in name_map_entry.\n")); - delete_name_entry((*new_ep)); - return False; - } - - /* - * look up the group names, make the Group-SID and unix gid - */ - - if (!unix_name_to_nt_name_info(&(*new_ep)->grp, type)) - { - delete_name_entry((*new_ep)); - return False; - } - - return True; -} - -/************************************************************************** - Load a name map file. Sets last accessed timestamp. -***************************************************************************/ -static ubi_slList *load_name_map(DOM_MAP_TYPE type) -{ - static time_t groupmap_file_last_modified = (time_t)0; - static time_t aliasmap_file_last_modified = (time_t)0; - static time_t ntusrmap_file_last_modified = (time_t)0; - static BOOL initialised_group = False; - static BOOL initialised_alias = False; - static BOOL initialised_ntusr = False; - char *groupname_map_file = lp_groupname_map(); - char *aliasname_map_file = lp_aliasname_map(); - char *ntusrname_map_file = lp_ntusrname_map(); - - FILE *fp; - char *s; - pstring buf; - name_map_entry *new_ep; - - time_t *file_last_modified = NULL; - int *initialised = NULL; - char *map_file = NULL; - ubi_slList *map_list = NULL; - - switch (type) - { - case DOM_MAP_DOMAIN: - { - file_last_modified = &groupmap_file_last_modified; - initialised = &initialised_group; - map_file = groupname_map_file; - map_list = &groupname_map_list; - - break; - } - case DOM_MAP_LOCAL: - { - file_last_modified = &aliasmap_file_last_modified; - initialised = &initialised_alias; - map_file = aliasname_map_file; - map_list = &aliasname_map_list; - - break; - } - case DOM_MAP_USER: - { - file_last_modified = &ntusrmap_file_last_modified; - initialised = &initialised_ntusr; - map_file = ntusrname_map_file; - map_list = &ntusrname_map_list; - - break; - } - } - - if (!(*initialised)) - { - DEBUG(10,("initialising map %s\n", map_file)); - ubi_slInitList(map_list); - (*initialised) = True; - } - - if (!*map_file) - { - return map_list; - } - - /* - * Load the file. - */ - - fp = open_file_if_modified(map_file, "r", file_last_modified); - if (!fp) - { - return map_list; - } - - /* - * Throw away any previous list. - */ - delete_map_list(map_list); - - DEBUG(4,("load_name_map: Scanning name map %s\n",map_file)); - - while ((s = fgets_slash(buf, sizeof(buf), fp)) != NULL) - { - pstring unixname; - pstring nt_name; - fstring nt_domain; - fstring ntname; - char *p; - - DEBUG(10,("Read line |%s|\n", s)); - - memset(nt_name, 0, sizeof(nt_name)); - - if (!*s || strchr("#;",*s)) - continue; - - if (!next_token(&s,unixname, "\t\n\r=", sizeof(unixname))) - continue; - - if (!next_token(&s,nt_name, "\t\n\r=", sizeof(nt_name))) - continue; - - trim_string(unixname, " ", " "); - trim_string(nt_name, " ", " "); - - if (!*nt_name) - continue; - - if (!*unixname) - continue; - - p = strchr(nt_name, '\\'); - - if (p == NULL) - { - memset(nt_domain, 0, sizeof(nt_domain)); - fstrcpy(ntname, nt_name); - } - else - { - *p = 0; - p++; - fstrcpy(nt_domain, nt_name); - fstrcpy(ntname , p); - } - - if (make_name_entry(&new_ep, nt_domain, ntname, unixname, type)) - { - ubi_slAddTail(map_list, (ubi_slNode *)new_ep); - DEBUG(5,("unixname = %s, ntname = %s\\%s type = %d\n", - new_ep->grp.unix_name, - new_ep->grp.nt_domain, - new_ep->grp.nt_name, - new_ep->grp.type)); - } - } - - DEBUG(10,("load_name_map: Added %ld entries to name map.\n", - ubi_slCount(map_list))); - - fclose(fp); - - return map_list; -} - -static void copy_grp_map_entry(DOM_NAME_MAP *grp, const DOM_NAME_MAP *from) -{ - sid_copy(&grp->sid, &from->sid); - grp->unix_id = from->unix_id; - grp->nt_name = from->nt_name; - grp->nt_domain = from->nt_domain; - grp->unix_name = from->unix_name; - grp->type = from->type; -} - -#if 0 -/*********************************************************** - Lookup unix name. -************************************************************/ -static BOOL map_unixname(DOM_MAP_TYPE type, - char *unixname, DOM_NAME_MAP *grp_info) -{ - name_map_entry *gmep; - ubi_slList *map_list; - - /* - * Initialise and load if not already loaded. - */ - map_list = load_name_map(type); - - for (gmep = (name_map_entry *)ubi_slFirst(map_list); - gmep != NULL; - gmep = (name_map_entry *)ubi_slNext(gmep )) - { - if (strequal(gmep->grp.unix_name, unixname)) - { - copy_grp_map_entry(grp_info, &gmep->grp); - DEBUG(7,("map_unixname: Mapping unix name %s to nt group %s.\n", - gmep->grp.unix_name, gmep->grp.nt_name )); - return True; - } - } - - return False; -} - -#endif - -/*********************************************************** - Lookup nt name. -************************************************************/ -static BOOL map_ntname(DOM_MAP_TYPE type, char *ntname, char *ntdomain, - DOM_NAME_MAP *grp_info) -{ - name_map_entry *gmep; - ubi_slList *map_list; - - /* - * Initialise and load if not already loaded. - */ - map_list = load_name_map(type); - - for (gmep = (name_map_entry *)ubi_slFirst(map_list); - gmep != NULL; - gmep = (name_map_entry *)ubi_slNext(gmep )) - { - if (strequal(gmep->grp.nt_name , ntname) && - strequal(gmep->grp.nt_domain, ntdomain)) - { - copy_grp_map_entry(grp_info, &gmep->grp); - DEBUG(7,("map_ntname: Mapping unix name %s to nt name %s.\n", - gmep->grp.unix_name, gmep->grp.nt_name )); - return True; - } - } - - return False; -} - - -/*********************************************************** - Lookup by SID -************************************************************/ -static BOOL map_sid(DOM_MAP_TYPE type, - DOM_SID *psid, DOM_NAME_MAP *grp_info) -{ - name_map_entry *gmep; - ubi_slList *map_list; - - /* - * Initialise and load if not already loaded. - */ - map_list = load_name_map(type); - - for (gmep = (name_map_entry *)ubi_slFirst(map_list); - gmep != NULL; - gmep = (name_map_entry *)ubi_slNext(gmep )) - { - if (sid_equal(&gmep->grp.sid, psid)) - { - copy_grp_map_entry(grp_info, &gmep->grp); - DEBUG(7,("map_sid: Mapping unix name %s to nt name %s.\n", - gmep->grp.unix_name, gmep->grp.nt_name )); - return True; - } - } - - return False; -} - -/*********************************************************** - Lookup by gid_t. -************************************************************/ -static BOOL map_unixid(DOM_MAP_TYPE type, uint32 unix_id, DOM_NAME_MAP *grp_info) -{ - name_map_entry *gmep; - ubi_slList *map_list; - - /* - * Initialise and load if not already loaded. - */ - map_list = load_name_map(type); - - for (gmep = (name_map_entry *)ubi_slFirst(map_list); - gmep != NULL; - gmep = (name_map_entry *)ubi_slNext(gmep )) - { - fstring sid_str; - sid_to_string(sid_str, &gmep->grp.sid); - DEBUG(10,("map_unixid: enum entry unix group %s %d nt %s %s\n", - gmep->grp.unix_name, gmep->grp.unix_id, gmep->grp.nt_name, sid_str)); - if (gmep->grp.unix_id == unix_id) - { - copy_grp_map_entry(grp_info, &gmep->grp); - DEBUG(7,("map_unixid: Mapping unix name %s to nt name %s type %d\n", - gmep->grp.unix_name, gmep->grp.nt_name, gmep->grp.type)); - return True; - } - } - - return False; -} - -/*********************************************************** - * - * Call four functions to resolve unix group ids and either - * local group SIDs or domain group SIDs listed in the local group - * or domain group map files. - * - * Note that it is *NOT* the responsibility of these functions to - * resolve entries that are not in the map files. - * - * Any SID can be in the map files (i.e from any Domain). - * - ***********************************************************/ - -#if 0 - -/*********************************************************** - Lookup a UNIX Group entry by name. -************************************************************/ -BOOL map_unix_group_name(char *group_name, DOM_NAME_MAP *grp_info) -{ - return map_unixname(DOM_MAP_DOMAIN, group_name, grp_info); -} - -/*********************************************************** - Lookup a UNIX Alias entry by name. -************************************************************/ -BOOL map_unix_alias_name(char *alias_name, DOM_NAME_MAP *grp_info) -{ - return map_unixname(DOM_MAP_LOCAL, alias_name, grp_info); -} - -/*********************************************************** - Lookup an Alias name entry -************************************************************/ -BOOL map_nt_alias_name(char *ntalias_name, char *nt_domain, DOM_NAME_MAP *grp_info) -{ - return map_ntname(DOM_MAP_LOCAL, ntalias_name, nt_domain, grp_info); -} - -/*********************************************************** - Lookup a Group entry -************************************************************/ -BOOL map_nt_group_name(char *ntgroup_name, char *nt_domain, DOM_NAME_MAP *grp_info) -{ - return map_ntname(DOM_MAP_DOMAIN, ntgroup_name, nt_domain, grp_info); -} - -#endif - -/*********************************************************** - Lookup a Username entry by name. -************************************************************/ -static BOOL map_nt_username(char *nt_name, char *nt_domain, DOM_NAME_MAP *grp_info) -{ - return map_ntname(DOM_MAP_USER, nt_name, nt_domain, grp_info); -} - -/*********************************************************** - Lookup a Username entry by SID. -************************************************************/ -static BOOL map_username_sid(DOM_SID *sid, DOM_NAME_MAP *grp_info) -{ - return map_sid(DOM_MAP_USER, sid, grp_info); -} - -/*********************************************************** - Lookup a Username SID entry by uid. -************************************************************/ -static BOOL map_username_uid(uid_t gid, DOM_NAME_MAP *grp_info) -{ - return map_unixid(DOM_MAP_USER, (uint32)gid, grp_info); -} - -/*********************************************************** - Lookup an Alias SID entry by name. -************************************************************/ -BOOL map_alias_sid(DOM_SID *psid, DOM_NAME_MAP *grp_info) -{ - return map_sid(DOM_MAP_LOCAL, psid, grp_info); -} - -/*********************************************************** - Lookup a Group entry by sid. -************************************************************/ -BOOL map_group_sid(DOM_SID *psid, DOM_NAME_MAP *grp_info) -{ - return map_sid(DOM_MAP_DOMAIN, psid, grp_info); -} - -/*********************************************************** - Lookup an Alias SID entry by gid_t. -************************************************************/ -static BOOL map_alias_gid(gid_t gid, DOM_NAME_MAP *grp_info) -{ - return map_unixid(DOM_MAP_LOCAL, (uint32)gid, grp_info); -} - -/*********************************************************** - Lookup a Group SID entry by gid_t. -************************************************************/ -static BOOL map_group_gid( gid_t gid, DOM_NAME_MAP *grp_info) -{ - return map_unixid(DOM_MAP_DOMAIN, (uint32)gid, grp_info); -} - - -/************************************************************************ - Routine to look up User details by UNIX name -*************************************************************************/ -BOOL lookupsmbpwnam(const char *unix_usr_name, DOM_NAME_MAP *grp) -{ - uid_t uid; - DEBUG(10,("lookupsmbpwnam: unix user name %s\n", unix_usr_name)); - if (nametouid(unix_usr_name, &uid)) - { - return lookupsmbpwuid(uid, grp); - } - else - { - return False; - } -} - -/************************************************************************ - Routine to look up a remote nt name -*************************************************************************/ -static BOOL lookup_remote_ntname(const char *ntname, DOM_SID *sid, uint8 *type) -{ - struct cli_state cli; - POLICY_HND lsa_pol; - fstring srv_name; - extern struct ntuser_creds *usr_creds; - struct ntuser_creds usr; - - BOOL res3 = True; - BOOL res4 = True; - uint32 num_sids; - DOM_SID *sids; - uint8 *types; - char *names[1]; - - usr_creds = &usr; - - ZERO_STRUCT(usr); - pwd_set_nullpwd(&usr.pwd); - - DEBUG(5,("lookup_remote_ntname: %s\n", ntname)); - - if (!cli_connect_serverlist(&cli, lp_passwordserver())) - { - return False; - } - - names[0] = ntname; - - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, cli.desthost); - strupper(srv_name); - - /* lookup domain controller; receive a policy handle */ - res3 = res3 ? lsa_open_policy( srv_name, - &lsa_pol, True) : False; - - /* send lsa lookup sids call */ - res4 = res3 ? lsa_lookup_names( &lsa_pol, - 1, names, - &sids, &types, &num_sids) : False; - - res3 = res3 ? lsa_close(&lsa_pol) : False; - - if (res4 && res3 && sids != NULL && types != NULL) - { - sid_copy(sid, &sids[0]); - *type = types[0]; - } - else - { - res3 = False; - } - if (types != NULL) - { - free(types); - } - - if (sids != NULL) - { - free(sids); - } - - return res3 && res4; -} - -/************************************************************************ - Routine to look up a remote nt name -*************************************************************************/ -static BOOL get_sid_and_type(const char *fullntname, uint8 expected_type, - DOM_NAME_MAP *gmep) -{ - /* - * check with the PDC to see if it owns the name. if so, - * the SID is resolved with the PDC database. - */ - - if (lp_server_role() == ROLE_DOMAIN_MEMBER) - { - if (lookup_remote_ntname(fullntname, &gmep->sid, &gmep->type)) - { - if (sid_front_equal(&gmep->sid, &global_member_sid) && - strequal(gmep->nt_domain, global_myworkgroup) && - gmep->type == expected_type) - { - return True; - } - return False; - } - } - - /* - * ... otherwise, it's one of ours. map the sid ourselves, - * which can only happen in our own SAM database. - */ - - if (!strequal(gmep->nt_domain, global_sam_name)) - { - return False; - } - if (!pwdb_unixid_to_sam_sid(gmep->unix_id, gmep->type, &gmep->sid)) - { - return False; - } - - return True; -} - -/* - * used by lookup functions below - */ - -static fstring nt_name; -static fstring unix_name; -static fstring nt_domain; - -/************************************************************************* - looks up a uid, returns User Information. -*************************************************************************/ -BOOL lookupsmbpwuid(uid_t uid, DOM_NAME_MAP *gmep) -{ - DEBUG(10,("lookupsmbpwuid: unix uid %d\n", uid)); - if (map_username_uid(uid, gmep)) - { - return True; - } - if (lp_server_role() != ROLE_DOMAIN_NONE) - { - gmep->nt_name = nt_name; - gmep->unix_name = unix_name; - gmep->nt_domain = nt_domain; - - gmep->unix_id = (uint32)uid; - - /* - * ok, assume it's one of ours. then double-check it - * if we are a member of a domain - */ - - gmep->type = SID_NAME_USER; - fstrcpy(gmep->nt_name, uidtoname(uid)); - fstrcpy(gmep->unix_name, gmep->nt_name); - - /* - * here we should do a LsaLookupNames() call - * to check the status of the name with the PDC. - * if the PDC know nothing of the name, it's ours. - */ - - if (lp_server_role() == ROLE_DOMAIN_MEMBER) - { -#if 0 - lsa_lookup_names(global_myworkgroup, gmep->nt_name, &gmep->sid...); -#endif - } - - /* - * ok, it's one of ours. - */ - - gmep->nt_domain = global_sam_name; - pwdb_unixid_to_sam_sid(gmep->unix_id, gmep->type, &gmep->sid); - - return True; - } - - /* oops. */ - - return False; -} - -/************************************************************************* - looks up by NT name, returns User Information. -*************************************************************************/ -BOOL lookupsmbpwntnam(const char *fullntname, DOM_NAME_MAP *gmep) -{ - DEBUG(10,("lookupsmbpwntnam: nt user name %s\n", fullntname)); - - if (!split_domain_name(fullntname, nt_domain, nt_name)) - { - return False; - } - - if (map_nt_username(nt_name, nt_domain, gmep)) - { - return True; - } - if (lp_server_role() != ROLE_DOMAIN_NONE) - { - uid_t uid; - gmep->nt_name = nt_name; - gmep->unix_name = unix_name; - gmep->nt_domain = nt_domain; - - /* - * ok, it's one of ours. we therefore "create" an nt user named - * after the unix user. this is the point where "appliance mode" - * should get its teeth in, as unix users won't really exist, - * they will only be numbers... - */ - - gmep->type = SID_NAME_USER; - fstrcpy(gmep->unix_name, gmep->nt_name); - if (!nametouid(gmep->unix_name, &uid)) - { - return False; - } - gmep->unix_id = (uint32)uid; - - return get_sid_and_type(fullntname, gmep->type, gmep); - } - - /* oops. */ - - return False; -} - -/************************************************************************* - looks up by RID, returns User Information. -*************************************************************************/ -BOOL lookupsmbpwsid(DOM_SID *sid, DOM_NAME_MAP *gmep) -{ - fstring sid_str; - sid_to_string(sid_str, sid); - DEBUG(10,("lookupsmbpwsid: nt sid %s\n", sid_str)); - - if (map_username_sid(sid, gmep)) - { - return True; - } - if (lp_server_role() != ROLE_DOMAIN_NONE) - { - gmep->nt_name = nt_name; - gmep->unix_name = unix_name; - gmep->nt_domain = nt_domain; - - /* - * here we should do a LsaLookupNames() call - * to check the status of the name with the PDC. - * if the PDC know nothing of the name, it's ours. - */ - - if (lp_server_role() == ROLE_DOMAIN_MEMBER) - { -#if 0 - if (lookup_remote_sid(global_myworkgroup, gmep->sid, gmep->nt_name, gmep->nt_domain...); -#endif - } - - /* - * ok, it's one of ours. we therefore "create" an nt user named - * after the unix user. this is the point where "appliance mode" - * should get its teeth in, as unix users won't really exist, - * they will only be numbers... - */ - - gmep->type = SID_NAME_USER; - sid_copy(&gmep->sid, sid); - if (!pwdb_sam_sid_to_unixid(&gmep->sid, gmep->type, &gmep->unix_id)) - { - return False; - } - fstrcpy(gmep->nt_name, uidtoname((uid_t)gmep->unix_id)); - fstrcpy(gmep->unix_name, gmep->nt_name); - gmep->nt_domain = global_sam_name; - - return True; - } - - /* oops. */ - - return False; -} - -/************************************************************************ - Routine to look up group / alias / well-known group RID by UNIX name -*************************************************************************/ -BOOL lookupsmbgrpnam(const char *unix_grp_name, DOM_NAME_MAP *grp) -{ - gid_t gid; - DEBUG(10,("lookupsmbgrpnam: unix user group %s\n", unix_grp_name)); - if (nametogid(unix_grp_name, &gid)) - { - return lookupsmbgrpgid(gid, grp); - } - else - { - return False; - } -} - -/************************************************************************* - looks up a SID, returns name map entry -*************************************************************************/ -BOOL lookupsmbgrpsid(DOM_SID *sid, DOM_NAME_MAP *gmep) -{ - fstring sid_str; - sid_to_string(sid_str, sid); - DEBUG(10,("lookupsmbgrpsid: nt sid %s\n", sid_str)); - - if (map_alias_sid(sid, gmep)) - { - return True; - } - if (map_group_sid(sid, gmep)) - { - return True; - } - if (lp_server_role() != ROLE_DOMAIN_NONE) - { - gmep->nt_name = nt_name; - gmep->unix_name = unix_name; - gmep->nt_domain = nt_domain; - - /* - * here we should do a LsaLookupNames() call - * to check the status of the name with the PDC. - * if the PDC know nothing of the name, it's ours. - */ - - if (lp_server_role() == ROLE_DOMAIN_MEMBER) - { -#if 0 - lsa_lookup_sids(global_myworkgroup, gmep->sid, gmep->nt_name, gmep->nt_domain...); -#endif - } - - /* - * ok, it's one of ours. we therefore "create" an nt group or - * alias name named after the unix group. this is the point - * where "appliance mode" should get its teeth in, as unix - * groups won't really exist, they will only be numbers... - */ - - /* name is not explicitly mapped - * with map files or the PDC - * so we are responsible for it... - */ - - if (lp_server_role() == ROLE_DOMAIN_MEMBER) - { - /* ... as a LOCAL group. */ - gmep->type = SID_NAME_ALIAS; - } - else - { - /* ... as a DOMAIN group. */ - gmep->type = SID_NAME_DOM_GRP; - } - - sid_copy(&gmep->sid, sid); - if (!pwdb_sam_sid_to_unixid(&gmep->sid, gmep->type, &gmep->unix_id)) - { - return False; - } - fstrcpy(gmep->nt_name, gidtoname((gid_t)gmep->unix_id)); - fstrcpy(gmep->unix_name, gmep->nt_name); - gmep->nt_domain = global_sam_name; - - return True; - } - - /* oops */ - return False; -} - -/************************************************************************* - looks up a gid, returns RID and type local, domain or well-known domain group -*************************************************************************/ -BOOL lookupsmbgrpgid(gid_t gid, DOM_NAME_MAP *gmep) -{ - DEBUG(10,("lookupsmbgrpgid: unix gid %d\n", (int)gid)); - if (map_alias_gid(gid, gmep)) - { - return True; - } - if (map_group_gid(gid, gmep)) - { - return True; - } - if (lp_server_role() != ROLE_DOMAIN_NONE) - { - gmep->nt_name = nt_name; - gmep->unix_name = unix_name; - gmep->nt_domain = nt_domain; - - gmep->unix_id = (uint32)gid; - - /* - * here we should do a LsaLookupNames() call - * to check the status of the name with the PDC. - * if the PDC know nothing of the name, it's ours. - */ - - if (lp_server_role() == ROLE_DOMAIN_MEMBER) - { -#if 0 - if (lsa_lookup_names(global_myworkgroup, gmep->nt_name, &gmep->sid...); - { - return True; - } -#endif - } - - /* - * ok, it's one of ours. we therefore "create" an nt group or - * alias name named after the unix group. this is the point - * where "appliance mode" should get its teeth in, as unix - * groups won't really exist, they will only be numbers... - */ - - /* name is not explicitly mapped - * with map files or the PDC - * so we are responsible for it... - */ - - if (lp_server_role() == ROLE_DOMAIN_MEMBER) - { - /* ... as a LOCAL group. */ - gmep->type = SID_NAME_ALIAS; - } - else - { - /* ... as a DOMAIN group. */ - gmep->type = SID_NAME_DOM_GRP; - } - fstrcpy(gmep->nt_name, gidtoname(gid)); - fstrcpy(gmep->unix_name, gmep->nt_name); - - return get_sid_and_type(gmep->nt_name, gmep->type, gmep); - } - - /* oops */ - return False; -} - diff --git a/source3/lib/hmacmd5.c b/source3/lib/hmacmd5.c deleted file mode 100644 index d017bba77d..0000000000 --- a/source3/lib/hmacmd5.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Interface header: Scheduler service - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - Copyright (C) Andrew Tridgell 1992-1999 - - 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. -*/ - -/* taken direct from rfc2104 implementation and modified for suitable use - * for ntlmv2. - */ - -#include "includes.h" - -/*********************************************************************** - the rfc 2104 version of hmac_md5 initialisation. -***********************************************************************/ -void hmac_md5_init_rfc2104(uchar* key, int key_len, HMACMD5Context *ctx) -{ - int i; - - /* if key is longer than 64 bytes reset it to key=MD5(key) */ - if (key_len > 64) - { - uchar tk[16]; - struct MD5Context tctx; - - MD5Init(&tctx); - MD5Update(&tctx, key, key_len); - MD5Final(tk, &tctx); - - key = tk; - key_len = 16; - } - - /* start out by storing key in pads */ - bzero( ctx->k_ipad, sizeof ctx->k_ipad); - bzero( ctx->k_opad, sizeof ctx->k_opad); - bcopy( key, ctx->k_ipad, key_len); - bcopy( key, ctx->k_opad, key_len); - - /* XOR key with ipad and opad values */ - for (i=0; i<64; i++) - { - ctx->k_ipad[i] ^= 0x36; - ctx->k_opad[i] ^= 0x5c; - } - - MD5Init(&ctx->ctx); - MD5Update(&ctx->ctx, ctx->k_ipad, 64); -} - -/*********************************************************************** - the microsoft version of hmac_md5 initialisation. -***********************************************************************/ -void hmac_md5_init_limK_to_64(const uchar* key, int key_len, - HMACMD5Context *ctx) -{ - int i; - - /* if key is longer than 64 bytes truncate it */ - if (key_len > 64) - { - key_len = 64; - } - - /* start out by storing key in pads */ - bzero( ctx->k_ipad, sizeof ctx->k_ipad); - bzero( ctx->k_opad, sizeof ctx->k_opad); - bcopy( key, ctx->k_ipad, key_len); - bcopy( key, ctx->k_opad, key_len); - - /* XOR key with ipad and opad values */ - for (i=0; i<64; i++) - { - ctx->k_ipad[i] ^= 0x36; - ctx->k_opad[i] ^= 0x5c; - } - - MD5Init(&ctx->ctx); - MD5Update(&ctx->ctx, ctx->k_ipad, 64); -} - -/*********************************************************************** - update hmac_md5 "inner" buffer -***********************************************************************/ -void hmac_md5_update(const uchar* text, int text_len, HMACMD5Context *ctx) -{ - MD5Update(&ctx->ctx, text, text_len); /* then text of datagram */ -} - -/*********************************************************************** - finish off hmac_md5 "inner" buffer and generate outer one. -***********************************************************************/ -void hmac_md5_final(uchar *digest, HMACMD5Context *ctx) - -{ - struct MD5Context ctx_o; - - MD5Final(digest, &ctx->ctx); - - MD5Init(&ctx_o); - MD5Update(&ctx_o, ctx->k_opad, 64); - MD5Update(&ctx_o, digest, 16); - MD5Final(digest, &ctx_o); -} diff --git a/source3/lib/md5.c b/source3/lib/md5.c deleted file mode 100644 index cff7bef034..0000000000 --- a/source3/lib/md5.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Copyright (C) Andrew Tridgell 1992-1999 - - 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. -*/ - -/* This code has been heavily hacked by Tatu Ylonen <ylo@cs.hut.fi> to - make it compile on machines like Cray that don't have a 32 bit integer - type. */ -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - */ - -#include "includes.h" - -#ifndef _GETPUT_H -/* - -getput.h - -Author: Tatu Ylonen <ylo@cs.hut.fi> - -Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland - All rights reserved - -Created: Wed Jun 28 22:36:30 1995 ylo - -Macros for storing and retrieving data in msb first and lsb first order. - -*/ - -/*------------ macros for storing/extracting msb first words -------------*/ - -#define GET_32BIT(cp) (((uint32)(uchar)(cp)[0] << 24) | \ - ((uint32)(uchar)(cp)[1] << 16) | \ - ((uint32)(uchar)(cp)[2] << 8) | \ - ((uint32)(uchar)(cp)[3])) - -#define GET_16BIT(cp) (((uint32)(uchar)(cp)[0] << 8) | \ - ((uint32)(uchar)(cp)[1])) - -#define PUT_32BIT(cp, value) do { \ - (cp)[0] = (value) >> 24; \ - (cp)[1] = (value) >> 16; \ - (cp)[2] = (value) >> 8; \ - (cp)[3] = (value); } while (0) - -#define PUT_16BIT(cp, value) do { \ - (cp)[0] = (value) >> 8; \ - (cp)[1] = (value); } while (0) - -/*------------ macros for storing/extracting lsb first words -------------*/ - -#define GET_32BIT_LSB_FIRST(cp) \ - (((uint32)(uchar)(cp)[0]) | \ - ((uint32)(uchar)(cp)[1] << 8) | \ - ((uint32)(uchar)(cp)[2] << 16) | \ - ((uint32)(uchar)(cp)[3] << 24)) - -#define GET_16BIT_LSB_FIRST(cp) \ - (((uint32)(uchar)(cp)[0]) | \ - ((uint32)(uchar)(cp)[1] << 8)) - -#define PUT_32BIT_LSB_FIRST(cp, value) do { \ - (cp)[0] = (value); \ - (cp)[1] = (value) >> 8; \ - (cp)[2] = (value) >> 16; \ - (cp)[3] = (value) >> 24; } while (0) - -#define PUT_16BIT_LSB_FIRST(cp, value) do { \ - (cp)[0] = (value); \ - (cp)[1] = (value) >> 8; } while (0) - -#endif /* _GETPUT_H */ - -/* - * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious - * initialization constants. - */ -void MD5Init(struct MD5Context *ctx) -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bits[0] = 0; - ctx->bits[1] = 0; -} - -/* - * Update context to reflect the concatenation of another buffer full - * of bytes. - */ -void MD5Update(struct MD5Context *ctx, uchar const *buf, unsigned len) -{ - uint32 t; - - /* Update bitcount */ - - t = ctx->bits[0]; - if ((ctx->bits[0] = (t + ((uint32)len << 3)) & 0xffffffff) < t) - ctx->bits[1]++; /* Carry from low to high */ - ctx->bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - - /* Handle any leading odd-sized chunks */ - - if (t) { - uchar *p = ctx->in + t; - - t = 64 - t; - if (len < t) { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - MD5Transform(ctx->buf, ctx->in); - buf += t; - len -= t; - } - /* Process data in 64-byte chunks */ - - while (len >= 64) { - memcpy(ctx->in, buf, 64); - MD5Transform(ctx->buf, ctx->in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - - memcpy(ctx->in, buf, len); -} - -/* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -void MD5Final(uchar digest[16], struct MD5Context *ctx) -{ - unsigned count; - uchar *p; - - /* Compute number of bytes mod 64 */ - count = (ctx->bits[0] >> 3) & 0x3F; - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = ctx->in + count; - *p++ = 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset(p, 0, count); - MD5Transform(ctx->buf, ctx->in); - - /* Now fill the next block with 56 bytes */ - memset(ctx->in, 0, 56); - } else { - /* Pad block to 56 bytes */ - memset(p, 0, count - 8); - } - - /* Append length in bits and transform */ - PUT_32BIT_LSB_FIRST(ctx->in + 56, ctx->bits[0]); - PUT_32BIT_LSB_FIRST(ctx->in + 60, ctx->bits[1]); - - MD5Transform(ctx->buf, ctx->in); - PUT_32BIT_LSB_FIRST(digest, ctx->buf[0]); - PUT_32BIT_LSB_FIRST(digest + 4, ctx->buf[1]); - PUT_32BIT_LSB_FIRST(digest + 8, ctx->buf[2]); - PUT_32BIT_LSB_FIRST(digest + 12, ctx->buf[3]); - memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ -} - -#ifndef ASM_MD5 - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f, w, x, y, z, data, s) \ - ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x ) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. MD5Update blocks - * the data and converts bytes into longwords for this routine. - */ -void MD5Transform(uint32 buf[4], const uchar inext[64]) -{ - register uint32 a, b, c, d, i; - uint32 in[16]; - - for (i = 0; i < 16; i++) - in[i] = GET_32BIT_LSB_FIRST(inext + 4 * i); - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} - -#endif diff --git a/source3/lib/membuffer.c b/source3/lib/membuffer.c deleted file mode 100644 index e228503643..0000000000 --- a/source3/lib/membuffer.c +++ /dev/null @@ -1,367 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba memory buffer functions - Copyright (C) Andrew Tridgell 1992-1997 - Copyright (C) Luke Kenneth Casson Leighton 1996-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. -*/ - -/******************************************************************* - * - * Description: memory buffer / stream management. - * Author : Luke K C Leighton - * Created : Dec 1997 - * - - * this module is intended for use in streaming data in and out of - * buffers. it is intended that a single data stream be subdivided - * into manageable sections. - - * for example, an rpc header contains a length field, but until the - * data has been created, the length is unknown. using this module, - * the header section can be tacked onto the front of the data memory - * list once the size of the data section preceding it is known. - - * the "margin" can be used to over-run and retrospectively lengthen - * the buffer. this is to save time in some of the loops, where it is - * not particularly desirable to realloc data by 1, 2 or 4 bytes - * repetitively... - - * each memory buffer contains a start and end offset. the end of - * one buffer should equal to the start of the next in the chain. - * (end - start = len, instead of end - start + 1 = len) - - * the debug log levels are very high in some of the routines: you - * have no idea how boring it gets staring at debug output from these - - ********************************************************************/ - - -#include "includes.h" - -extern int DEBUGLEVEL; - -/******************************************************************* - initialise a memory buffer. - ********************************************************************/ -void mem_init(struct mem_buf *buf, int margin) -{ - buf->dynamic = True; - buf->data = NULL; - buf->data_size = 0; - buf->data_used = 0; - - buf->margin = margin; - - buf->next = NULL; - - buf->offset.start = 0; - buf->offset.end = 0x0; -} - -/******************************************************************* - initialise a memory buffer. - - dynamic indicates memory has been dynamically allocated. - if mem_free is called, the memory will be freed. - ********************************************************************/ -void mem_create(struct mem_buf *buf, char *data, int offset, int size, int margin, BOOL dynamic) -{ - buf->dynamic = dynamic; - buf->data = data; - buf->data_size = size; - buf->data_used = size; - - buf->margin = margin; - - buf->next = NULL; - - buf->offset.start = offset; - buf->offset.end = offset + size; -} - -/******************************************************************* - allocate a memory buffer. assume it's empty - ********************************************************************/ -BOOL mem_alloc_data(struct mem_buf *buf, int size) -{ - if (!buf->dynamic) - { - DEBUG(3,("mem_alloc_data: warning - memory buffer type is set to static\n")); - } - - buf->data_size = size + buf->margin; - buf->data_used = size; - - buf->data = (char*)malloc(buf->data_size); - - if (buf->data == NULL && size != 0) - { - DEBUG(3,("mem_alloc: could not malloc size %d\n", - buf->data_size)); - mem_init(buf, buf->margin); - - return False; - } - - bzero(buf->data, buf->data_size); - buf->offset.end = buf->offset.start + size; - - return True; -} - -/******************************************************************* - allocates a memory buffer structure - ********************************************************************/ -BOOL mem_buf_copy(char *copy_into, struct mem_buf *buf, - uint32 offset, uint32 len) -{ - uint32 end = offset + len; - char *q = NULL; - uint32 data_len = mem_buf_len(buf); - uint32 start_offset = offset; - struct mem_buf **bcp = &buf; - - if (buf == NULL || copy_into == NULL) return False; - - DEBUG(200,("mem_buf_copy: data[%d..%d] offset %d len %d\n", - buf->offset.start, data_len, offset, len)); - - /* there's probably an off-by-one bug, here, and i haven't even tested the code :-) */ - while (offset < end && ((q = mem_data(bcp, offset)) != NULL)) - { - uint32 copy_len = (*bcp)->offset.end - offset; - - DEBUG(200,("\tdata[%d..%d] - offset %d len %d\n", - (*bcp)->offset.start, (*bcp)->offset.end, - offset, copy_len)); - - memcpy(copy_into, q, copy_len); - - offset += copy_len; - copy_into += copy_len; - } - - if ((*bcp) != NULL) - { - DEBUG(200,("mem_buf_copy: copied %d bytes\n", offset - start_offset)); - } - else - { - DEBUG(200,("mem_buf_copy: failed\n")); - } - - return buf != NULL; -} - -/******************************************************************* - allocates a memory buffer structure - ********************************************************************/ -BOOL mem_buf_init(struct mem_buf **buf, uint32 margin) -{ - if (buf == NULL) return False; - - if ((*buf) == NULL) - { - (*buf) = (struct mem_buf*)malloc(sizeof(**buf)); - if ((*buf) != NULL) - { - mem_init((*buf), margin); - return True; - } - } - else - { - (*buf)->margin = margin; - return True; - } - return False; -} - -/******************************************************************* - frees up a memory buffer. - ********************************************************************/ -void mem_buf_free(struct mem_buf **buf) -{ - if (buf == NULL) return; - if ((*buf) == NULL) return; - - mem_free_data(*buf); /* delete memory data */ - free(*buf); /* delete item */ - (*buf) = NULL; -} - -/******************************************************************* - frees a memory buffer chain. assumes that all items are malloced. - ********************************************************************/ -static void mem_free_chain(struct mem_buf **buf) -{ - if (buf == NULL) return; - if ((*buf) == NULL) return; - - if ((*buf)->next != NULL) - { - mem_free_chain(&((*buf)->next)); /* delete all other items in chain */ - } - mem_buf_free(buf); -} - -/******************************************************************* - frees a memory buffer. - ********************************************************************/ -void mem_free_data(struct mem_buf *buf) -{ - if (buf == NULL) return; - - if (buf->data != NULL && buf->dynamic) - { - free(buf->data); /* delete data in this structure */ - buf->data = NULL; - } - mem_init(buf, buf->margin); -} - -/******************************************************************* - reallocate a memory buffer, including a safety margin - ********************************************************************/ -BOOL mem_realloc_data(struct mem_buf *buf, size_t new_size) -{ - char *new_data; - - if (!buf->dynamic) - { - DEBUG(3,("mem_realloc_data: memory buffer has not been dynamically allocated!\n")); - return False; - } - - if (new_size == 0) - { - mem_free_data(buf); - return True; - } - - new_data = (char*)Realloc(buf->data, new_size + buf->margin); - - if (new_data != NULL) - { - buf->data = new_data; - buf->data_size = new_size + buf->margin; - buf->data_used = new_size; - } - else if (buf->data_size <= new_size) - { - DEBUG(3,("mem_realloc: warning - could not realloc to %d(+%d)\n", - new_size, buf->margin)); - - buf->data_used = new_size; - } - else - { - DEBUG(3,("mem_realloc: error - could not realloc to %d\n", - new_size)); - - mem_free_data(buf); - return False; - } - - buf->offset.end = buf->offset.start + new_size; - - DEBUG(150,("mem_realloc_data: size: %d start: %d end: %d\n", - new_size, buf->offset.start, buf->offset.end)); - return True; -} - -/******************************************************************* - reallocate a memory buffer, retrospectively :-) - ********************************************************************/ -BOOL mem_grow_data(struct mem_buf **buf, BOOL io, int new_size, BOOL force_grow) -{ - if (new_size + (*buf)->margin >= (*buf)->data_size) - { - if (!io || force_grow) - { - /* writing or forge realloc */ - return mem_realloc_data((*buf), new_size); - } - else - { - } - } - return True; -} - -/******************************************************************* - search for a memory buffer that falls within the specified offset - ********************************************************************/ -static BOOL mem_find(struct mem_buf **buf, uint32 offset) -{ - struct mem_buf *f; - if (buf == NULL) return False; - - f = *buf; - - DEBUG(200,("mem_find: data[%d..%d] offset: %d\n", - f->offset.start, f->offset.end, offset)); - - while (f != NULL && offset >= f->offset.end) - { - DEBUG(200,("mem_find: next[%d..%d]\n", - f->offset.start, f->offset.end)); - - f = f->next; - } - - (*buf) = f; - - if (f != NULL) - { - DEBUG(200,("mem_find: found data[%d..%d]\n", - (*buf)->offset.start,(*buf)->offset.end)); - } - - return f != NULL; -} - - -/******************************************************************* - add up the lengths of all sections. - ********************************************************************/ -uint32 mem_buf_len(struct mem_buf *buf) -{ - int len = 0; - while (buf != NULL) - { - len += buf->offset.end - buf->offset.start; - buf = buf->next; - } - return len; -} - - -/******************************************************************* - return the memory location specified by offset. may return NULL. - ********************************************************************/ -char *mem_data(struct mem_buf **buf, uint32 offset) -{ - if (mem_find(buf, offset)) - { - return &((*buf)->data[offset - (*buf)->offset.start]); - } - return NULL; -} - - diff --git a/source3/lib/msrpc-agent.c b/source3/lib/msrpc-agent.c deleted file mode 100644 index 9fc592d377..0000000000 --- a/source3/lib/msrpc-agent.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2 - SMB agent/socket plugin - Copyright (C) Andrew Tridgell 1999 - - 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 "smb.h" - -extern int DEBUGLEVEL; - -static char packet[BUFFER_SIZE]; - -/**************************************************************************** -terminate sockent connection -****************************************************************************/ -static void free_sock(void *sock) -{ - if (sock != NULL) - { - struct msrpc_state *n = (struct msrpc_state*)sock; - msrpc_use_del(n->pipe_name, &n->usr, False, NULL); - } -} - -static struct msrpc_state *init_client_connection(int c) -{ - pstring buf; - fstring pipe_name; - struct user_creds usr; - int rl; - uint32 len; - BOOL new_con = False; - struct msrpc_state *n = NULL; - - CREDS_CMD cmd; - prs_struct ps; - - ZERO_STRUCT(usr); - ZERO_STRUCT(cmd); - cmd.cred = &usr; - - DEBUG(10,("init_client_connection: first request\n")); - - rl = read(c, &buf, sizeof(len)); - - if (rl != sizeof(len)) - { - DEBUG(0,("Unable to read length\n")); - dump_data(0, buf, sizeof(len)); - return NULL; - } - - len = IVAL(buf, 0); - - if (len > sizeof(buf)) - { - DEBUG(0,("length %d too long\n", len)); - return NULL; - } - - rl = read(c, buf, len); - - if (rl < 0) - { - DEBUG(0,("Unable to read from connection\n")); - return NULL; - } - -#ifdef DEBUG_PASSWORD - dump_data(100, buf, rl); -#endif - - /* make a static data parsing structure from the api_fd_reply data */ - prs_init(&ps, 0, 4, 0, True); - mem_create(ps.data, buf, 0, len, 0, False); - - if (!creds_io_cmd("creds", &cmd, &ps, 0)) - { - DEBUG(0,("Unable to parse credentials\n")); - mem_free_data(ps.data); - return NULL; - } - - mem_free_data(ps.data); - - if (ps.offset != rl) - { - DEBUG(0,("Buffer size %d %d!\n", ps.offset, rl)); - return NULL; - } - - switch (cmd.command) - { - case AGENT_CMD_CON: - case AGENT_CMD_CON_ANON: - { - new_con = True; - break; - } - case AGENT_CMD_CON_REUSE: - { - new_con = True; - break; - } - default: - { - DEBUG(0,("unknown command %d\n", cmd.command)); - return NULL; - } - } - - if (new_con) - { - uint32 status = 0; - n = msrpc_use_add(pipe_name, &usr, False); - - if (n == NULL) - { - DEBUG(0,("Unable to connect to %s\n", pipe_name)); - status = 0x1; - } - else - { - fstrcpy(n->pipe_name, pipe_name); - copy_user_creds(&n->usr, &usr); - } - - if (write(c, &status, sizeof(status)) != sizeof(status)) - { - DEBUG(0,("Could not write connection down pipe.\n")); - if (n != NULL) - { - msrpc_use_del(pipe_name, &usr, False, NULL); - n = NULL; - } - } - } - free_user_creds(&usr); - return n; -} - -static BOOL process_cli_sock(struct sock_redir **socks, uint32 num_socks, - struct sock_redir *sock) -{ - struct msrpc_state *n = (struct msrpc_state*)sock->n; - if (n == NULL) - { - n = init_client_connection(sock->c); - if (n == NULL) - { - return False; - } - sock->n = (void*)n; - sock->s = n->fd; - } - else - { - if (!receive_smb(sock->c, packet, 0)) - { - DEBUG(0,("client closed connection\n")); - return False; - } - - if (!send_smb(sock->s, packet)) - { - DEBUG(0,("server is dead\n")); - return False; - } - } - return True; -} - -static BOOL process_srv_sock(struct sock_redir **socks, uint32 num_socks, - int fd) -{ - int i; - if (!receive_smb(fd, packet, 0)) - { - DEBUG(0,("server closed connection\n")); - return False; - } - - DEBUG(10,("process_srv_sock:\tfd:\t%d\n", fd)); - - for (i = 0; i < num_socks; i++) - { - struct msrpc_state *n; - if (socks[i] == NULL || socks[i]->n == NULL) - { - continue; - } - n = (struct msrpc_state*)socks[i]->n; - DEBUG(10,("list:\tfd:\t%d\n", - socks[i]->s)); - if (!send_smb(socks[i]->c, packet)) - { - DEBUG(0,("client is dead\n")); - return False; - } - return True; - } - return False; -} - -static int get_agent_sock(char *pipe_name) -{ - fstring path; - fstring dir; - - slprintf(dir, sizeof(dir)-1, "/tmp/.msrpc/.%s", pipe_name); - slprintf(path, sizeof(path)-1, "%s/agent", dir); - - return create_pipe_socket(dir, S_IRUSR|S_IWUSR|S_IXUSR, path, 0); -} - -void start_msrpc_agent(char *pipe_name) -{ - struct vagent_ops va = - { - free_sock, - get_agent_sock, - process_cli_sock, - process_srv_sock, - pipe_name, - NULL, - 0 - }; - - if (fork() == 0) - { - /* child */ - start_agent(&va); - } -} - diff --git a/source3/lib/msrpc-client.c b/source3/lib/msrpc-client.c deleted file mode 100644 index e13850a9e2..0000000000 --- a/source3/lib/msrpc-client.c +++ /dev/null @@ -1,384 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB msrpcent generic functions - Copyright (C) Andrew Tridgell 1994-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - -#define NO_SYSLOG - -#include "includes.h" - -extern int DEBUGLEVEL; - -/**************************************************************************** -recv an smb -****************************************************************************/ -BOOL msrpc_receive(struct msrpc_state *msrpc) -{ - return receive_smb(msrpc->fd,msrpc->inbuf,0); -} - -/**************************************************************************** - send an smb to a fd and re-establish if necessary -****************************************************************************/ -BOOL msrpc_send_prs(struct msrpc_state *msrpc, prs_struct *ps) -{ - size_t len = mem_buf_len(ps->data); - - DEBUG(10,("msrpc_send_prs: len %d\n", len)); - dbgflush(); - - _smb_setlen(msrpc->outbuf, len); - mem_buf_copy(&msrpc->outbuf[4], ps->data, 0, len); - - if (msrpc_send(msrpc, True)) - { - prs_mem_free(ps); - return True; - } - return False; -} - -/**************************************************************************** - receive msrpc packet -****************************************************************************/ -BOOL msrpc_receive_prs(struct msrpc_state *msrpc, prs_struct *ps) -{ - int len; - char *data; - - if (!msrpc_receive(msrpc)) - { - return False; - } - - len = smb_len(msrpc->inbuf); - - dump_data(10, msrpc->inbuf, len+4); - - prs_init(ps, len, 4, 0, False); - ps->offset = len; - data = mem_data(&ps->data, 0); - if (data == NULL || len <= 0) - { - return False; - } - - memcpy(data, smb_base(msrpc->inbuf), len); - - return True; -} - -/**************************************************************************** - send an smb to a fd and re-establish if necessary -****************************************************************************/ -BOOL msrpc_send(struct msrpc_state *msrpc, BOOL show) -{ - size_t len; - size_t nwritten=0; - ssize_t ret; - - len = smb_len(msrpc->outbuf) + 4; - - dump_data(10, msrpc->outbuf, len); - - while (nwritten < len) - { - ret = write_socket(msrpc->fd,msrpc->outbuf+nwritten,len - nwritten); - if (ret <= 0) - { - DEBUG(0,("Error writing %d bytes to msrpcent. %d. Exiting\n", - len,ret)); - return False; - } - nwritten += ret; - } - - return True; -} - -/**************************************************************************** -open the msrpcent sockets -****************************************************************************/ -BOOL msrpc_connect(struct msrpc_state *msrpc, const char *pipe_name) -{ - fstring path; - slprintf(path, sizeof(path)-1, "/tmp/.msrpc/%s", pipe_name); - - fstrcpy(msrpc->pipe_name, pipe_name); - - msrpc->fd = open_pipe_sock(path); - - if (msrpc->fd == -1) - { - return False; - } - - return True; -} - - -/**************************************************************************** -initialise a msrpcent structure -****************************************************************************/ -void msrpc_init_creds(struct msrpc_state *msrpc, const struct user_creds *usr) -{ - copy_user_creds(&msrpc->usr, usr); -} - -/**************************************************************************** -close the socket descriptor -****************************************************************************/ -void msrpc_close_socket(struct msrpc_state *msrpc) -{ - if (msrpc->fd != -1) - { - close(msrpc->fd); - } - msrpc->fd = -1; -} - - -/**************************************************************************** -set socket options on a open connection -****************************************************************************/ -void msrpc_sockopt(struct msrpc_state *msrpc, char *options) -{ - set_socket_options(msrpc->fd, options); -} - - -static BOOL msrpc_authenticate(struct msrpc_state *msrpc, - const struct user_creds *usr) -{ - struct msrpc_state msrpc_redir; - - int sock = msrpc->fd; - char *data; - prs_struct ps; - uint32 len; - char *in = msrpc->inbuf; - char *out = msrpc->outbuf; - uint16 command; - - command = usr != NULL ? AGENT_CMD_CON : AGENT_CMD_CON_ANON; - - if (!create_user_creds(&ps, msrpc->pipe_name, 0x0, command, usr)) - { - DEBUG(0,("could not parse credentials\n")); - close(sock); - return False; - } - - len = ps.offset; - data = mem_data(&ps.data, 0); - - SIVAL(data, 0, len); - -#ifdef DEBUG_PASSWORD - DEBUG(100,("data len: %d\n", len)); - dump_data(100, data, len); -#endif - - if (write(sock, data, len) <= 0) - { - DEBUG(0,("write failed\n")); - return False; - } - - if (msrpc->redirect) - { - len = read(sock, &msrpc_redir, sizeof(msrpc_redir)); - - if (len != sizeof(msrpc_redir)) - { - DEBUG(0,("read failed\n")); - return False; - } - - memcpy(msrpc, &msrpc_redir, sizeof(msrpc_redir)); - msrpc->inbuf = in; - msrpc->outbuf = out; - msrpc->fd = sock; - msrpc->usr.reuse = False; - } - else - { - uint32 status; - len = read(sock, &status, sizeof(status)); - - return len == sizeof(status) && status == 0x0; - } - return True; -} - -static BOOL msrpc_init_redirect(struct msrpc_state *msrpc, - const char* pipe_name, - const struct user_creds *usr) -{ - int sock; - fstring path; - - slprintf(path, sizeof(path)-1, "/tmp/.msrpc/.%s/agent", pipe_name); - - sock = open_pipe_sock(path); - - if (sock < 0) - { - return False; - } - - msrpc->fd = sock; - - if (!msrpc_authenticate(msrpc, usr)) - { - DEBUG(0,("authenticate failed\n")); - close(msrpc->fd); - msrpc->fd = -1; - return False; - } - - return True; -} - -BOOL msrpc_connect_auth(struct msrpc_state *msrpc, - const char* pipename, - const struct user_creds *usr) -{ - ZERO_STRUCTP(msrpc); - if (!msrpc_initialise(msrpc)) - { - DEBUG(0,("unable to initialise msrpcent connection.\n")); - return False; - } - - msrpc_init_creds(msrpc, usr); - - if (!msrpc_establish_connection(msrpc, pipename)) - { - msrpc_shutdown(msrpc); - return False; - } - - return True; -} - -/**************************************************************************** -initialise a msrpcent structure -****************************************************************************/ -struct msrpc_state *msrpc_initialise(struct msrpc_state *msrpc) -{ - if (!msrpc) { - msrpc = (struct msrpc_state *)malloc(sizeof(*msrpc)); - if (!msrpc) - return NULL; - ZERO_STRUCTP(msrpc); - } - - if (msrpc->initialised) { - msrpc_shutdown(msrpc); - } - - ZERO_STRUCTP(msrpc); - - msrpc->fd = -1; - msrpc->outbuf = (char *)malloc(CLI_BUFFER_SIZE+4); - msrpc->inbuf = (char *)malloc(CLI_BUFFER_SIZE+4); - if (!msrpc->outbuf || !msrpc->inbuf) - { - return False; - } - - msrpc->initialised = 1; - msrpc_init_creds(msrpc, NULL); - - return msrpc; -} - - -/**************************************************************************** -shutdown a msrpcent structure -****************************************************************************/ -void msrpc_shutdown(struct msrpc_state *msrpc) -{ - DEBUG(10,("msrpc_shutdown\n")); - if (msrpc->outbuf) - { - free(msrpc->outbuf); - } - if (msrpc->inbuf) - { - free(msrpc->inbuf); - } - msrpc_close_socket(msrpc); - memset(msrpc, 0, sizeof(*msrpc)); -} - -/**************************************************************************** -establishes a connection right up to doing tconX, reading in a password. -****************************************************************************/ -BOOL msrpc_establish_connection(struct msrpc_state *msrpc, - const char *pipe_name) -{ - DEBUG(5,("msrpc_establish_connection: connecting to %s (%s) - %s\n", - pipe_name, - msrpc->usr.ntc.user_name, msrpc->usr.ntc.domain)); - - /* establish connection */ - - if ((!msrpc->initialised)) - { - return False; - } - - if (msrpc->fd == -1 && msrpc->redirect) - { - if (msrpc_init_redirect(msrpc, pipe_name, &msrpc->usr)) - { - DEBUG(10,("msrpc_establish_connection: redirected OK\n")); - return True; - } - else - { - DEBUG(10,("redirect FAILED\n")); - return False; - } - } - if (msrpc->fd == -1) - { - if (!msrpc_connect(msrpc, pipe_name)) - { - DEBUG(1,("msrpc_establish_connection: failed %s)\n", - pipe_name)); - - return False; - } - } - - if (!msrpc_authenticate(msrpc, &msrpc->usr)) - { - DEBUG(0,("authenticate failed\n")); - close(msrpc->fd); - msrpc->fd = -1; - return False; - } - - return True; -} - diff --git a/source3/lib/msrpc_use.c b/source3/lib/msrpc_use.c deleted file mode 100644 index 193867e610..0000000000 --- a/source3/lib/msrpc_use.c +++ /dev/null @@ -1,321 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB client generic functions - Copyright (C) Andrew Tridgell 1994-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - -#define NO_SYSLOG - -#include "includes.h" -#include "trans2.h" - -extern int DEBUGLEVEL; -extern pstring scope; -extern pstring global_myname; - -struct msrpc_use -{ - struct msrpc_state *cli; - uint32 num_users; -}; - -static struct msrpc_use **msrpcs = NULL; -uint32 num_msrpcs = 0; - -/**************************************************************************** -terminate client connection -****************************************************************************/ -static void msrpc_use_free(struct msrpc_use *cli) -{ - if (cli->cli != NULL) - { - if (cli->cli->initialised) - { - msrpc_shutdown(cli->cli); - } - free(cli->cli); - } - - free(cli); -} - -/**************************************************************************** -free a client array -****************************************************************************/ -static void free_msrpc_array(uint32 num_entries, struct msrpc_use **entries) -{ - void(*fn)(void*) = (void(*)(void*))&msrpc_use_free; - free_void_array(num_entries, (void**)entries, *fn); -} - -/**************************************************************************** -add a client state to the array -****************************************************************************/ -static struct msrpc_use* add_msrpc_to_array(uint32 *len, - struct msrpc_use ***array, - struct msrpc_use *cli) -{ - int i; - for (i = 0; i < num_msrpcs; i++) - { - if (msrpcs[i] == NULL) - { - msrpcs[i] = cli; - return cli; - } - } - - return (struct msrpc_use*)add_item_to_array(len, - (void***)array, (void*)cli); - -} - -/**************************************************************************** -initiate client array -****************************************************************************/ -void init_msrpc_use(void) -{ - msrpcs = NULL; - num_msrpcs = 0; -} - -/**************************************************************************** -terminate client array -****************************************************************************/ -void free_msrpc_use(void) -{ - free_msrpc_array(num_msrpcs, msrpcs); - init_msrpc_use(); -} - -/**************************************************************************** -find client state. server name, user name, domain name and password must all -match. -****************************************************************************/ -static struct msrpc_use *msrpc_find(const char* pipe_name, - const struct user_creds *usr_creds) -{ - int i; - struct user_creds null_usr; - - copy_user_creds(&null_usr, usr_creds); - usr_creds = &null_usr; - - DEBUG(10,("msrpc_find: %s %s %s\n", - pipe_name, - usr_creds->ntc.user_name, - usr_creds->ntc.domain)); - - for (i = 0; i < num_msrpcs; i++) - { - char *msrpc_name = NULL; - struct msrpc_use *c = msrpcs[i]; - - if (c == NULL) continue; - - msrpc_name = c->cli->pipe_name; - - DEBUG(10,("msrpc_find[%d]: %s %s %s\n", - i, msrpc_name, - c->cli->usr.ntc.user_name, - c->cli->usr.ntc.domain)); - - if (!strequal(msrpc_name, pipe_name)) - { - continue; - } - if (!strequal(usr_creds->ntc.user_name, c->cli->usr.ntc.user_name)) - { - continue; - } - if (!usr_creds->reuse && - !pwd_compare(&usr_creds->ntc.pwd, &c->cli->usr.ntc.pwd)) - { - DEBUG(100,("password doesn't match\n")); - continue; - } - if (usr_creds->ntc.domain[0] == 0) - { - return c; - } - if (strequal(usr_creds->ntc.domain, c->cli->usr.ntc.domain)) - { - return c; - } - } - - return NULL; -} - -/**************************************************************************** -create a new client state from user credentials -****************************************************************************/ -static struct msrpc_use *msrpc_use_get(const char* pipe_name, - const struct user_creds *usr_creds) -{ - struct msrpc_use *cli = (struct msrpc_use*)malloc(sizeof(*cli)); - - if (cli == NULL) - { - return NULL; - } - - memset(cli, 0, sizeof(*cli)); - - cli->cli = msrpc_initialise(NULL); - - if (cli->cli == NULL) - { - return NULL; - } - - msrpc_init_creds(cli->cli, usr_creds); - - return cli; -} - -/**************************************************************************** -init client state -****************************************************************************/ -struct msrpc_state *msrpc_use_add(const char* pipe_name, - const struct user_creds *usr_creds, - BOOL redir) -{ - struct msrpc_use *cli = msrpc_find(pipe_name, usr_creds); - - if (cli != NULL) - { - cli->num_users++; - return cli->cli; - } - - /* reuse an existing connection requested, and one was not found */ - if (usr_creds != NULL && usr_creds->reuse && !redir) - { - return False; - } - - /* - * allocate - */ - - cli = msrpc_use_get(pipe_name, usr_creds); - cli->cli->redirect = redir; - - if (!msrpc_establish_connection(cli->cli, pipe_name)) - { - DEBUG(0,("msrpc_net_use_add: connection failed\n")); - cli->cli = NULL; - msrpc_use_free(cli); - return NULL; - } - - add_msrpc_to_array(&num_msrpcs, &msrpcs, cli); - cli->num_users++; - - return cli->cli; -} - -/**************************************************************************** -delete a client state -****************************************************************************/ -BOOL msrpc_use_del(const char* pipe_name, - const struct user_creds *usr_creds, - BOOL force_close, - BOOL *connection_closed) -{ - int i; - - DEBUG(10,("msrpc_net_use_del: %s. force close: %s\n", - pipe_name, BOOLSTR(force_close))); - - if (connection_closed != NULL) - { - *connection_closed = False; - } - - for (i = 0; i < num_msrpcs; i++) - { - char *msrpc_name = NULL; - - if (msrpcs[i] == NULL) continue; - if (msrpcs[i]->cli == NULL) continue; - - msrpc_name = msrpcs[i]->cli->pipe_name; - - if (!strequal(msrpc_name, pipe_name)) continue; - - if (strequal(usr_creds->ntc.user_name, - msrpcs[i]->cli->usr.ntc.user_name) && - strequal(usr_creds->ntc.domain, - msrpcs[i]->cli->usr.ntc.domain)) - { - /* decrement number of users */ - msrpcs[i]->num_users--; - - DEBUG(10,("idx: %i num_users now: %d\n", - i, msrpcs[i]->num_users)); - - if (force_close || msrpcs[i]->num_users == 0) - { - msrpc_use_free(msrpcs[i]); - msrpcs[i] = NULL; - if (connection_closed != NULL) - { - *connection_closed = True; - } - } - return True; - } - } - - return False; -} - -/**************************************************************************** -enumerate client states -****************************************************************************/ -void msrpc_net_use_enum(uint32 *num_cons, struct use_info ***use) -{ - int i; - - *num_cons = 0; - *use = NULL; - - for (i = 0; i < num_msrpcs; i++) - { - struct use_info item; - - ZERO_STRUCT(item); - - if (msrpcs[i] == NULL) continue; - - item.connected = msrpcs[i]->cli != NULL ? True : False; - - if (item.connected) - { - item.srv_name = msrpcs[i]->cli->pipe_name; - item.user_name = msrpcs[i]->cli->usr.ntc.user_name; - item.domain = msrpcs[i]->cli->usr.ntc.domain; - } - - add_use_info_to_array(num_cons, use, &item); - } -} - diff --git a/source3/lib/netmask.c b/source3/lib/netmask.c deleted file mode 100644 index 6d71058375..0000000000 --- a/source3/lib/netmask.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - code to query kernel netmask - Copyright (C) Andrew Tridgell 1998 - - 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. -*/ - - -/* working out the netmask for an interface is an incredibly non-portable - thing. We have several possible implementations below, and autoconf - tries each of them to see what works - - Note that this file does _not_ include includes.h. That is so this code - can be called directly from the autoconf tests. That also means - this code cannot use any of the normal Samba debug stuff or defines. - This is standalone code. - -*/ - -#ifndef AUTOCONF -#include "config.h" -#endif - -#ifdef HAVE_NETMASK_IFCONF - -#include <stdio.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <sys/ioctl.h> -#include <net/if.h> - -#ifndef SIOCGIFCONF -#include <sys/sockio.h> -#endif - -/* - * Prototype for gcc in fussy mode. - */ - -int get_netmask(struct in_addr *ipaddr, struct in_addr *nmask); - -/**************************************************************************** - get the netmask address for a local interface -****************************************************************************/ -int get_netmask(struct in_addr *ipaddr, struct in_addr *nmask) -{ - struct ifconf ifc; - char buff[2048]; - int fd, i, n; - struct ifreq *ifr=NULL; - - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { -#ifdef DEBUG - fprintf(stderr,"socket failed\n"); -#endif - return -1; - } - - ifc.ifc_len = sizeof(buff); - ifc.ifc_buf = buff; - if (ioctl(fd, SIOCGIFCONF, &ifc) != 0) { -#ifdef DEBUG - fprintf(stderr,"SIOCGIFCONF failed\n"); -#endif - close(fd); - return -1; - } - - ifr = ifc.ifc_req; - - n = ifc.ifc_len / sizeof(struct ifreq); - -#ifdef DEBUG - fprintf(stderr,"%d interfaces - looking for %s\n", - n, inet_ntoa(*ipaddr)); -#endif - - /* Loop through interfaces, looking for given IP address */ - for (i=n-1;i>=0;i--) { - if (ioctl(fd, SIOCGIFADDR, &ifr[i]) != 0) { -#ifdef DEBUG - fprintf(stderr,"SIOCGIFADDR failed\n"); -#endif - continue; - } - -#ifdef DEBUG - fprintf(stderr,"interface %s\n", - inet_ntoa((*(struct sockaddr_in *)&ifr[i].ifr_addr).sin_addr)); -#endif - if (ipaddr->s_addr != - (*(struct sockaddr_in *)&ifr[i].ifr_addr).sin_addr.s_addr) { - continue; - } - - if (ioctl(fd, SIOCGIFNETMASK, &ifr[i]) != 0) { -#ifdef DEBUG - fprintf(stderr,"SIOCGIFNETMASK failed\n"); -#endif - close(fd); - return -1; - } - close(fd); - (*nmask) = ((struct sockaddr_in *)&ifr[i].ifr_addr)->sin_addr; -#ifdef DEBUG - fprintf(stderr,"netmask %s\n", inet_ntoa(*nmask)); -#endif - return 0; - } - -#ifdef DEBUG - fprintf(stderr,"interface not found\n"); -#endif - - close(fd); - return -1; -} - -#elif defined(HAVE_NETMASK_IFREQ) - -#include <stdio.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <sys/ioctl.h> -#include <net/if.h> - -#ifndef SIOCGIFCONF -#include <sys/sockio.h> -#endif - -#ifndef I_STR -#include <sys/stropts.h> -#endif - - -/**************************************************************************** -this should cover most of the rest of systems -****************************************************************************/ - int get_netmask(struct in_addr *ipaddr, struct in_addr *nmask) -{ - struct ifreq ifreq; - struct strioctl strioctl; - struct ifconf *ifc; - char buff[2048]; - int fd, i, n; - struct ifreq *ifr=NULL; - - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { -#ifdef DEBUG - fprintf(stderr,"socket failed\n"); -#endif - return -1; - } - - ifc = (struct ifconf *)buff; - ifc->ifc_len = BUFSIZ - sizeof(struct ifconf); - strioctl.ic_cmd = SIOCGIFCONF; - strioctl.ic_dp = (char *)ifc; - strioctl.ic_len = sizeof(buff); - if (ioctl(fd, I_STR, &strioctl) < 0) { -#ifdef DEBUG - fprintf(stderr,"SIOCGIFCONF failed\n"); -#endif - close(fd); - return -1; - } - - ifr = (struct ifreq *)ifc->ifc_req; - - /* Loop through interfaces, looking for given IP address */ - n = ifc->ifc_len / sizeof(struct ifreq); - - for (i = 0; i<n; i++, ifr++) { -#ifdef DEBUG - fprintf(stderr,"interface %s\n", - inet_ntoa((*(struct sockaddr_in *)&ifr->ifr_addr).sin_addr.s_addr)); -#endif - if (ipaddr->s_addr == - (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) { - break; - } - } - -#ifdef DEBUG - if (i == n) { - fprintf(stderr,"interface not found\n"); - close(fd); - return -1; - } -#endif - - ifreq = *ifr; - - strioctl.ic_cmd = SIOCGIFNETMASK; - strioctl.ic_dp = (char *)&ifreq; - strioctl.ic_len = sizeof(struct ifreq); - if (ioctl(fd, I_STR, &strioctl) != 0) { -#ifdef DEBUG - fprintf(stderr,"Failed SIOCGIFNETMASK\n"); -#endif - close(fd); - return -1; - } - - close(fd); - *nmask = ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr; -#ifdef DEBUG - fprintf(stderr,"netmask %s\n", inet_ntoa(*nmask)); -#endif - return 0; -} - -#elif defined(HAVE_NETMASK_AIX) - -#include <stdio.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <sys/ioctl.h> -#include <net/if.h> - -#ifndef SIOCGIFCONF -#include <sys/sockio.h> -#endif - -/**************************************************************************** -this one is for AIX -****************************************************************************/ - int get_netmask(struct in_addr *ipaddr, struct in_addr *nmask) -{ - char buff[2048]; - int fd, i, n; - struct ifconf ifc; - struct ifreq *ifr=NULL; - - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { -#ifdef DEBUG - fprintf(stderr,"socket failed\n"); -#endif - return -1; - } - - - ifc.ifc_len = sizeof(buff); - ifc.ifc_buf = buff; - - if (ioctl(fd, SIOCGIFCONF, &ifc) != 0) { -#ifdef DEBUG - fprintf(stderr,"SIOCGIFCONF failed\n"); -#endif - close(fd); - return -1; - } - - ifr = ifc.ifc_req; - /* Loop through interfaces, looking for given IP address */ - i = ifc.ifc_len; - while (i > 0) { -#ifdef DEBUG - fprintf(stderr,"interface %s\n", - inet_ntoa((*(struct sockaddr_in *)&ifr->ifr_addr).sin_addr)); -#endif - if (ipaddr->s_addr == - (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) { - break; - } - i -= ifr->ifr_addr.sa_len + IFNAMSIZ; - ifr = (struct ifreq*) ((char*) ifr + ifr->ifr_addr.sa_len + - IFNAMSIZ); - } - - -#ifdef DEBUG - if (i <= 0) { - fprintf(stderr,"interface not found\n"); - close(fd); - return -1; - } -#endif - - if (ioctl(fd, SIOCGIFNETMASK, ifr) != 0) { -#ifdef DEBUG - fprintf(stderr,"SIOCGIFNETMASK failed\n"); -#endif - close(fd); - return -1; - } - - close(fd); - - (*nmask) = ((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr; -#ifdef DEBUG - fprintf(stderr,"netmask %s\n", inet_ntoa(*nmask)); -#endif - return 0; -} - -#else /* a dummy version */ -struct in_addr; /* it may not have been declared before */ - int get_netmask(struct in_addr *ipaddr, struct in_addr *nmask) -{ - return -1; -} -#endif - - -#ifdef AUTOCONF -/* this is the autoconf driver to test get_netmask() */ - - main() -{ - char buf[1024]; - struct hostent *hp; - struct in_addr ip, nmask; - - if (gethostname(buf, sizeof(buf)-1) != 0) { - fprintf(stderr,"gethostname failed\n"); - exit(1); - } - - hp = gethostbyname(buf); - - if (!hp) { - fprintf(stderr,"gethostbyname failed\n"); - exit(1); - } - - memcpy((char *)&ip, (char *)hp->h_addr, hp->h_length); - - if (get_netmask(&ip, &nmask) == 0) exit(0); - - fprintf(stderr,"get_netmask failed\n"); - exit(1); -} -#endif diff --git a/source3/lib/passcheck.c b/source3/lib/passcheck.c deleted file mode 100644 index bec6455059..0000000000 --- a/source3/lib/passcheck.c +++ /dev/null @@ -1,289 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Password and authentication handling - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -extern int DEBUGLEVEL; -extern int Protocol; - -extern pstring scope; -extern pstring global_myname; -extern fstring global_myworkgroup; - - - -/**************************************************************************** -core of smb password checking routine. -****************************************************************************/ -static BOOL smb_pwd_check_ntlmv1(char *password, unsigned char *part_passwd, - unsigned char *c8, - uchar user_sess_key[16]) -{ - /* Finish the encryption of part_passwd. */ - unsigned char p24[24]; - - if (part_passwd == NULL) - DEBUG(10,("No password set - allowing access\n")); - /* No password set - always true ! */ - if (part_passwd == NULL) - return True; - - SMBOWFencrypt(part_passwd, c8, p24); - if (user_sess_key != NULL) - { - SMBsesskeygen_ntv1(part_passwd, NULL, user_sess_key); - } - -#if DEBUG_PASSWORD - DEBUG(100,("Part password (P16) was |")); - dump_data(100, part_passwd, 16); - DEBUG(100,("Password from client was |")); - dump_data(100, password, 24); - DEBUG(100,("Given challenge was |")); - dump_data(100, c8, 8); - DEBUG(100,("Value from encryption was |")); - dump_data(100, p24, 24); -#endif - return (memcmp(p24, password, 24) == 0); -} - -/**************************************************************************** -core of smb password checking routine. -****************************************************************************/ -static BOOL smb_pwd_check_ntlmv2(char *password, size_t pwd_len, - unsigned char *part_passwd, - unsigned char const *c8, - const char *user, const char *domain, - char *user_sess_key) -{ - /* Finish the encryption of part_passwd. */ - unsigned char kr[16]; - unsigned char resp[16]; - - if (part_passwd == NULL) - { - DEBUG(10,("No password set - allowing access\n")); - } - /* No password set - always true ! */ - if (part_passwd == NULL) - { - return True; - } - - ntv2_owf_gen(part_passwd, user, domain, kr); - SMBOWFencrypt_ntv2(kr, c8, 8, password+16, pwd_len-16, resp); - if (user_sess_key != NULL) - { - SMBsesskeygen_ntv2(kr, resp, user_sess_key); - } - -#if DEBUG_PASSWORD - DEBUG(100,("Part password (P16) was |")); - dump_data(100, part_passwd, 16); - DEBUG(100,("Password from client was |")); - dump_data(100, password, pwd_len); - DEBUG(100,("Given challenge was |")); - dump_data(100, c8, 8); - DEBUG(100,("Value from encryption was |")); - dump_data(100, resp, 16); -#endif - - return (memcmp(resp, password, 16) == 0); -} - -/**************************************************************************** - Do a specific test for an smb password being correct, given a smb_password and - the lanman and NT responses. -****************************************************************************/ -BOOL smb_password_ok(struct smb_passwd *smb_pass, uchar challenge[8], - const char *user, const char *domain, - uchar *lm_pass, size_t lm_pwd_len, - uchar *nt_pass, size_t nt_pwd_len, - uchar user_sess_key[16]) -{ - if (smb_pass == NULL) - { - return False; - } - - DEBUG(4,("Checking SMB password for user %s\n", - smb_pass->unix_name)); - - if (smb_pass->acct_ctrl & ACB_DISABLED) - { - DEBUG(3,("account for user %s was disabled.\n", - smb_pass->unix_name)); - return False; - } - - if (challenge == NULL) - { - DEBUG(1,("no challenge available - password failed\n")); - return False; - } - - if ((Protocol >= PROTOCOL_NT1) && (smb_pass->smb_nt_passwd != NULL)) - { - /* We have the NT MD4 hash challenge available - see if we can - use it (ie. does it exist in the smbpasswd file). - */ - if (lp_server_ntlmv2() != False && nt_pwd_len > 24) - { - DEBUG(4,("smb_password_ok: Check NTLMv2 password\n")); - if (smb_pwd_check_ntlmv2(nt_pass, nt_pwd_len, - (uchar *)smb_pass->smb_nt_passwd, - challenge, user, domain, - user_sess_key)) - { - return True; - } - } - if (lp_server_ntlmv2() != True && nt_pwd_len == 24) - { - DEBUG(4,("smb_password_ok: Check NT MD4 password\n")); - if (smb_pwd_check_ntlmv1((char *)nt_pass, - (uchar *)smb_pass->smb_nt_passwd, - challenge, - user_sess_key)) - { - DEBUG(4,("NT MD4 password check succeeded\n")); - return True; - } - } - DEBUG(4,("NT MD4 password check failed\n")); - } - - if (lp_server_ntlmv2() == True) - { - DEBUG(4,("Not checking LM MD4 password\n")); - return False; - } - - /* Try against the lanman password. smb_pass->smb_passwd == NULL means - no password, allow access. */ - - DEBUG(4,("Checking LM MD4 password\n")); - - if ((smb_pass->smb_passwd == NULL) && - (smb_pass->acct_ctrl & ACB_PWNOTREQ)) - { - DEBUG(4,("no password required for user %s\n", - smb_pass->unix_name)); - return True; - } - - if ((smb_pass->smb_passwd != NULL) && - smb_pwd_check_ntlmv1((char *)lm_pass, - (uchar *)smb_pass->smb_passwd, - challenge, NULL)) - { - DEBUG(4,("LM MD4 password check succeeded\n")); - return(True); - } - - DEBUG(4,("LM MD4 password check failed\n")); - - return False; -} - - -/**************************************************************************** -check if a username/password is OK assuming the password is a 24 byte -SMB hash -return True if the password is correct, False otherwise -****************************************************************************/ -BOOL pass_check_smb(struct smb_passwd *smb_pass, char *domain, uchar *chal, - uchar *lm_pwd, size_t lm_pwd_len, - uchar *nt_pwd, size_t nt_pwd_len, - struct passwd *pwd, uchar user_sess_key[16]) -{ - const struct passwd *pass; - struct passwd pw; - char *user = NULL; - - if (smb_pass == NULL) - { - DEBUG(3,("Couldn't find user %s in smb_passwd file.\n", user)); - return False; - } - - user = smb_pass->unix_name; - - if (lm_pwd == NULL || nt_pwd == NULL) - { - return False; - } - - if (pwd != NULL && user == NULL) - { - pass = (struct passwd *) pwd; - user = pass->pw_name; - } - else - { - pass = Get_Pwnam(user,True); - if (pass == NULL) - { - DEBUG(3,("Couldn't find user %s\n",user)); - return False; - } - memcpy(&pw, pass, sizeof(struct passwd)); - pass = &pw; - } - - /* Quit if the account was disabled. */ - if (smb_pass->acct_ctrl & ACB_DISABLED) { - DEBUG(3,("account for user %s was disabled.\n", user)); - return False; - } - - /* Ensure the uid's match */ - if (smb_pass->unix_uid != pass->pw_uid) - { - DEBUG(3,("Error : UNIX (%d) and SMB (%d) uids in password files do not match !\n", pass->pw_uid, smb_pass->unix_uid)); - return False; - } - - if (lm_pwd[0] == '\0' && IS_BITS_SET_ALL(smb_pass->acct_ctrl, ACB_PWNOTREQ) && lp_null_passwords()) - { - DEBUG(3,("account for user %s has no password and null passwords are allowed.\n", smb_pass->unix_name)); - return(True); - } - - if (smb_password_ok(smb_pass, chal, user, domain, - lm_pwd, lm_pwd_len, - nt_pwd, nt_pwd_len, - user_sess_key)) - { - if (user_sess_key != NULL) - { -#ifdef DEBUG_PASSWORD - DEBUG(100,("user session key: ")); - dump_data(100, user_sess_key, 16); -#endif - } - return(True); - } - - DEBUG(3,("Error pass_check_smb failed\n")); - return False; -} - diff --git a/source3/lib/sids.c b/source3/lib/sids.c deleted file mode 100644 index 712eef8a0d..0000000000 --- a/source3/lib/sids.c +++ /dev/null @@ -1,523 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - - -extern int DEBUGLEVEL; -extern pstring scope; -extern pstring global_myname; - -/* - * This is set on startup - it defines the SID for this - * machine, and therefore the SAM database for which it is - * responsible. - */ - -DOM_SID global_sam_sid; - -/* - * This is the name associated with the SAM database for - * which this machine is responsible. In the case of a PDC - * or PDC, this name is the same as the workgroup. In the - * case of "security = domain" mode, this is the same as - * the name of the server (global_myname). - */ - -fstring global_sam_name; - -/* - * This is obtained on startup - it defines the SID for which - * this machine is a member. It is therefore only set, and - * used, in "security = domain" mode. - */ - -DOM_SID global_member_sid; - -/* - * note the lack of a "global_member_name" - this is because - * this is the same as "global_myworkgroup". - */ - -extern fstring global_myworkgroup; -/* fstring global_member_dom_name; */ - -/* - * some useful sids - */ - -DOM_SID global_sid_S_1_5_20; /* local well-known domain */ -DOM_SID global_sid_S_1_1; /* everyone */ -DOM_SID global_sid_S_1_3; /* Creator Owner */ -DOM_SID global_sid_S_1_5; /* NT Authority */ - -struct sid_map -{ - DOM_SID *sid; - char *name; - -}; - -struct sid_map static_sid_name_map[] = -{ - { &global_sid_S_1_5_20, "BUILTIN" }, - { &global_sid_S_1_1 , "Everyone" }, - { &global_sid_S_1_3 , "Creator Owner" }, - { &global_sid_S_1_5 , "NT Authority" }, - { &global_sam_sid , global_sam_name }, - { &global_member_sid , global_myworkgroup }, - { NULL , NULL } -}; - -struct sid_map **sid_name_map = NULL; -uint32 num_maps = 0; - -static struct sid_map *sid_map_dup(const struct sid_map *from) -{ - if (from != NULL) - { - struct sid_map *copy = (struct sid_map *) - malloc(sizeof(struct sid_map)); - if (copy != NULL) - { - ZERO_STRUCTP(copy); - if (from->name != NULL) - { - copy->name = strdup(from->name ); - } - if (from->sid != NULL) - { - copy->sid = sid_dup(from->sid); - } - } - return copy; - } - return NULL; -} - -static void sid_map_free(struct sid_map *map) -{ - if (map->name != NULL) - { - free(map->name); - } - if (map->sid != NULL) - { - free(map->sid); - } - free(map); -} - -/**************************************************************************** -free a sid map array -****************************************************************************/ -static void free_sidmap_array(uint32 num_entries, struct sid_map **entries) -{ - void(*fn)(void*) = (void(*)(void*))&sid_map_free; - free_void_array(num_entries, (void**)entries, *fn); -} - -/**************************************************************************** -add a sid map state to the array -****************************************************************************/ -struct sid_map* add_sidmap_to_array(uint32 *len, struct sid_map ***array, - const struct sid_map *name) -{ - void*(*fn)(const void*) = (void*(*)(const void*))&sid_map_dup; - return (struct sid_map*)add_copy_to_array(len, - (void***)array, (const void*)name, *fn, False); - -} -/**************************************************************************** - sets up the name associated with the SAM database for which we are responsible -****************************************************************************/ -void get_sam_domain_name(void) -{ - switch (lp_server_role()) - { - case ROLE_DOMAIN_PDC: - case ROLE_DOMAIN_BDC: - { - /* we are PDC (or BDC) for a Domain */ - fstrcpy(global_sam_name, lp_workgroup()); - break; - } - case ROLE_DOMAIN_MEMBER: - { - /* we are a "PDC", but FOR LOCAL SAM DATABASE ONLY */ - fstrcpy(global_sam_name, global_myname); - break; - } - default: - { - /* no domain role, probably due to "security = share" */ - memset(global_sam_name, 0, sizeof(global_sam_name)); - break; - } - } -} - -/**************************************************************************** - obtain the sid from the PDC. -****************************************************************************/ -BOOL get_member_domain_sid(void) -{ - switch (lp_server_role()) - { - case ROLE_DOMAIN_NONE: - { - ZERO_STRUCT(global_member_sid); - return True; - } - case ROLE_DOMAIN_PDC: - { - sid_copy(&global_member_sid, &global_sam_sid); - return True; - } - default: - { - /* member or BDC, we're going for connection to PDC */ - break; - } - } - - return get_domain_sids(lp_workgroup(), NULL, &global_member_sid); -} - - -/**************************************************************************** - creates some useful well known sids -****************************************************************************/ -void generate_wellknown_sids(void) -{ - string_to_sid(&global_sid_S_1_5_20, "S-1-5-32"); - string_to_sid(&global_sid_S_1_1 , "S-1-1" ); - string_to_sid(&global_sid_S_1_3 , "S-1-3" ); - string_to_sid(&global_sid_S_1_5 , "S-1-5" ); -} - -/**************************************************************************** - create a sid map table -****************************************************************************/ -BOOL create_sidmap_table(void) -{ - int i; - char **doms = NULL; - uint32 num_doms = 0; - - for (i = 0; static_sid_name_map[i].name != NULL; i++) - { - add_sidmap_to_array(&num_maps, &sid_name_map, - &static_sid_name_map[i]); - } - - enumtrustdoms(&doms, &num_doms); - - for (i = 0; i < num_doms; i++) - { - struct sid_map map; - DOM_SID sid; - - map.name = doms[i]; - map.sid = &sid; - - if (!read_sid(map.name, map.sid)) - { - DEBUG(0,("Could not read Domain SID %s\n", map.name)); - return False; - } - add_sidmap_to_array(&num_maps, &sid_name_map, &map); - } - - - for (i = 0; i < num_maps; i++) - { - fstring sidstr; - sid_to_string(sidstr, sid_name_map[i]->sid); - DEBUG(10,("Map:\tDomain:\t%s\tSID:\t%s\n", - sid_name_map[i]->name, sidstr)); - } - - - free_char_array(num_doms, doms); - - return True; -} - -/**************************************************************************** - Generate the global machine sid. Look for the DOMAINNAME.SID file first, if - not found then look in smb.conf and use it to create the DOMAINNAME.SID file. -****************************************************************************/ -BOOL generate_sam_sid(char *domain_name, DOM_SID *sid) -{ - char *p; - pstring sid_file; - pstring machine_sid_file; - fstring file_name; - - pstrcpy(sid_file, lp_smb_passwd_file()); - - if (sid_file[0] == 0) - { - DEBUG(0,("cannot find smb passwd file\n")); - return False; - } - - p = strrchr(sid_file, '/'); - if (p != NULL) - { - *++p = '\0'; - } - - if (!directory_exist(sid_file, NULL)) { - if (mkdir(sid_file, 0700) != 0) { - DEBUG(0,("can't create private directory %s : %s\n", - sid_file, strerror(errno))); - return False; - } - } - - pstrcpy(machine_sid_file, sid_file); - pstrcat(machine_sid_file, "MACHINE.SID"); - - slprintf(file_name, sizeof(file_name)-1, "%s.SID", domain_name); - strupper(file_name); - pstrcat(sid_file, file_name); - - if (file_exist(machine_sid_file, NULL)) - { - if (file_exist(sid_file, NULL)) - { - DEBUG(0,("both %s and %s exist when only one should, unable to continue\n", - machine_sid_file, sid_file)); - return False; - } - if (file_rename(machine_sid_file, sid_file)) - { - DEBUG(0,("could not rename %s to %s. Error was %s\n", - machine_sid_file, sid_file, strerror(errno))); - return False; - } - } - - /* attempt to read the SID from the file */ - if (read_sid(domain_name, sid)) - { - return True; - } - - if (!create_new_sid(sid)) - { - return False; - } - /* attempt to read the SID from the file */ - if (!write_sid(domain_name, sid)) - { - return True; - } - - /* during the attempt to write, someone else wrote? */ - - /* attempt to read the SID from the file */ - if (read_sid(domain_name, sid)) - { - return True; - } - - return True; -} - -/************************************************************************** - turns a domain name into a SID. - - *** side-effect: if the domain name is NULL, it is set to our domain *** - -***************************************************************************/ -BOOL map_domain_name_to_sid(DOM_SID *sid, char **nt_domain) -{ - int i = 0; - - if (nt_domain == NULL) - { - sid_copy(sid, &global_sam_sid); - return True; - } - - if ((*nt_domain) == NULL) - { - DEBUG(5,("map_domain_name_to_sid: overriding NULL name to %s\n", - global_sam_name)); - (*nt_domain) = strdup(global_sam_name); - sid_copy(sid, &global_sam_sid); - return True; - } - - if ((*nt_domain)[0] == 0) - { - free(*nt_domain); - (*nt_domain) = strdup(global_sam_name); - DEBUG(5,("map_domain_name_to_sid: overriding blank name to %s\n", - (*nt_domain))); - sid_copy(sid, &global_sam_sid); - return True; - } - - DEBUG(5,("map_domain_name_to_sid: %s\n", (*nt_domain))); - - for (i = 0; sid_name_map[i]->name != NULL; i++) - { - DEBUG(5,("compare: %s\n", sid_name_map[i]->name)); - if (strequal(sid_name_map[i]->name, (*nt_domain))) - { - fstring sid_str; - sid_copy(sid, sid_name_map[i]->sid); - sid_to_string(sid_str, sid_name_map[i]->sid); - DEBUG(5,("found %s\n", sid_str)); - return True; - } - } - - DEBUG(0,("map_domain_name_to_sid: mapping to %s NOT IMPLEMENTED\n", - (*nt_domain))); - return False; -} - -/************************************************************************** - turns a domain SID into a name. - -***************************************************************************/ -BOOL map_domain_sid_to_name(DOM_SID *sid, char *nt_domain) -{ - fstring sid_str; - int i = 0; - sid_to_string(sid_str, sid); - - DEBUG(5,("map_domain_sid_to_name: %s\n", sid_str)); - - if (nt_domain == NULL) - { - return False; - } - - for (i = 0; sid_name_map[i]->sid != NULL; i++) - { - sid_to_string(sid_str, sid_name_map[i]->sid); - DEBUG(5,("compare: %s\n", sid_str)); - if (sid_equal(sid_name_map[i]->sid, sid)) - { - fstrcpy(nt_domain, sid_name_map[i]->name); - DEBUG(5,("found %s\n", nt_domain)); - return True; - } - } - - DEBUG(0,("map_domain_sid_to_name: mapping NOT IMPLEMENTED\n")); - - return False; -} -/************************************************************************** - turns a domain SID into a domain controller name. -***************************************************************************/ -BOOL map_domain_sid_to_any_dc(DOM_SID *sid, char *dc_name) -{ - fstring domain; - - if (!map_domain_sid_to_name(sid, domain)) - { - return False; - } - - return get_any_dc_name(domain, dc_name); -} - -/************************************************************************** - splits a name of format \DOMAIN\name or name into its two components. - sets the DOMAIN name to global_sam_name if it has not been specified. -***************************************************************************/ -BOOL split_domain_name(const char *fullname, char *domain, char *name) -{ - fstring full_name; - char *p; - - if (fullname == NULL || domain == NULL || name == NULL) - { - return False; - } - - if (fullname[0] == '\\') - { - fullname++; - } - fstrcpy(full_name, fullname); - p = strchr(full_name+1, '\\'); - - if (p != NULL) - { - *p = 0; - fstrcpy(domain, full_name); - fstrcpy(name, p+1); - } - else - { - fstrcpy(domain, global_sam_name); - fstrcpy(name, full_name); - } - - DEBUG(10,("name '%s' split into domain:%s and nt name:%s'\n", fullname, domain, name)); - return True; -} - -/************************************************************************** - enumerates all trusted domains -***************************************************************************/ -BOOL enumtrustdoms(char ***doms, uint32 *num_entries) -{ - fstring tmp; - char *tok; - - /* add trusted domains */ - - tok = lp_trusted_domains(); - if (next_token(&tok, tmp, NULL, sizeof(tmp))) - { - do - { - fstring domain; - split_at_first_component(tmp, domain, '=', NULL); - add_chars_to_array(num_entries, doms, domain); - - } while (next_token(NULL, tmp, NULL, sizeof(tmp))); - } - - return True; -} - -/************************************************************************** - enumerates all domains for which the SAM server is responsible -***************************************************************************/ -BOOL enumdomains(char ***doms, uint32 *num_entries) -{ - add_chars_to_array(num_entries, doms, global_sam_name); - add_chars_to_array(num_entries, doms, "Builtin"); - - return True; -} - diff --git a/source3/lib/streams.c b/source3/lib/streams.c deleted file mode 100644 index 8e6ad9f53a..0000000000 --- a/source3/lib/streams.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1998 - - 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 "MacExtensions.h" - -extern int DEBUGLEVEL; - -/* -** Given a path to file/directory build a path to the stream in question. -** If it is not a directory they place the .streams folder after the last -** slash then add the filename with the stream cat on. If it is a directory -** then just cat the .streams folder and the stream on it. If mode is true -** then force the .streams directory to be created. -** -** Some examples. -** input:: -** fname = folder1/folder2/filea -** stream = :AFP_Resource:$DATA the resource fork -** isDir = False -** output:: -** streampath = folder1/folder2/.streams/filea:AFP_Resource:$DATA -** -** input:: -** fname = folder1/folder2 -** stream = :AFP_AfpInfo:$DATA the Finder Info -** isDir = True -** output:: -** streampath = folder1/folder2/.streams/:AFP_Resource:$DATA -** -*/ -void makestreampath(char *fname, char *stream, char *streampath, int mode, int isDir, int dirOnly) -{ - char *cptr; - - pstrcpy(streampath, fname); - if (!isDir) - { - cptr = strrchr(streampath, '/'); - if (cptr) *(cptr+1) = 0; - else streampath[0] = 0; - } - else - if (streampath[0] == 0) /* Start at the current position */ - pstrcat(streampath, "./"); - else pstrcat(streampath, "/"); - - pstrcat(streampath, STREAM_FOLDER_SLASH); - if (mode) - (void)mkdir(streampath, 0777); - if (! dirOnly) - { - cptr = strrchr(fname, '/'); - if (!isDir) - { - cptr = strrchr(fname, '/'); - if (cptr) pstrcat(streampath, cptr+1); - else pstrcat(streampath, fname); - } - pstrcat(streampath, stream); - } - DEBUG(4,("MACEXTENSION-makestreampath: streampath = %s\n", streampath)); -} - -/* -** Given a path to file/directory open the stream in question. -*/ -int openstream(char *fname, char *stream, int oflag, int mode, int isDir) -{ - pstring streampath; - char *cptr; - - makestreampath(fname, stream, streampath, mode, isDir, False); - return(open(streampath, oflag, mode)); -} - -/* -** Fill in the AFP structure with the default values and -** then write it out. -*/ -void writedefaultafp(int fd, SambaAfpInfo *safp, int writeit) -{ - safp->afp.afpi_Signature = AFP_Signature; /* Must be *(PDWORD)"AFP" */ - safp->afp.afpi_Version = AFP_Version; /* Must be 0x00010000 */ - safp->afp.afpi_Reserved1 = 0; - safp->afp.afpi_BackupTime = AFP_BackupTime; /* Backup time for the file/dir */ - bzero(safp->afp.afpi_FinderInfo, AFP_FinderSize); /* Finder Info (32 bytes) */ - bzero(safp->afp.afpi_ProDosInfo, 6); /* ProDos Info (6 bytes) # */ - bzero(safp->afp.afpi_Reserved2, 6); - safp->createtime = time(NULL); - if (writeit) (void)write(fd, safp, sizeof(*safp)); -} - -/* -** Check to see if the fname has a stream component. -** If it does then check to see if it is the data fork -** stream. If so then just remove the stream since we -** treat them the same otherwise build a path to the -** streams folder. -** Return true if it is a stream -** Return false no stream and the name has not been touched. -*/ -int CheckForStream(char *fname) -{ - pstring streampath; - char *cptr; - - cptr = strrchr(fname, ':'); - /* Must be a streams file */ - if (cptr && strequal(cptr, DefaultStreamTest)) - { - cptr = strstr(fname, AFPDATA_STREAM); - if (cptr) *cptr = 0;/* The datafork just remove the stream name */ - else /* Build the streams path */ - { - makestreampath(fname, "", streampath, 1, False, False); - pstrcpy(fname, streampath); - } - return(True); - } - return(False); -} diff --git a/source3/lib/unix_sec_ctxt.c b/source3/lib/unix_sec_ctxt.c deleted file mode 100644 index ead1f3c6d3..0000000000 --- a/source3/lib/unix_sec_ctxt.c +++ /dev/null @@ -1,303 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - uid/user handling - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -extern int DEBUGLEVEL; - -static uid_t initial_uid; -static gid_t initial_gid; - -/* what context is current */ -struct unix_sec_ctxt curr_ctxt; - -/**************************************************************************** -initialise the security context routines -****************************************************************************/ -void init_sec_ctxt(void) -{ - initial_uid = curr_ctxt.uid = geteuid(); - initial_gid = curr_ctxt.gid = getegid(); - - if (initial_gid != 0 && initial_uid == 0) { -#ifdef HAVE_SETRESUID - setresgid(0,0,0); -#else - setgid(0); - setegid(0); -#endif - } - - initial_uid = geteuid(); - initial_gid = getegid(); -} - - -/**************************************************************************** - become the specified uid -****************************************************************************/ -static BOOL become_uid(uid_t uid) -{ - if (initial_uid != 0) - { - return(True); - } - - if (uid == (uid_t)-1 || ((sizeof(uid_t) == 2) && (uid == (uid_t)65535))) - { - static int done; - if (!done) { - DEBUG(1,("WARNING: using uid %d is a security risk\n",(int)uid)); - done=1; - } - } - -#ifdef HAVE_TRAPDOOR_UID -#ifdef HAVE_SETUIDX - /* AIX3 has setuidx which is NOT a trapoor function (tridge) */ - if (setuidx(ID_EFFECTIVE, uid) != 0) { - if (seteuid(uid) != 0) { - DEBUG(1,("Can't set uid %d (setuidx)\n", (int)uid)); - return False; - } - } -#endif -#endif - -#ifdef HAVE_SETRESUID - if (setresuid(-1,uid,-1) != 0) -#else - if ((seteuid(uid) != 0) && - (setuid(uid) != 0)) -#endif - { - DEBUG(0,("Couldn't set uid %d currently set to (%d,%d)\n", - (int)uid,(int)getuid(), (int)geteuid())); - if (uid > (uid_t)32000) { - DEBUG(0,("Looks like your OS doesn't like high uid values - try using a different account\n")); - } - return(False); - } - - if (((uid == (uid_t)-1) || ((sizeof(uid_t) == 2) && (uid == 65535))) && (geteuid() != uid)) - { - DEBUG(0,("Invalid uid -1. perhaps you have a account with uid 65535?\n")); - return(False); - } - - curr_ctxt.uid = uid; - - return(True); -} - - -/**************************************************************************** - become the specified gid -****************************************************************************/ -static BOOL become_gid(gid_t gid) -{ - if (initial_uid != 0) - return(True); - - if (gid == (gid_t)-1 || ((sizeof(gid_t) == 2) && (gid == (gid_t)65535))) { - DEBUG(1,("WARNING: using gid %d is a security risk\n",(int)gid)); - } - -#ifdef HAVE_SETRESUID - if (setresgid(-1,gid,-1) != 0) -#else - if (setgid(gid) != 0) -#endif - { - DEBUG(0,("Couldn't set gid %d currently set to (%d,%d)\n", - (int)gid,(int)getgid(),(int)getegid())); - if (gid > 32000) { - DEBUG(0,("Looks like your OS doesn't like high gid values - try using a different account\n")); - } - return(False); - } - - curr_ctxt.gid = gid; - - return(True); -} - - -/**************************************************************************** - become the user of a connection number -****************************************************************************/ -BOOL become_unix_sec_ctxt(struct unix_sec_ctxt const *ctxt) -{ - if (curr_ctxt.uid == ctxt->uid) - { - DEBUG(4,("Skipping become_unix_sec_ctxt - already user\n")); - return(True); - } - - unbecome_unix_sec_ctxt(); - - curr_ctxt.ngroups = ctxt->ngroups; - curr_ctxt.groups = ctxt->groups; - curr_ctxt.name = ctxt->name; - - if (initial_uid == 0) - { - if (!become_uid(ctxt->uid)) return(False); -#ifdef HAVE_SETGROUPS - if (curr_ctxt.ngroups > 0) - { - if (setgroups(curr_ctxt.ngroups, - curr_ctxt.groups) < 0) - { - DEBUG(0,("setgroups call failed!\n")); - } - } -#endif - if (!become_gid(ctxt->gid)) return(False); - - } - - DEBUG(5,("become_unix_sec_ctxt uid=(%d,%d) gid=(%d,%d)\n", - (int)getuid(),(int)geteuid(),(int)getgid(),(int)getegid())); - - return(True); -} - -/**************************************************************************** - unbecome the user of a connection number -****************************************************************************/ -BOOL unbecome_unix_sec_ctxt(void) -{ - if (initial_uid == 0) - { -#ifdef HAVE_SETRESUID - setresuid(-1,getuid(),-1); - setresgid(-1,getgid(),-1); -#else - if (seteuid(initial_uid) != 0) - setuid(initial_uid); - setgid(initial_gid); -#endif - } - -#ifdef NO_EID - if (initial_uid == 0) - DEBUG(2,("Running with no EID\n")); - initial_uid = getuid(); - initial_gid = getgid(); -#else - if (geteuid() != initial_uid) { - DEBUG(0,("Warning: You appear to have a trapdoor uid system\n")); - initial_uid = geteuid(); - } - if (getegid() != initial_gid) { - DEBUG(0,("Warning: You appear to have a trapdoor gid system\n")); - initial_gid = getegid(); - } -#endif - - curr_ctxt.uid = initial_uid; - curr_ctxt.gid = initial_gid; - curr_ctxt.name = NULL; - - curr_ctxt.ngroups = 0; - curr_ctxt.groups = NULL; - - DEBUG(5,("unbecome_unix_sec_ctxt now uid=(%d,%d) gid=(%d,%d)\n", - (int)getuid(),(int)geteuid(),(int)getgid(),(int)getegid())); - - return(True); -} - -static struct unix_sec_ctxt curr_ctxt_saved; -static int become_root_depth; - -/**************************************************************************** -This is used when we need to do a privileged operation (such as mucking -with share mode files) and temporarily need root access to do it. This -call should always be paired with an unbecome_root() call immediately -after the operation - -Set save_dir if you also need to save/restore the CWD -****************************************************************************/ -void become_unix_root_sec_ctxt(void) -{ - if (become_root_depth) { - DEBUG(0,("ERROR: become root depth is non zero\n")); - } - - curr_ctxt_saved = curr_ctxt; - become_root_depth = 1; - - become_uid(0); - become_gid(0); -} - -/**************************************************************************** -When the privileged operation is over call this - -Set save_dir if you also need to save/restore the CWD -****************************************************************************/ -void unbecome_unix_root_sec_ctxt(void) -{ - if (become_root_depth != 1) - { - DEBUG(0,("ERROR: unbecome root depth is %d\n", - become_root_depth)); - } - - /* we might have done a become_user() while running as root, - if we have then become root again in order to become - non root! */ - if (curr_ctxt.uid != 0) - { - become_uid(0); - } - - /* restore our gid first */ - if (!become_gid(curr_ctxt_saved.gid)) - { - DEBUG(0,("ERROR: Failed to restore gid\n")); - exit(-1); - } - -#ifdef HAVE_SETGROUPS - if (curr_ctxt_saved.ngroups > 0) - { - if (setgroups(curr_ctxt_saved.ngroups, - curr_ctxt_saved.groups) < 0) - { - DEBUG(0,("setgroups call failed!\n")); - } - } -#endif - /* now restore our uid */ - if (!become_uid(curr_ctxt_saved.uid)) - { - DEBUG(0,("ERROR: Failed to restore uid\n")); - exit(-1); - } - - curr_ctxt = curr_ctxt_saved; - - become_root_depth = 0; -} - diff --git a/source3/lib/util_array.c b/source3/lib/util_array.c deleted file mode 100644 index c3945ff9f8..0000000000 --- a/source3/lib/util_array.c +++ /dev/null @@ -1,350 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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" - -void free_void_array(uint32 num_entries, void **entries, - void(free_item)(void*)) -{ - uint32 i; - if (entries != NULL) - { - for (i = 0; i < num_entries; i++) - { - if (entries[i] != NULL) - { - free_item(entries[i]); - } - } - free(entries); - } -} - -void* add_copy_to_array(uint32 *len, void ***array, const void *item, - void*(item_dup)(const void*), BOOL alloc_anyway) -{ - void* copy = NULL; - if (len == NULL || array == NULL) - { - return NULL; - } - - if (item != NULL || alloc_anyway) - { - copy = item_dup(item); - return add_item_to_array(len, array, copy); - } - return copy; -} - -void* add_item_to_array(uint32 *len, void ***array, void *item) -{ - if (len == NULL || array == NULL) - { - return NULL; - } - - (*array) = (void**)Realloc((*array), ((*len)+1)*sizeof((*array)[0])); - - if ((*array) != NULL) - { - (*array)[(*len)] = item; - (*len)++; - return item; - } - return NULL; -} - -static void use_info_free(struct use_info *item) -{ - if (item != NULL) - { - if (item->srv_name != NULL) - { - free(item->srv_name); - } - if (item->user_name != NULL) - { - free(item->user_name); - } - if (item->domain != NULL) - { - free(item->domain); - } - free(item); - } -} - -static struct use_info *use_info_dup(const struct use_info *from) -{ - if (from != NULL) - { - struct use_info *copy = (struct use_info *) - malloc(sizeof(struct use_info)); - if (copy != NULL) - { - ZERO_STRUCTP(copy); - copy->connected = from->connected; - if (from->srv_name != NULL) - { - copy->srv_name = strdup(from->srv_name ); - } - if (from->user_name != NULL) - { - copy->user_name = strdup(from->user_name); - } - if (from->domain != NULL) - { - copy->domain = strdup(from->domain ); - } - } - return copy; - } - return NULL; -} - -void free_use_info_array(uint32 num_entries, struct use_info **entries) -{ - void(*fn)(void*) = (void(*)(void*))&use_info_free; - free_void_array(num_entries, (void**)entries, *fn); -} - -struct use_info* add_use_info_to_array(uint32 *len, struct use_info ***array, - const struct use_info *name) -{ - void*(*fn)(const void*) = (void*(*)(const void*))&use_info_dup; - return (struct use_info*)add_copy_to_array(len, - (void***)array, (const void*)name, *fn, False); - -} - -void free_char_array(uint32 num_entries, char **entries) -{ - void(*fn)(void*) = (void(*)(void*))&free; - free_void_array(num_entries, (void**)entries, *fn); -} - -char* add_chars_to_array(uint32 *len, char ***array, const char *name) -{ - void*(*fn)(const void*) = (void*(*)(const void*))&strdup; - return (char*)add_copy_to_array(len, - (void***)array, (const void*)name, *fn, False); - -} - -static uint32 *uint32_dup(const uint32* from) -{ - if (from != NULL) - { - uint32 *copy = (uint32 *)malloc(sizeof(uint32)); - if (copy != NULL) - { - memcpy(copy, from, sizeof(*copy)); - } - return copy; - } - return NULL; -} - -void free_uint32_array(uint32 num_entries, uint32 **entries) -{ - void(*fn)(void*) = (void(*)(void*))&free; - free_void_array(num_entries, (void**)entries, *fn); -} - -uint32* add_uint32s_to_array(uint32 *len, uint32 ***array, const uint32 *name) -{ - void*(*fn)(const void*) = (void*(*)(const void*))&uint32_dup; - return (uint32*)add_copy_to_array(len, - (void***)array, (const void*)name, *fn, False); - -} - -void free_unistr_array(uint32 num_entries, UNISTR2 **entries) -{ - void(*fn)(void*) = (void(*)(void*))&unistr2_free; - free_void_array(num_entries, (void**)entries, *fn); -} - -UNISTR2* add_unistr_to_array(uint32 *len, UNISTR2 ***array, UNISTR2 *name) -{ - void*(*fn)(const void*) = (void*(*)(const void*))&unistr2_dup; - return (UNISTR2*)add_copy_to_array(len, - (void***)array, (const void*)name, *fn, False); -} - -void free_sid_array(uint32 num_entries, DOM_SID **entries) -{ - void(*fn)(void*) = (void(*)(void*))&free; - free_void_array(num_entries, (void**)entries, *fn); -} - -DOM_SID* add_sid_to_array(uint32 *len, DOM_SID ***array, const DOM_SID *sid) -{ - void*(*fn)(const void*) = (void*(*)(const void*))&sid_dup; - return (DOM_SID*)add_copy_to_array(len, - (void***)array, (const void*)sid, *fn, False); -} - -void free_devmode(DEVICEMODE *devmode) -{ - if (devmode!=NULL) - { - if (devmode->private!=NULL) - free(devmode->private); - free(devmode); - } -} - -void free_printer_info_2(PRINTER_INFO_2 *printer) -{ - if (printer!=NULL) - { - free_devmode(printer->devmode); - free(printer); - } -} - -static PRINTER_INFO_2 *prt2_dup(const PRINTER_INFO_2* from) -{ - PRINTER_INFO_2 *copy = (PRINTER_INFO_2 *)malloc(sizeof(PRINTER_INFO_2)); - if (copy != NULL) - { - if (from != NULL) - { - memcpy(copy, from, sizeof(*copy)); - } - else - { - ZERO_STRUCTP(copy); - } - } - return copy; -} - -void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries) -{ - void(*fn)(void*) = (void(*)(void*))&free_printer_info_2; - free_void_array(num_entries, (void**)entries, *fn); -} - -PRINTER_INFO_2 *add_print2_to_array(uint32 *len, PRINTER_INFO_2 ***array, - const PRINTER_INFO_2 *prt) -{ - void*(*fn)(const void*) = (void*(*)(const void*))&prt2_dup; - return (PRINTER_INFO_2*)add_copy_to_array(len, - (void***)array, (const void*)prt, *fn, True); -} - -static PRINTER_INFO_1 *prt1_dup(const PRINTER_INFO_1* from) -{ - PRINTER_INFO_1 *copy = (PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1)); - if (copy != NULL) - { - if (from != NULL) - { - memcpy(copy, from, sizeof(*copy)); - } - else - { - ZERO_STRUCTP(copy); - } - } - return copy; -} - -void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries) -{ - void(*fn)(void*) = (void(*)(void*))&free; - free_void_array(num_entries, (void**)entries, *fn); -} - -PRINTER_INFO_1 *add_print1_to_array(uint32 *len, PRINTER_INFO_1 ***array, - const PRINTER_INFO_1 *prt) -{ - void*(*fn)(const void*) = (void*(*)(const void*))&prt1_dup; - return (PRINTER_INFO_1*)add_copy_to_array(len, - (void***)array, (const void*)prt, *fn, True); -} - -static JOB_INFO_1 *job1_dup(const JOB_INFO_1* from) -{ - JOB_INFO_1 *copy = (JOB_INFO_1 *)malloc(sizeof(JOB_INFO_1)); - if (copy != NULL) - { - if (from != NULL) - { - memcpy(copy, from, sizeof(*copy)); - } - else - { - ZERO_STRUCTP(copy); - } - } - return copy; -} - -void free_job1_array(uint32 num_entries, JOB_INFO_1 **entries) -{ - void(*fn)(void*) = (void(*)(void*))&free; - free_void_array(num_entries, (void**)entries, *fn); -} - -JOB_INFO_1 *add_job1_to_array(uint32 *len, JOB_INFO_1 ***array, - const JOB_INFO_1 *job) -{ - void*(*fn)(const void*) = (void*(*)(const void*))&job1_dup; - return (JOB_INFO_1*)add_copy_to_array(len, - (void***)array, (const void*)job, *fn, True); -} - -static JOB_INFO_2 *job2_dup(const JOB_INFO_2* from) -{ - JOB_INFO_2 *copy = (JOB_INFO_2 *)malloc(sizeof(JOB_INFO_2)); - if (copy != NULL) - { - if (from != NULL) - { - memcpy(copy, from, sizeof(*copy)); - } - else - { - ZERO_STRUCTP(copy); - } - } - return copy; -} - -void free_job2_array(uint32 num_entries, JOB_INFO_2 **entries) -{ - void(*fn)(void*) = (void(*)(void*))&free; - free_void_array(num_entries, (void**)entries, *fn); -} - -JOB_INFO_2 *add_job2_to_array(uint32 *len, JOB_INFO_2 ***array, - const JOB_INFO_2 *job) -{ - void*(*fn)(const void*) = (void*(*)(const void*))&job2_dup; - return (JOB_INFO_2*)add_copy_to_array(len, - (void***)array, (const void*)job, *fn, True); -} - diff --git a/source3/lib/util_hnd.c b/source3/lib/util_hnd.c deleted file mode 100644 index b895fb31c0..0000000000 --- a/source3/lib/util_hnd.c +++ /dev/null @@ -1,472 +0,0 @@ - -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1997, - * Copyright (C) Luke Kenneth Casson Leighton 1996-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" - - -extern int DEBUGLEVEL; - -#ifndef MAX_OPEN_POLS -#define MAX_OPEN_POLS 64 -#endif - -#define POL_NO_INFO 0 -#define POL_REG_INFO 1 -#define POL_SAMR_INFO 2 -#define POL_CLI_INFO 3 - -struct reg_info -{ - /* for use by \PIPE\winreg */ - fstring name; /* name of registry key */ -}; - -struct samr_info -{ - /* for use by the \PIPE\samr policy */ - DOM_SID sid; - uint32 rid; /* relative id associated with the pol_hnd */ - uint32 status; /* some sort of flag. best to record it. comes from opnum 0x39 */ -}; - -struct con_info -{ - struct cli_connection *con; - void (*free)(struct cli_connection*); -}; - -static struct policy -{ - struct policy *next, *prev; - int pnum; - BOOL open; - POLICY_HND pol_hnd; - int type; - - union { - struct samr_info *samr; - struct reg_info *reg; - struct con_info *con; - - } dev; - -} *Policy; - -static struct bitmap *bmap; - - -/**************************************************************************** - create a unique policy handle -****************************************************************************/ -static void create_pol_hnd(POLICY_HND *hnd) -{ - static uint32 pol_hnd_low = 0; - static uint32 pol_hnd_high = 0; - - if (hnd == NULL) return; - - /* i severely doubt that pol_hnd_high will ever be non-zero... */ - pol_hnd_low++; - if (pol_hnd_low == 0) pol_hnd_high++; - - SIVAL(hnd->data, 0 , 0x0); /* first bit must be null */ - SIVAL(hnd->data, 4 , pol_hnd_low ); /* second bit is incrementing */ - SIVAL(hnd->data, 8 , pol_hnd_high); /* second bit is incrementing */ - SIVAL(hnd->data, 12, time(NULL)); /* something random */ - SIVAL(hnd->data, 16, getpid()); /* something more random */ -} - -/**************************************************************************** - initialise policy handle states... -****************************************************************************/ -BOOL init_policy_hnd(int num_pol_hnds) -{ - bmap = bitmap_allocate(num_pol_hnds); - - return bmap != NULL; -} - -/**************************************************************************** - find first available policy slot. creates a policy handle for you. -****************************************************************************/ -BOOL register_policy_hnd(POLICY_HND *hnd) -{ - int i; - struct policy *p; - - i = bitmap_find(bmap, 1); - - if (i == -1) { - DEBUG(0,("ERROR: out of Policy Handles!\n")); - return False; - } - - p = (struct policy *)malloc(sizeof(*p)); - if (!p) { - DEBUG(0,("ERROR: out of memory!\n")); - return False; - } - - ZERO_STRUCTP(p); - - p->open = True; - p->pnum = i; - p->type = POL_NO_INFO; - - memcpy(&p->pol_hnd, hnd, sizeof(*hnd)); - - bitmap_set(bmap, i); - - DLIST_ADD(Policy, p); - - DEBUG(4,("Opened policy hnd[%x] ", i)); - dump_data(4, (char *)hnd->data, sizeof(hnd->data)); - - return True; -} - -/**************************************************************************** - find first available policy slot. creates a policy handle for you. -****************************************************************************/ -BOOL open_policy_hnd(POLICY_HND *hnd) -{ - create_pol_hnd(hnd); - return register_policy_hnd(hnd); -} - -/**************************************************************************** - find policy by handle -****************************************************************************/ -static struct policy *find_policy(const POLICY_HND *hnd) -{ - struct policy *p; - - for (p=Policy;p;p=p->next) { - if (memcmp(&p->pol_hnd, hnd, sizeof(*hnd)) == 0) { - DEBUG(4,("Found policy hnd[%x] ", p->pnum)); - dump_data(4, (const char *)hnd->data, - sizeof(hnd->data)); - return p; - } - } - - DEBUG(4,("Policy not found: ")); - dump_data(4, (const char *)hnd->data, sizeof(hnd->data)); - - return NULL; -} - -/**************************************************************************** - find policy index by handle -****************************************************************************/ -int find_policy_by_hnd(const POLICY_HND *hnd) -{ - struct policy *p = find_policy(hnd); - - return p?p->pnum:-1; -} - -/**************************************************************************** - set samr rid -****************************************************************************/ -BOOL set_policy_samr_rid(POLICY_HND *hnd, uint32 rid) -{ - struct policy *p = find_policy(hnd); - - if (p && p->open) - { - DEBUG(3,("Setting policy device rid=%x pnum=%x\n", - rid, p->pnum)); - - if (p->dev.samr == NULL) - { - p->dev.samr = (struct samr_info*)malloc(sizeof(*p->dev.samr)); - } - if (p->dev.samr == NULL) - { - return False; - } - p->dev.samr->rid = rid; - return True; - } - - DEBUG(3,("Error setting policy rid=%x\n",rid)); - return False; -} - - -/**************************************************************************** - set samr pol status. absolutely no idea what this is. -****************************************************************************/ -BOOL set_policy_samr_pol_status(POLICY_HND *hnd, uint32 pol_status) -{ - struct policy *p = find_policy(hnd); - - if (p && p->open) - { - DEBUG(3,("Setting policy status=%x pnum=%x\n", - pol_status, p->pnum)); - - if (p->dev.samr == NULL) - { - p->type = POL_SAMR_INFO; - p->dev.samr = (struct samr_info*)malloc(sizeof(*p->dev.samr)); - } - if (p->dev.samr == NULL) - { - return False; - } - p->dev.samr->status = pol_status; - return True; - } - - DEBUG(3,("Error setting policy status=%x\n", - pol_status)); - return False; -} - -/**************************************************************************** - set samr sid -****************************************************************************/ -BOOL set_policy_samr_sid(POLICY_HND *hnd, DOM_SID *sid) -{ - pstring sidstr; - struct policy *p = find_policy(hnd); - - if (p && p->open) { - DEBUG(3,("Setting policy sid=%s pnum=%x\n", - sid_to_string(sidstr, sid), p->pnum)); - - if (p->dev.samr == NULL) - { - p->type = POL_SAMR_INFO; - p->dev.samr = (struct samr_info*)malloc(sizeof(*p->dev.samr)); - } - if (p->dev.samr == NULL) - { - return False; - } - memcpy(&p->dev.samr->sid, sid, sizeof(*sid)); - return True; - } - - DEBUG(3,("Error setting policy sid=%s\n", - sid_to_string(sidstr, sid))); - return False; -} - -/**************************************************************************** - get samr sid -****************************************************************************/ -BOOL get_policy_samr_sid(POLICY_HND *hnd, DOM_SID *sid) -{ - struct policy *p = find_policy(hnd); - - if (p != NULL && p->open) - { - pstring sidstr; - memcpy(sid, &p->dev.samr->sid, sizeof(*sid)); - DEBUG(3,("Getting policy sid=%s pnum=%x\n", - sid_to_string(sidstr, sid), p->pnum)); - - return True; - } - - DEBUG(3,("Error getting policy\n")); - return False; -} - -/**************************************************************************** - get samr rid -****************************************************************************/ -uint32 get_policy_samr_rid(POLICY_HND *hnd) -{ - struct policy *p = find_policy(hnd); - - if (p && p->open) { - uint32 rid = p->dev.samr->rid; - DEBUG(3,("Getting policy device rid=%x pnum=%x\n", - rid, p->pnum)); - - return rid; - } - - DEBUG(3,("Error getting policy\n")); - return 0xffffffff; -} - -/**************************************************************************** - set reg name -****************************************************************************/ -BOOL set_policy_reg_name(POLICY_HND *hnd, fstring name) -{ - struct policy *p = find_policy(hnd); - - if (p && p->open) - { - DEBUG(3,("Getting policy pnum=%x\n", - p->pnum)); - - if (p->dev.reg == NULL) - { - p->type = POL_REG_INFO; - p->dev.reg = (struct reg_info*)malloc(sizeof(*p->dev.reg)); - } - if (p->dev.reg == NULL) - { - return False; - } - fstrcpy(p->dev.reg->name, name); - return True; - } - - DEBUG(3,("Error setting policy name=%s\n", name)); - return False; -} - -/**************************************************************************** - set reg name -****************************************************************************/ -BOOL get_policy_reg_name(POLICY_HND *hnd, fstring name) -{ - struct policy *p = find_policy(hnd); - - if (p && p->open) - { - DEBUG(3,("Setting policy pnum=%x name=%s\n", - p->pnum, name)); - - fstrcpy(name, p->dev.reg->name); - DEBUG(5,("getting policy reg name=%s\n", name)); - return True; - } - - DEBUG(3,("Error getting policy reg name\n")); - return False; -} - -/**************************************************************************** - set con state -****************************************************************************/ -BOOL set_policy_con(POLICY_HND *hnd, struct cli_connection *con, - void (*free_fn)(struct cli_connection *)) -{ - struct policy *p = find_policy(hnd); - - if (p && p->open) - { - DEBUG(3,("Setting policy con state pnum=%x\n", p->pnum)); - - if (p->dev.con == NULL) - { - p->type = POL_CLI_INFO; - p->dev.con = (struct con_info*)malloc(sizeof(*p->dev.con)); - } - if (p->dev.con == NULL) - { - return False; - } - p->dev.con->con = con; - p->dev.con->free = free_fn; - return True; - } - - DEBUG(3,("Error setting policy con state\n")); - - return False; -} - -/**************************************************************************** - get con state -****************************************************************************/ -BOOL get_policy_con(const POLICY_HND *hnd, struct cli_connection **con) -{ - struct policy *p = find_policy(hnd); - - if (p != NULL && p->open) - { - DEBUG(3,("Getting con state pnum=%x\n", p->pnum)); - - if (con != NULL) - { - (*con ) = p->dev.con->con; - } - - return True; - } - - DEBUG(3,("Error getting policy\n")); - return False; -} - -/**************************************************************************** - close an lsa policy -****************************************************************************/ -BOOL close_policy_hnd(POLICY_HND *hnd) -{ - struct policy *p = find_policy(hnd); - - if (!p) - { - DEBUG(3,("Error closing policy\n")); - return False; - } - - DEBUG(3,("Closed policy name pnum=%x\n", p->pnum)); - - DLIST_REMOVE(Policy, p); - - bitmap_clear(bmap, p->pnum); - - ZERO_STRUCTP(p); - ZERO_STRUCTP(hnd); - - switch (p->type) - { - case POL_REG_INFO: - { - free(p->dev.reg); - break; - } - case POL_SAMR_INFO: - { - free(p->dev.samr); - break; - } - case POL_CLI_INFO: - { - if (p->dev.con->free != NULL) - { - p->dev.con->free(p->dev.con->con); - } - free(p->dev.con); - break; - } - } - - free(p); - - return True; -} - diff --git a/source3/lib/util_pwdb.c b/source3/lib/util_pwdb.c deleted file mode 100644 index 3de1829da3..0000000000 --- a/source3/lib/util_pwdb.c +++ /dev/null @@ -1,435 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Password and authentication handling - Copyright (C) Jeremy Allison 1996-1998 - Copyright (C) Luke Kenneth Casson Leighton 1996-1998 - - 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 "nterr.h" - -extern int DEBUGLEVEL; -extern DOM_SID global_sam_sid; -extern fstring global_sam_name; - -extern DOM_SID global_member_sid; -extern fstring global_myworkgroup; - -extern DOM_SID global_sid_S_1_5_20; - -extern pstring global_myname; - -typedef struct -{ - uint32 rid; - char *defaultname; - char *name; -} rid_name; - -/* - * A list of the rids of well known BUILTIN and Domain users - * and groups. - */ - -static rid_name builtin_alias_rids[] = -{ - { BUILTIN_ALIAS_RID_ADMINS , "Administrators" , NULL }, - { BUILTIN_ALIAS_RID_USERS , "Users" , NULL }, - { BUILTIN_ALIAS_RID_GUESTS , "Guests" , NULL }, - { BUILTIN_ALIAS_RID_POWER_USERS , "Power Users" , NULL }, - - { BUILTIN_ALIAS_RID_ACCOUNT_OPS , "Account Operators" , NULL }, - { BUILTIN_ALIAS_RID_SYSTEM_OPS , "System Operators" , NULL }, - { BUILTIN_ALIAS_RID_PRINT_OPS , "Print Operators" , NULL }, - { BUILTIN_ALIAS_RID_BACKUP_OPS , "Backup Operators" , NULL }, - { BUILTIN_ALIAS_RID_REPLICATOR , "Replicator" , NULL }, - { 0 , NULL , NULL} -}; - -/* array lookup of well-known Domain RID users. */ -static rid_name domain_user_rids[] = -{ - { DOMAIN_USER_RID_ADMIN , "Administrator" , NULL }, - { DOMAIN_USER_RID_GUEST , "Guest" , NULL }, - { 0 , NULL , NULL} -}; - -/* array lookup of well-known Domain RID groups. */ -static rid_name domain_group_rids[] = -{ - { DOMAIN_GROUP_RID_ADMINS , "Domain Admins" , NULL }, - { DOMAIN_GROUP_RID_USERS , "Domain Users" , NULL }, - { DOMAIN_GROUP_RID_GUESTS , "Domain Guests" , NULL }, - { 0 , NULL , NULL} -}; - -/******************************************************************* - make an entry in wk name map - the name is strdup()ed! - *******************************************************************/ -static BOOL make_alias_entry(rid_name *map, char *defaultname, char *name) -{ - if(isdigit(*defaultname)) - { - long rid = -1; - char *s; - - if(*defaultname == '0') - { - if(defaultname[1] == 'x') - { - s = "%lx"; - defaultname += 2; - } - else - { - s = "%lo"; - } - } - else - { - s = "%ld"; - } - - sscanf(defaultname, s, &rid); - - for( ; map->rid; map++) - { - if(map->rid == rid) { - map->name = strdup(name); - DEBUG(5, ("make_alias_entry: mapping %s (rid 0x%x) to %s\n", - map->defaultname, map->rid, map->name)); - return True; - } - } - return False; - } - - for( ; map->rid; map++) - { - if(!StrCaseCmp(map->name, defaultname)) { - map->name = strdup(name); - DEBUG(5, ("make_alias_entry: mapping %s (rid 0x%x) to %s\n", - map->defaultname, map->rid, map->name)); - return True; - } - } - return False; -} - -/******************************************************************* - reset wk map to default values - *******************************************************************/ -static void reset_wk_map(rid_name *map) -{ - for( ; map->rid; map++) - { - if(map->name != NULL && map->name != map->defaultname) - free(map->name); - map->name = map->defaultname; - } -} - -/******************************************************************* - reset all wk maps - *******************************************************************/ -static void reset_wk_maps(void) -{ - DEBUG(4, ("reset_wk_maps: Initializing maps\n")); - reset_wk_map(builtin_alias_rids); - reset_wk_map(domain_user_rids); - reset_wk_map(domain_group_rids); -} - -/******************************************************************* - Load builtin alias map - *******************************************************************/ -static BOOL load_wk_rid_map(void) -{ - static int map_initialized = 0; - static time_t builtin_rid_file_last_modified = (time_t)0; - char *builtin_rid_file = lp_builtinrid_file(); - - FILE *fp; - char *s; - pstring buf; - - if (!map_initialized) - { - reset_wk_maps(); - map_initialized = 1; - } - - if (!*builtin_rid_file) - { - return False; - } - - fp = open_file_if_modified(builtin_rid_file, "r", &builtin_rid_file_last_modified); - if(!fp) - { - DEBUG(0,("load_wk_rid_map: can't open name map %s. Error was %s\n", - builtin_rid_file, strerror(errno))); - return False; - } - - reset_wk_maps(); - DEBUG(4,("load_wk_rid_map: Scanning builtin rid map %s\n",builtin_rid_file)); - - while ((s = fgets_slash(buf, sizeof(buf), fp)) != NULL) - { - pstring defaultname; - pstring name; - - DEBUG(10,("Read line |%s|\n", s)); - - if (!*s || strchr("#;",*s)) - continue; - - if (!next_token(&s,name, "\t\n\r=", sizeof(defaultname))) - continue; - - if (!next_token(&s,defaultname, "\t\n\r=", sizeof(name))) - continue; - - trim_string(defaultname, " ", " "); - trim_string(name, " ", " "); - - if (!*defaultname || !*name) - continue; - - if(make_alias_entry(builtin_alias_rids, defaultname, name)) - continue; - if(make_alias_entry(domain_user_rids, defaultname, name)) - continue; - if(make_alias_entry(domain_group_rids, defaultname, name)) - continue; - - DEBUG(0,("load_wk_rid_map: Unknown alias %s in map %s\n", - defaultname, builtin_rid_file)); - } - - fclose(fp); - return True; -} - -/******************************************************************* - lookup_wk_group_name - ********************************************************************/ -uint32 lookup_wk_group_name(const char *group_name, const char *domain, - DOM_SID *sid, uint8 *type) -{ - char *grp_name; - int i = -1; /* start do loop at -1 */ - uint32 rid; - (*type) = SID_NAME_DOM_GRP; - - if (strequal(domain, global_sam_name)) - { - sid_copy(sid, &global_sam_sid); - } - else if (strequal(domain, "BUILTIN")) - { - sid_copy(sid, &global_sid_S_1_5_20); - } - else - { - return 0xC0000000 | NT_STATUS_NONE_MAPPED; - } - - load_wk_rid_map(); - - do /* find, if it exists, a group rid for the group name */ - { - i++; - rid = domain_group_rids[i].rid; - grp_name = domain_group_rids[i].name; - - if (strequal(grp_name, group_name)) - { - sid_append_rid(sid, rid); - - return 0x0; - } - - } while (grp_name != NULL); - - return 0xC0000000 | NT_STATUS_NONE_MAPPED; -} - -/******************************************************************* - lookup_wk_user_name - ********************************************************************/ -uint32 lookup_wk_user_name(const char *user_name, const char *domain, - DOM_SID *sid, uint8 *type) -{ - char *usr_name; - int i = -1; /* start do loop at -1 */ - (*type) = SID_NAME_USER; - - if (strequal(domain, global_sam_name)) - { - sid_copy(sid, &global_sam_sid); - } - else if (strequal(domain, "BUILTIN")) - { - sid_copy(sid, &global_sid_S_1_5_20); - } - else - { - return 0xC0000000 | NT_STATUS_NONE_MAPPED; - } - - load_wk_rid_map(); - - do /* find, if it exists, a alias rid for the alias name */ - { - i++; - usr_name = domain_user_rids[i].name; - - } while (usr_name != NULL && !strequal(usr_name, user_name)); - - if (usr_name != NULL) - { - sid_append_rid(sid, domain_user_rids[i].rid); - return 0; - } - - return 0xC0000000 | NT_STATUS_NONE_MAPPED; -} - -/******************************************************************* - lookup_builtin_alias_name - ********************************************************************/ -uint32 lookup_builtin_alias_name(const char *alias_name, const char *domain, - DOM_SID *sid, uint8 *type) -{ - char *als_name; - int i = 0; - uint32 rid; - - if (strequal(domain, "BUILTIN")) - { - if (sid != NULL) - { - sid_copy(sid, &global_sid_S_1_5_20); - } - } - else - { - return 0xC0000000 | NT_STATUS_NONE_MAPPED; - } - - load_wk_rid_map(); - - do /* find, if it exists, a alias rid for the alias name*/ - { - rid = builtin_alias_rids[i].rid; - als_name = builtin_alias_rids[i].name; - - if (strequal(als_name, alias_name)) - { - if (sid != NULL) - { - sid_append_rid(sid, rid); - } - - if (type != NULL) - { - (*type) = SID_NAME_ALIAS; - } - - return 0x0; - } - - i++; - - } while (als_name != NULL); - - return 0xC0000000 | NT_STATUS_NONE_MAPPED; -} - -/************************************************************* - initialise password databases, domain names, domain sid. -**************************************************************/ -BOOL pwdb_initialise(BOOL is_server) -{ - get_sam_domain_name(); - - if (!init_myworkgroup()) - { - return False; - } - - generate_wellknown_sids(); - - if (is_server) - { - if (!generate_sam_sid(global_sam_name, &global_sam_sid)) - { - DEBUG(0,("ERROR: Samba cannot create a SAM SID for its domain (%s).\n", - global_sam_name)); - return False; - } - } - else - { - if (!get_domain_sids(lp_workgroup(), &global_member_sid, - &global_sam_sid)) - { - return False; - } - } - - create_sidmap_table(); - - return initialise_password_db(); -} - -/************************************************************* - the following functions lookup wk rid's. - these may be unnecessary... -**************************************************************/ -static char *lookup_wk_rid(uint32 rid, rid_name *table) -{ - load_wk_rid_map(); - for( ; table->rid ; table++) - { - if(table->rid == rid) - { - return table->name; - } - } - return NULL; -} - -char *lookup_wk_alias_rid(uint32 rid) -{ - return lookup_wk_rid(rid, builtin_alias_rids); -} - -char *lookup_wk_user_rid(uint32 rid) -{ - return lookup_wk_rid(rid, domain_user_rids); -} - -char *lookup_wk_group_rid(uint32 rid) -{ - return lookup_wk_rid(rid, domain_group_rids); -} - diff --git a/source3/lib/util_status.c b/source3/lib/util_status.c deleted file mode 100644 index 836388a1bd..0000000000 --- a/source3/lib/util_status.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba connection status utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Michael Glauche 1999 - - 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" - -extern int DEBUGLEVEL; - -/******************************************************************* -parse the STATUS..LCK file. caller is responsible for freeing *crec. -********************************************************************/ -BOOL get_connection_status(struct connect_record **crec, - uint32 *connection_count) -{ - int fd; - pstring fname; - int conn; - int num_recs; - struct connect_record *c; - int i; - - if (crec == NULL || connection_count == NULL) - { - return False; - } - - pstrcpy(fname,lp_lockdir()); - standard_sub_basic(fname); - trim_string(fname,"","/"); - pstrcat(fname,"/STATUS..LCK"); - - fd = sys_open(fname,O_RDONLY, 0); - - if (fd == -1) - { - DEBUG(0,("Couldn't open status file %s\n",fname)); - return False; - } - - (*crec) = NULL; - - num_recs = file_size(fname) / sizeof(*c); - - DEBUG(5,("Opened status file %s, record count %d\n",fname, num_recs)); - - for (i = 0, conn = 0; i < num_recs; i++) - { - (*crec) = Realloc((*crec), (conn+1) * sizeof((*crec)[conn])); - if ((*crec) == NULL) - { - DEBUG(0,("Realloc failed in get_connection_status\n")); - return False; - } - - c = &((*crec)[conn]); - if (sys_lseek(fd,i*sizeof(*c),SEEK_SET) != i*sizeof(*c) || - read(fd,c,sizeof(*c)) != sizeof(*c)) - { - DEBUG(0,("unable to read a crec in get_connection_status\n")); - break; - } - DEBUG(10,("cnum:%u. pid: %d magic: %x\n", - c->cnum, c->pid, c->magic)); - - /* valid connection, smbd process still going, connection still going */ - if ( c->magic == 0x280267 && process_exists(c->pid) && c->cnum != -1 ) - { - conn++; - } - - } - close(fd); - (*connection_count)=conn; - return True; -} - -/******************************************************************* -Get the number of open Sessions. Not optimal yet. Has at least O(n*log(n)). - ********************************************************************/ -BOOL get_session_count(struct connect_record **srec,uint32 *session_count) -{ - struct connect_record *crec = NULL; - struct connect_record *c; - - uint32 connection_count; - uint32 conn; - int *pid; - int i; - int MaxPid; - BOOL found; - - (*srec) = NULL; - pid = NULL; - if (get_connection_status(&crec, &connection_count)) - { - MaxPid = 0; - for (conn = 0; conn < connection_count; conn++) - { - DEBUG(10,("Connection nr : %u\n",conn)); - found=False; - for (i = 0; i < MaxPid; i++) - { - if (crec[conn].pid == pid[i]) - { - found = True; - i=MaxPid; - } - } - if (!found) { - (*srec) = Realloc((*srec), (MaxPid+1) * sizeof((*srec)[MaxPid])); - if ((*srec) == NULL) - { - DEBUG(0,("Realloc failed in get_connection_status\n")); - return False; - } - pid = Realloc(pid, (MaxPid+1) * sizeof(int)); - if (pid == NULL) - { - DEBUG(0,("Realloc failed in get_session_count\n")); - free(crec); - return False; - } - c = &((*srec)[MaxPid]); - pid[MaxPid]=crec[conn].pid; - pstrcpy(c->machine,crec[conn].machine); - c->uid = crec[conn].uid; - c->pid = crec[conn].pid; - c->cnum = crec[conn].cnum; - pstrcpy(c->name,crec[conn].name); - - MaxPid++; - } - } - } else { -/* crec is not valid, so no need to free it here */ - return False; - } - free(crec); - (*session_count) = MaxPid; - return True; -} - diff --git a/source3/lib/vagent.c b/source3/lib/vagent.c deleted file mode 100644 index 96df03e2f3..0000000000 --- a/source3/lib/vagent.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2 - SMB agent/socket plugin - Copyright (C) Andrew Tridgell 1999 - - 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 "smb.h" - -extern int DEBUGLEVEL; - - -/**************************************************************************** -terminate socket connection -****************************************************************************/ -static void sock_redir_free(struct vagent_ops *va, struct sock_redir *sock) -{ - if (sock->c != -1) - { - close(sock->c); - sock->c = -1; - } - if (sock->n != NULL) - { - va->free_sock(sock->n); - sock->n = NULL; - } - free(sock); -} - -/**************************************************************************** -free a sockent array -****************************************************************************/ -static void free_sock_array(struct vagent_ops*va) -{ - void(*fn)(void*) = (void(*)(void*))&va->free_sock; - free_void_array(va->num_socks, (void**)va->socks, *fn); -} - -/**************************************************************************** -add a sockent state to the array -****************************************************************************/ -static struct sock_redir* add_sock_to_array(uint32 *len, - struct sock_redir ***array, - struct sock_redir *sock) -{ - int i; - for (i = 0; i < (*len); i++) - { - if ((*array)[i] == NULL) - { - (*array)[i] = sock; - return sock; - } - } - - return (struct sock_redir*)add_item_to_array(len, - (void***)array, (void*)sock); - -} - -/**************************************************************************** -initiate sockent array -****************************************************************************/ -void init_sock_redir(struct vagent_ops*va) -{ - va->socks = NULL; - va->num_socks = 0; -} - -/**************************************************************************** -terminate sockent array -****************************************************************************/ -void free_sock_redir(struct vagent_ops*va) -{ - free_sock_array(va); - init_sock_redir(va); -} - -/**************************************************************************** -create a new sockent state from user credentials -****************************************************************************/ -static struct sock_redir *sock_redir_get(struct vagent_ops *va, int fd) -{ - struct sock_redir *sock = (struct sock_redir*)malloc(sizeof(*sock)); - - if (sock == NULL) - { - return NULL; - } - - ZERO_STRUCTP(sock); - - sock->c = fd; - sock->n = NULL; - - DEBUG(10,("sock_redir_get:\tfd:\t%d\n", fd)); - - return sock; -} -/**************************************************************************** -init sock state -****************************************************************************/ -static void sock_add(struct vagent_ops *va, int fd) -{ - struct sock_redir *sock; - sock = sock_redir_get(va, fd); - if (sock != NULL) - { - add_sock_to_array(&va->num_socks, &va->socks, sock); - } -} - -/**************************************************************************** -delete a sockent state -****************************************************************************/ -static BOOL sock_del(struct vagent_ops *va, int fd) -{ - int i; - - for (i = 0; i < va->num_socks; i++) - { - if (va->socks[i] == NULL) continue; - if (va->socks[i]->c == fd) - { - sock_redir_free(va, va->socks[i]); - va->socks[i] = NULL; - return True; - } - } - - return False; -} - -void start_agent(struct vagent_ops *va) -{ - int s, c; - - s = va->get_agent_sock(va->id); - - while (1) - { - int i; - fd_set fds; - int num; - struct sockaddr_un addr; - int in_addrlen = sizeof(addr); - int maxfd = s; - - FD_ZERO(&fds); - FD_SET(s, &fds); - - for (i = 0; i < va->num_socks; i++) - { - if (va->socks[i] != NULL) - { - int fd = va->socks[i]->c; - FD_SET(fd, &fds); - maxfd = MAX(maxfd, fd); - - if (va->socks[i]->n != NULL) - { - fd = va->socks[i]->s; - FD_SET(fd, &fds); - maxfd = MAX(fd, maxfd); - } - } - } - - dbgflush(); - num = sys_select(maxfd+1,&fds,NULL, NULL); - - if (num <= 0) - { - continue; - } - - if (FD_ISSET(s, &fds)) - { - FD_CLR(s, &fds); - c = accept(s, (struct sockaddr*)&addr, &in_addrlen); - if (c != -1) - { - sock_add(va, c); - } - } - - for (i = 0; i < va->num_socks; i++) - { - if (va->socks[i] == NULL) - { - continue; - } - if (FD_ISSET(va->socks[i]->c, &fds)) - { - FD_CLR(va->socks[i]->c, &fds); - if (!va->process_cli_sock(va->socks, - va->num_socks, - va->socks[i])) - { - sock_redir_free(va, va->socks[i]); - va->socks[i] = NULL; - } - } - if (va->socks[i] == NULL) - { - continue; - } - if (va->socks[i]->n == NULL) - { - continue; - } - if (FD_ISSET(va->socks[i]->s, &fds)) - { - FD_CLR(va->socks[i]->s, &fds); - if (!va->process_srv_sock(va->socks, - va->num_socks, - va->socks[i]->s)) - { - sock_redir_free(va, va->socks[i]); - va->socks[i] = NULL; - } - } - } - } -} - diff --git a/source3/lib/vuser.c b/source3/lib/vuser.c deleted file mode 100644 index 09a553e4e6..0000000000 --- a/source3/lib/vuser.c +++ /dev/null @@ -1,195 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Password and authentication handling - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -extern int DEBUGLEVEL; - -/* this holds info on user ids that are already validated for this VC */ -static user_struct *validated_users = NULL; -static int num_validated_users = 0; - -/**************************************************************************** -check if a uid has been validated, and return an pointer to the user_struct -if it has. NULL if not. vuid is biased by an offset. This allows us to -tell random client vuid's (normally zero) from valid vuids. -****************************************************************************/ -user_struct *get_valid_user_struct(uint16 vuid) -{ - if (vuid == UID_FIELD_INVALID) - return NULL; - vuid -= VUID_OFFSET; - if ((vuid >= (uint16)num_validated_users) || - (validated_users[vuid].uid == (uid_t)-1) || (validated_users[vuid].gid == (gid_t)-1)) - return NULL; - return &validated_users[vuid]; -} - -/**************************************************************************** -invalidate a uid -****************************************************************************/ -void invalidate_vuid(uint16 vuid) -{ - user_struct *vuser = get_valid_user_struct(vuid); - - if (vuser == NULL) return; - - vuser->uid = (uid_t)-1; - vuser->gid = (gid_t)-1; - - /* same number of igroups as groups */ - vuser->n_groups = 0; - - if (vuser->groups) - free((char *)vuser->groups); - - vuser->groups = NULL; -} - - -/**************************************************************************** -return a validated username -****************************************************************************/ -char *validated_username(uint16 vuid) -{ - user_struct *vuser = get_valid_user_struct(vuid); - if (vuser == NULL) - return 0; - return(vuser->name); -} - - - -/**************************************************************************** -register a uid/name pair as being valid and that a valid password -has been given. vuid is biased by an offset. This allows us to -tell random client vuid's (normally zero) from valid vuids. -****************************************************************************/ -uint16 create_vuid(uid_t uid, gid_t gid, int n_groups, gid_t *groups, - char *unix_name, char *requested_name, - char *real_name, - BOOL guest, uchar user_sess_key[16]) -{ - user_struct *vuser; - - validated_users = (user_struct *)Realloc(validated_users, - sizeof(user_struct)* - (num_validated_users+1)); - - if (!validated_users) - { - DEBUG(0,("Failed to realloc users struct!\n")); - num_validated_users = 0; - return UID_FIELD_INVALID; - } - - vuser = &validated_users[num_validated_users]; - num_validated_users++; - - vuser->uid = uid; - vuser->gid = gid; - vuser->guest = guest; - fstrcpy(vuser->name,unix_name); - fstrcpy(vuser->requested_name,requested_name); - fstrcpy(vuser->real_name,real_name); - memcpy(vuser->user_sess_key, user_sess_key, sizeof(vuser->user_sess_key)); - - vuser->n_groups = n_groups; - vuser->groups = groups; - - DEBUG(3,("uid %d registered to name %s\n",(int)uid,unix_name)); - - return (uint16)((num_validated_users - 1) + VUID_OFFSET); -} - -/**************************************************************************** -register a uid/name pair as being valid and that a valid password -has been given. vuid is biased by an offset. This allows us to -tell random client vuid's (normally zero) from valid vuids. -****************************************************************************/ -uint16 register_vuid(uid_t uid,gid_t gid, char *unix_name, char *requested_name, BOOL guest, uchar user_sess_key[16]) -{ - int n_groups; - gid_t *groups; - fstring real_name; - struct passwd *pwfile; /* for getting real name from passwd file */ - - /* Ensure no vuid gets registered in share level security. */ - if(lp_security() == SEC_SHARE) - return UID_FIELD_INVALID; - -#if 0 - /* - * After observing MS-Exchange services writing to a Samba share - * I belive this code is incorrect. Each service does its own - * sessionsetup_and_X for the same user, and as each service shuts - * down, it does a user_logoff_and_X. As we are consolidating multiple - * sessionsetup_and_X's onto the same vuid here, when the first service - * shuts down, it invalidates all the open files for the other services. - * Hence I am removing this code and forcing each sessionsetup_and_X - * to get a new vuid. - * Jeremy Allison. (jallison@whistle.com). - */ - - int i; - for(i = 0; i < num_validated_users; i++) { - vuser = &validated_users[i]; - if ( vuser->uid == uid ) - return (uint16)(i + VUID_OFFSET); /* User already validated */ - } -#endif - - validated_users = (user_struct *)Realloc(validated_users, - sizeof(user_struct)* - (num_validated_users+1)); - - if (!validated_users) - { - DEBUG(0,("Failed to realloc users struct!\n")); - num_validated_users = 0; - return UID_FIELD_INVALID; - } - - /* Find all the groups this uid is in and store them. - Used by become_user() */ - get_unixgroups(unix_name,uid,gid, - &n_groups, - &groups); - - DEBUG(3,("uid %d registered to name %s\n",(int)uid,unix_name)); - - DEBUG(3, ("Clearing default real name\n")); - fstrcpy(real_name, "<Full Name>\0"); - if (lp_unix_realname()) - { - if ((pwfile=hashed_getpwnam(unix_name))!= NULL) - { - DEBUG(3, ("User name: %s\tReal name: %s\n",unix_name,pwfile->pw_gecos)); - fstrcpy(real_name, pwfile->pw_gecos); - } - } - - return create_vuid(uid, gid, n_groups, groups, - unix_name, requested_name, - real_name, - guest, user_sess_key); -} - diff --git a/source3/libsmb/clienttrust.c b/source3/libsmb/clienttrust.c deleted file mode 100644 index b223750529..0000000000 --- a/source3/libsmb/clienttrust.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1997, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1997, - * Copyright (C) Paul Ashton 1997. - * Copyright (C) Jeremy Allison 1998. - * - * 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. - */ - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" - -extern int DEBUGLEVEL; -extern pstring scope; -extern pstring global_myname; - -/********************************************************* - Change the domain password on the PDC. -**********************************************************/ - -static BOOL modify_trust_password( char *domain, char *remote_machine, - unsigned char orig_trust_passwd_hash[16], - unsigned char new_trust_passwd_hash[16], - uint16 sec_chan) -{ - struct nmb_name calling, called; - fstring trust_acct; - fstring srv_name; - - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, remote_machine); - strupper(srv_name); - - fstrcpy(trust_acct, global_myname); - fstrcat(trust_acct, "$"); - - make_nmb_name(&calling, global_myname , 0x0 , scope); - make_nmb_name(&called , remote_machine, 0x20, scope); - - if (cli_nt_setup_creds(srv_name, global_myname, trust_acct, - orig_trust_passwd_hash, sec_chan) != 0x0) - { - return False; - } - - if (!cli_nt_srv_pwset( srv_name, global_myname, trust_acct, - new_trust_passwd_hash, - sec_chan ) ) - { - return False; - } - - return True; -} - -/************************************************************************ - Change the trust account password for a domain. - The user of this function must have locked the trust password file for - update. -************************************************************************/ - -BOOL change_trust_account_password(char *domain, char *remote_machine_list, - uint16 sec_chan) -{ - fstring remote_machine; - unsigned char old_trust_passwd_hash[16]; - unsigned char new_trust_passwd_hash[16]; - time_t lct; - BOOL res; - - if(!get_trust_account_password( old_trust_passwd_hash, &lct)) { - DEBUG(0,("change_trust_account_password: unable to read the machine \ -account password for domain %s.\n", domain)); - return False; - } - - /* - * Create the new (random) password. - */ - generate_random_buffer( new_trust_passwd_hash, 16, True); - - while(remote_machine_list && - next_token(&remote_machine_list, remote_machine, - LIST_SEP, sizeof(remote_machine))) { - strupper(remote_machine); - if(modify_trust_password( domain, remote_machine, - old_trust_passwd_hash, new_trust_passwd_hash, sec_chan)) { - DEBUG(0,("%s : change_trust_account_password: Changed password for \ -domain %s.\n", timestring(), domain)); - /* - * Return the result of trying to write the new password - * back into the trust account file. - */ - res = set_trust_account_password(new_trust_passwd_hash); - memset(new_trust_passwd_hash, 0, 16); - memset(old_trust_passwd_hash, 0, 16); - return res; - } - } - - memset(new_trust_passwd_hash, 0, 16); - memset(old_trust_passwd_hash, 0, 16); - - DEBUG(0,("%s : change_trust_account_password: Failed to change password for \ -domain %s.\n", timestring(), domain)); - return False; -} - diff --git a/source3/lsarpcd/lsarpcd.c b/source3/lsarpcd/lsarpcd.c deleted file mode 100644 index 050a593eb0..0000000000 --- a/source3/lsarpcd/lsarpcd.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Main SMB server routines - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -fstring pipe_name; - -pstring servicesf = CONFIGFILE; -extern pstring debugf; -extern BOOL append_log; -extern int DEBUGLEVEL; - -void msrpc_service_init(void) -{ - if (!pwdb_initialise(True)) - { - exit(-1); - } - - if(!initialise_sam_password_db()) - { - exit(-1); - } - - if(!initialise_passgrp_db()) - { - exit(-1); - } - - if(!initialise_group_db()) - { - exit(-1); - } - - if(!initialise_alias_db()) - { - exit(-1); - } - - if(!initialise_builtin_db()) - { - exit(-1); - } - - if (!get_member_domain_sid()) - { - DEBUG(0,("ERROR: Samba cannot obtain PDC SID from PDC(s) %s.\n", - lp_passwordserver())); - exit(-1); - } -} - -/**************************************************************************** - reload the services file - **************************************************************************/ -BOOL reload_services(BOOL test) -{ - BOOL ret; - - if (lp_loaded()) { - pstring fname; - pstrcpy(fname,lp_configfile()); - if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) { - pstrcpy(servicesf,fname); - test = False; - } - } - - reopen_logs(); - - if (test && !lp_file_list_changed()) - return(True); - - lp_killunused(NULL); - - ret = lp_load(servicesf,False,False,True); - - /* perhaps the config filename is now set */ - if (!test) - reload_services(True); - - reopen_logs(); - - load_interfaces(); - - return(ret); -} - -/**************************************************************************** - main program -****************************************************************************/ - int main(int argc,char *argv[]) -{ -#ifdef HAVE_SET_AUTH_PARAMETERS - set_auth_parameters(argc,argv); -#endif - -#ifdef HAVE_SETLUID - /* needed for SecureWare on SCO */ - setluid(0); -#endif - - append_log = True; - - TimeInit(); - - fstrcpy(pipe_name, "lsarpc"); - setup_logging(argv[0],False); - slprintf(debugf, sizeof(debugf), "%s/log.%s", LOGFILEBASE, pipe_name); - add_msrpc_command_processor( pipe_name, argv[0], api_ntlsa_rpc ); - - return msrpc_main(argc, argv); -} diff --git a/source3/msrpc/msrpcd.c b/source3/msrpc/msrpcd.c deleted file mode 100644 index d6ae3ca642..0000000000 --- a/source3/msrpc/msrpcd.c +++ /dev/null @@ -1,571 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Main SMB server routines - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -extern pstring servicesf; -extern pstring debugf; -extern pstring global_myname; - -int am_parent = 1; - -/* the last message the was processed */ -int last_message = -1; - -/* a useful macro to debug the last message processed */ -#define LAST_MESSAGE() smb_fn_name(last_message) - -extern pstring scope; -extern int DEBUGLEVEL; - -extern fstring remote_machine; -extern pstring myhostname; -extern pstring pipe_name; - -extern pstring OriginalDir; - -/**************************************************************************** - when exiting, take the whole family -****************************************************************************/ -static void *dflt_sig(void) -{ - exit_server("caught signal"); - return NULL; -} - -/**************************************************************************** - Send a SIGTERM to our process group. -*****************************************************************************/ -static void killkids(void) -{ - if(am_parent) kill(0,SIGTERM); -} - - -/**************************************************************************** - open and listen to a socket -****************************************************************************/ -static int open_server_socket(void) -{ - int s; - fstring dir; - fstring path; - - slprintf(dir, sizeof(dir)-1, "/tmp/.msrpc"); - slprintf(path, sizeof(path)-1, "%s/%s", dir, pipe_name); - - s = create_pipe_socket(dir, 0777, path, 0777); - - if (s == -1) - return -1; - /* ready to listen */ - if (listen(s, 5) == -1) { - DEBUG(0,("listen: %s\n", strerror(errno))); - close(s); - return -1; - } - return s; -} - -/**************************************************************************** - open the socket communication -****************************************************************************/ -static int open_sockets(BOOL is_daemon) -{ - int ClientMSRPC; - int num_interfaces = iface_count(); - int fd_listenset; - fd_set listen_set; - int s; - - memset(&fd_listenset, 0, sizeof(fd_listenset)); - -#ifdef HAVE_ATEXIT - { - static int atexit_set; - if(atexit_set == 0) { - atexit_set=1; - atexit(killkids); - } - } -#endif - - /* Stop zombies */ - CatchChild(); - - - FD_ZERO(&listen_set); - - /* Just bind to 0.0.0.0 - accept connections - from anywhere. */ - num_interfaces = 1; - - /* open an incoming socket */ - s = open_server_socket(); - if (s == -1) - return -1; - fd_listenset = s; - FD_SET(s,&listen_set); - - /* now accept incoming connections - forking a new process - for each incoming connection */ - DEBUG(2,("waiting for a connection\n")); - while (1) - { - struct sockaddr_un addr; - int in_addrlen = sizeof(addr); - fd_set lfds; - int num; - - memcpy((char *)&lfds, (char *)&listen_set, - sizeof(listen_set)); - - num = sys_select(256,&lfds,NULL, NULL); - - if (num == -1 && errno == EINTR) - continue; - - /* Find the sockets that are read-ready - - accept on these. */ - - s = -1; - if(FD_ISSET(fd_listenset,&lfds)) - { - s = fd_listenset; - } - - /* Clear this so we don't look at it again. */ - FD_CLR(s,&lfds); - - ClientMSRPC = accept(s,(struct sockaddr*)&addr,&in_addrlen); - - if (ClientMSRPC == -1 && errno == EINTR) - continue; - - if (ClientMSRPC == -1) - { - DEBUG(0,("open_sockets: accept: %s\n", - strerror(errno))); - continue; - } - - if (ClientMSRPC != -1 && fork()==0) - { - /* Child code ... */ - - /* close the listening socket(s) */ - close(fd_listenset); - - /* close our standard file - descriptors */ - close_low_fds(); - am_parent = 0; - - /* Reset global variables in util.c so - that client substitutions will be - done correctly in the process. */ - reset_globals_after_fork(); - - return ClientMSRPC; - } - /* The parent doesn't need this socket */ - close(ClientMSRPC); - - /* Force parent to check log size after - * spawning child. Fix from - * klausr@ITAP.Physik.Uni-Stuttgart.De. The - * parent daemon will log to logserver.smb. It - * writes only two messages for each child - * started/finished. But each child writes, - * say, 50 messages also in logserver.smb, - * begining with the debug_count of the - * parent, before the child opens its own log - * file logserver.client. In a worst case - * scenario the size of logserver.smb would be - * checked after about 50*50=2500 messages - * (ca. 100kb). - * */ - force_check_log_size(); - - } /* end while 1 */ - -/* NOTREACHED */ -} - - -/**************************************************************************** -this prevents zombie child processes -****************************************************************************/ -BOOL reload_after_sighup = False; - -static void sig_hup(int sig) -{ - BlockSignals(True,SIGHUP); - DEBUG(0,("Got SIGHUP\n")); - - /* - * Fix from <branko.cibej@hermes.si> here. - * We used to reload in the signal handler - this - * is a *BIG* no-no. - */ - - reload_after_sighup = True; - BlockSignals(False,SIGHUP); -} - - - -#if DUMP_CORE -/******************************************************************* -prepare to dump a core file - carefully! -********************************************************************/ -static BOOL dump_core(void) -{ - char *p; - pstring dname; - pstrcpy(dname,debugf); - if ((p=strrchr(dname,'/'))) *p=0; - pstrcat(dname,"/corefiles"); - mkdir(dname,0700); - sys_chown(dname,getuid(),getgid()); - chmod(dname,0700); - if (chdir(dname)) return(False); - umask(~(0700)); - -#ifdef HAVE_GETRLIMIT -#ifdef RLIMIT_CORE - { - struct rlimit rlp; - getrlimit(RLIMIT_CORE, &rlp); - rlp.rlim_cur = MAX(4*1024*1024,rlp.rlim_cur); - setrlimit(RLIMIT_CORE, &rlp); - getrlimit(RLIMIT_CORE, &rlp); - DEBUG(3,("Core limits now %d %d\n", - (int)rlp.rlim_cur,(int)rlp.rlim_max)); - } -#endif -#endif - - - DEBUG(0,("Dumping core in %s\n",dname)); - abort(); - return(True); -} -#endif - - -/**************************************************************************** -exit the server -****************************************************************************/ -void exit_server(char *reason) -{ - static int firsttime=1; - extern char *last_inbuf; - - - if (!firsttime) exit(0); - firsttime = 0; - - unbecome_vuser(); - DEBUG(2,("Closing connections\n")); - -#ifdef WITH_DFS - if (dcelogin_atmost_once) { - dfs_unlogin(); - } -#endif - - if (!reason) { - int oldlevel = DEBUGLEVEL; - DEBUGLEVEL = 10; - if (last_inbuf) - show_msg(last_inbuf); - DEBUGLEVEL = oldlevel; - DEBUG(0,("===============================================================\n")); -#if DUMP_CORE - if (dump_core()) return; -#endif - } - - locking_end(); - - DEBUG(3,("Server exit (%s)\n", (reason ? reason : ""))); -#ifdef MEM_MAN - { - extern FILE *dbf; - smb_mem_write_verbose(dbf); - dbgflush(); - } -#endif - exit(0); -} - - - -/**************************************************************************** - initialise connect, service and file structs -****************************************************************************/ -static void init_structs(void) -{ -#if 0 - conn_init(); -#endif - init_rpc_pipe_hnd(); /* for RPC pipes */ - if (!init_policy_hnd(MAX_SERVER_POLICY_HANDLES)) - { - exit_server("could not allocate policy handles\n"); - } -} - -/**************************************************************************** -usage on the program -****************************************************************************/ -static void usage(char *pname) -{ - DEBUG(0,("Incorrect program usage - are you sure the command line is correct?\n")); - - printf("Usage: %s [-D] [-p port] [-d debuglevel] ", pname); - printf("[-l log basename] [-s services file]\n" ); - printf("Version %s\n",VERSION); - printf("\t-D become a daemon\n"); - printf("\t-p port listen on the specified port\n"); - printf("\t-d debuglevel set the debuglevel\n"); - printf("\t-l log basename. Basename for log/debug files\n"); - printf("\t-s services file. Filename of services file\n"); - printf("\t-P passive only\n"); - printf("\t-a append to log file (default)\n"); - printf("\t-o overwrite log file, don't append\n"); - printf("\t-i scope NetBIOS scope to use (default none)\n"); - printf("\n"); -} - - -/**************************************************************************** - main program -****************************************************************************/ -int msrpc_main(int argc,char *argv[]) -{ - extern BOOL append_log; - /* shall I run as a daemon */ - BOOL is_daemon = False; - int opt; - extern char *optarg; - int ClientMSRPC = -1; - pipes_struct static_pipe; - - pstrcpy(remote_machine, pipe_name); - - charset_initialise(); - - /* make absolutely sure we run as root - to handle cases where people - are crazy enough to have it setuid */ -#ifdef HAVE_SETRESUID - setresuid(0,0,0); -#else - setuid(0); - seteuid(0); - setuid(0); - seteuid(0); -#endif - - fault_setup((void (*)(void *))exit_server); - CatchSignal(SIGTERM , SIGNAL_CAST dflt_sig); - - /* we are never interested in SIGPIPE */ - BlockSignals(True,SIGPIPE); - - /* we want total control over the permissions on created files, - so set our umask to 0 */ - umask(0); - - dos_GetWd(OriginalDir); - - init_uid(); - - /* this is for people who can't start the program correctly */ - while (argc > 1 && (*argv[1] != '-')) { - argv++; - argc--; - } - - while ( EOF != (opt = getopt(argc, argv, "i:l:s:d:Dh?Paof:")) ) - switch (opt) { - case 'i': - pstrcpy(scope,optarg); - break; - - case 'P': - { - extern BOOL passive; - passive = True; - } - break; - - case 's': - pstrcpy(servicesf,optarg); - break; - - case 'l': - pstrcpy(debugf,optarg); - break; - - case 'a': - append_log = True; - break; - - case 'o': - append_log = False; - break; - - case 'D': - is_daemon = True; - break; - - case 'd': - if (*optarg == 'A') - DEBUGLEVEL = 10000; - else - DEBUGLEVEL = atoi(optarg); - break; - - case 'h': - case '?': - usage(argv[0]); - exit(0); - break; - - default: - usage(argv[0]); - exit(1); - } - - reopen_logs(); - - DEBUG(1,( "%s version %s started.\n", argv[0], VERSION)); - DEBUGADD(1,( "Copyright Andrew Tridgell 1992-1999\n")); - - DEBUG(2,("uid=%d gid=%d euid=%d egid=%d\n", - (int)getuid(),(int)getgid(),(int)geteuid(),(int)getegid())); - - if (sizeof(uint16) < 2 || sizeof(uint32) < 4) { - DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n")); - exit(1); - } - - get_myname(myhostname,NULL); - - if (!reload_services(False)) - return(-1); - - init_structs(); - -#ifdef WITH_PROFILE - if (!profile_setup(False)) { - DEBUG(0,("ERROR: failed to setup profiling\n")); - return -1; - } -#endif - - /* - * Set the machine NETBIOS name if not already - * set from the config file. - */ - if (!*global_myname) - { - fstrcpy(global_myname, dns_to_netbios_name(myhostname)); - } - strupper(global_myname); - - codepage_initialise(lp_client_code_page()); - - CatchSignal(SIGHUP,SIGNAL_CAST sig_hup); - - /* Setup the signals that allow the debug log level - to by dynamically changed. */ - - /* If we are using the malloc debug code we can't use - SIGUSR1 and SIGUSR2 to do debug level changes. */ - -#ifndef MEM_MAN -#if defined(SIGUSR1) - CatchSignal( SIGUSR1, SIGNAL_CAST sig_usr1 ); -#endif /* SIGUSR1 */ - -#if defined(SIGUSR2) - CatchSignal( SIGUSR2, SIGNAL_CAST sig_usr2 ); -#endif /* SIGUSR2 */ -#endif /* MEM_MAN */ - - DEBUG(3,( "loaded services\n")); - - if (!is_daemon && !is_a_socket(0)) { - DEBUG(0,("standard input is not a socket, assuming -D option\n")); - is_daemon = True; - } - - if (is_daemon) { - DEBUG( 3, ( "Becoming a daemon.\n" ) ); - become_daemon(); - } - - if (!directory_exist(lp_lockdir(), NULL)) { - mkdir(lp_lockdir(), 0755); - } - - if (is_daemon) { - pidfile_create(pipe_name); - } - - ClientMSRPC = open_sockets(is_daemon); - if (ClientMSRPC == -1) - { - exit_server("open socket failed"); - } - - if (!locking_init(0)) - exit(1); - - /* possibly reload the services file. */ - reload_services(True); - - if (*lp_rootdir()) { - if (sys_chroot(lp_rootdir()) == 0) - DEBUG(2,("Changed root to %s\n", lp_rootdir())); - } - - msrpc_service_init(); - - ZERO_STRUCT(static_pipe); - fstrcpy(static_pipe.name, pipe_name); - if (msrpcd_init(ClientMSRPC, &static_pipe)) - { - reload_services(True); - msrpcd_process(ClientMSRPC, &static_pipe); - } - if (ClientMSRPC != -1) - { - close(ClientMSRPC); - } - - exit_server("normal exit"); - return(0); -} diff --git a/source3/msrpc/msrpcd_process.c b/source3/msrpc/msrpcd_process.c deleted file mode 100644 index 35a28d105a..0000000000 --- a/source3/msrpc/msrpcd_process.c +++ /dev/null @@ -1,515 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - process incoming packets - main loop - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -extern int DEBUGLEVEL; - -time_t smb_last_time=(time_t)0; - -char *InBuffer = NULL; -char *OutBuffer = NULL; -char *last_inbuf = NULL; - -/* - * Size of data we can send to client. Set - * by the client for all protocols above CORE. - * Set by us for CORE protocol. - */ -int max_send = BUFFER_SIZE; -/* - * Size of the data we can receive. Set by us. - * Can be modified by the max xmit parameter. - */ -int max_recv = BUFFER_SIZE; - -extern int last_message; -extern pstring sesssetup_user; -extern char *last_inbuf; -extern char *InBuffer; -extern char *OutBuffer; -extern int smb_read_error; -extern BOOL reload_after_sighup; -extern int max_send; - - -/**************************************************************************** - Do a select on an two fd's - with timeout. - - If a local udp message has been pushed onto the - queue (this can only happen during oplock break - processing) return this first. - - If a pending smb message has been pushed onto the - queue (this can only happen during oplock break - processing) return this next. - - If the first smbfd is ready then read an smb from it. - if the second (loopback UDP) fd is ready then read a message - from it and setup the buffer header to identify the length - and from address. - Returns False on timeout or error. - Else returns True. - -The timeout is in milli seconds -****************************************************************************/ - -static BOOL receive_message_or_msrpc(int c, char *buffer, int buffer_len, - int timeout, BOOL *got_smb) -{ - fd_set fds; - int selrtn; - struct timeval to; - int maxfd; - - smb_read_error = 0; - - *got_smb = False; - - /* - * Check to see if we already have a message on the smb queue. - * If so - copy and return it. - */ - - /* - * Setup the select read fd set. - */ - - FD_ZERO(&fds); - FD_SET(c,&fds); - maxfd = 0; - - to.tv_sec = timeout / 1000; - to.tv_usec = (timeout % 1000) * 1000; - - selrtn = sys_select(MAX(maxfd,c)+1,&fds,NULL, timeout>0?&to:NULL); - - /* Check if error */ - if(selrtn == -1) { - /* something is wrong. Maybe the socket is dead? */ - smb_read_error = READ_ERROR; - return False; - } - - /* Did we timeout ? */ - if (selrtn == 0) { - smb_read_error = READ_TIMEOUT; - return False; - } - - if (FD_ISSET(c,&fds)) - { - *got_smb = True; - return receive_smb(c, buffer, 0); - } - return False; -} - - -/* -These flags determine some of the permissions required to do an operation - -Note that I don't set NEED_WRITE on some write operations because they -are used by some brain-dead clients when printing, and I don't want to -force write permissions on print services. -*/ -#define AS_USER (1<<0) -#define NEED_WRITE (1<<1) -#define TIME_INIT (1<<2) -#define CAN_IPC (1<<3) -#define AS_GUEST (1<<5) -#define QUEUE_IN_OPLOCK (1<<6) - -/* - define a list of possible SMB messages and their corresponding - functions. Any message that has a NULL function is unimplemented - - please feel free to contribute implementations! -*/ - -/**************************************************************************** -do a switch on the message type, and return the response size -****************************************************************************/ -static int do_message(pipes_struct *p, - char *inbuf,char *outbuf,int size,int bufsize) -{ - static int pid= -1; - - prs_struct pd; - int outsize = -1; - - /* make a static data parsing structure from the api_fd_reply data */ - prs_init(&pd, 0, 4, 0, True); - mem_create(pd.data, smb_base(inbuf), 0, smb_len(inbuf), 0, False); - - if (pid == -1) - pid = getpid(); - - /* dce/rpc command */ - if (rpc_to_smb(p, smb_base(inbuf), smb_len(inbuf))) - { - char *copy_into = smb_base(outbuf); - outsize = mem_buf_len(p->rsmb_pdu.data); - if (!mem_buf_copy(copy_into, p->rsmb_pdu.data, 0, outsize)) - { - return -1; - } - mem_free_data(p->rsmb_pdu.data); - } - - return outsize; -} - - -/**************************************************************************** - construct a reply to the incoming packet -****************************************************************************/ -static int construct_reply(pipes_struct *p, - char *inbuf,char *outbuf,int size,int bufsize) -{ - int outsize = 0; - smb_last_time = time(NULL); - - outsize = do_message(p, inbuf,outbuf,size,bufsize) + 4; - - if(outsize > 4) - _smb_setlen(outbuf,outsize - 4); - return(outsize); -} - - -/**************************************************************************** - process an smb from the client - split out from the process() code so - it can be used by the oplock break code. -****************************************************************************/ -static void process_msrpc(pipes_struct *p, int c, char *inbuf, char *outbuf) -{ - static int trans_num; - int32 len = smb_len(inbuf); - int nread = len + 4; - - if (trans_num == 0) { - /* on the first packet, check the global hosts allow/ hosts - deny parameters before doing any parsing of the packet - passed to us by the client. This prevents attacks on our - parsing code from hosts not in the hosts allow list */ - if (!check_access(c, lp_hostsallow(-1), lp_hostsdeny(-1))) { - /* send a negative session response "not listining on calling - name" */ - DEBUG( 1, ( "Connection denied from %s\n", - client_addr(c) ) ); - exit_server("connection denied"); - } - } - - DEBUG( 6, ( "got message of len 0x%x\n", len ) ); - DEBUG( 3, ( "Transaction %d of length %d\n", trans_num, nread ) ); - - dump_data(10, inbuf, len); - -#ifdef WITH_VTP - if(trans_num == 1 && VT_Check(inbuf)) - { - VT_Process(); - return; - } -#endif - - nread = construct_reply(p, inbuf,outbuf,nread,max_send); - - if(nread > 0) - { - dump_data(10, outbuf, nread); - - if (nread != smb_len(outbuf) + 4) - { - DEBUG(0,("ERROR: Invalid message response size! %d %d\n", - nread, smb_len(outbuf))); - } - else - send_smb(c,outbuf); - } - trans_num++; -} - -/**************************************************************************** - reads user credentials from the socket -****************************************************************************/ -BOOL get_user_creds(int c, struct user_creds *usr) -{ - pstring buf; - int rl; - uint32 len; - BOOL new_con = False; - uint32 status; - - CREDS_CMD cmd; - prs_struct ps; - - ZERO_STRUCTP(usr); - ZERO_STRUCT(cmd); - cmd.cred = usr; - - DEBUG(10,("get_user_creds: first request\n")); - - rl = read(c, &buf, sizeof(len)); - - if (rl != sizeof(len)) - { - DEBUG(0,("Unable to read length\n")); - dump_data(0, buf, sizeof(len)); - return False; - } - - len = IVAL(buf, 0); - - if (len > sizeof(buf)) - { - DEBUG(0,("length %d too long\n", len)); - return False; - } - - rl = read(c, buf, len); - - if (rl < 0) - { - DEBUG(0,("Unable to read from connection\n")); - return False; - } - -#ifdef DEBUG_PASSWORD - dump_data(100, buf, rl); -#endif - - /* make a static data parsing structure from the api_fd_reply data */ - prs_init(&ps, 0, 4, 0, True); - mem_create(ps.data, buf, 0, len, 0, False); - - if (!creds_io_cmd("creds", &cmd, &ps, 0)) - { - DEBUG(0,("Unable to parse credentials\n")); - mem_free_data(ps.data); - return False; - } - - mem_free_data(ps.data); - - if (ps.offset != rl) - { - DEBUG(0,("Buffer size %d %d!\n", ps.offset, rl)); - return False; - } - - switch (cmd.command) - { - case AGENT_CMD_CON: - case AGENT_CMD_CON_ANON: - { - new_con = True; - break; - } - case AGENT_CMD_CON_REUSE: - { - new_con = True; - break; - } - default: - { - DEBUG(0,("unknown command %d\n", cmd.command)); - return False; - } - } - - status = new_con ? 0x0 : 0x1; - - if (write(c, &status, sizeof(status)) != - sizeof(status)) - { - return False; - } - - return new_con; -} - -/**************************************************************************** - initialise from pipe -****************************************************************************/ -BOOL msrpcd_init(int c, pipes_struct *p) -{ - struct user_creds usr; - gid_t *groups = NULL; - char *user; - - if (!get_user_creds(c, &usr)) - { - DEBUG(0,("authentication failed\n")); - free_user_creds(&usr); - return False; - } - - if (usr.uxs.num_grps != 0) - { - int i; - groups = malloc(usr.uxs.num_grps * sizeof(groups[0])); - if (groups == NULL) - { - return False; - } - for (i = 0; i < usr.uxs.num_grps; i++) - { - groups[i] = (gid_t)usr.uxs.grps[i]; - } - } - - p->vuid = create_vuid(usr.uxs.uid, usr.uxs.gid, - usr.uxs.num_grps, groups, - usr.uxc.user_name, - usr.uxc.requested_name, - usr.uxc.real_name, - usr.uxc.guest, - usr.ntc.pwd.sess_key); - - if (p->vuid == UID_FIELD_INVALID) - { - return False; - } - - free_user_creds(&usr); - - if (!become_vuser(p->vuid)) - { - return False; - } - - p->l = malloc(sizeof(*p->l)); - if (p->l == NULL) - { - return False; - } - - ZERO_STRUCTP(p->l); - - user = usr.uxc.user_name; - if (!strequal(user,lp_guestaccount(-1)) && - lp_servicenumber(user) < 0) - { - int homes = lp_servicenumber(HOMES_NAME); - char *home = get_unixhome_dir(user); - if (homes >= 0 && home) - { - pstring home_dir; - fstrcpy(home_dir, home); - lp_add_home(user,homes,home_dir); - } - } - return True; -} - -/**************************************************************************** - process commands from the client -****************************************************************************/ -void msrpcd_process(int c, pipes_struct *p) -{ - InBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN); - OutBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN); - if ((InBuffer == NULL) || (OutBuffer == NULL)) - return; - - InBuffer += SMB_ALIGNMENT; - OutBuffer += SMB_ALIGNMENT; - - max_recv = MIN(lp_maxxmit(),BUFFER_SIZE); - - /* re-initialise the timezone */ - TimeInit(); - - while (True) - { - int counter; - int service_load_counter = 0; - BOOL got_smb = False; - - errno = 0; - - for (counter=SMBD_SELECT_LOOP; - !receive_message_or_msrpc(c, InBuffer,BUFFER_SIZE, - SMBD_SELECT_LOOP*1000,&got_smb); - counter += SMBD_SELECT_LOOP) - { - time_t t; - - if (counter > 365 * 3600) /* big number of seconds. */ - { - counter = 0; - service_load_counter = 0; - } - - if (smb_read_error == READ_EOF) - { - DEBUG(3,("end of file from client\n")); - return; - } - - if (smb_read_error == READ_ERROR) - { - DEBUG(3,("receive_smb error (%s) exiting\n", - strerror(errno))); - return; - } - - t = time(NULL); - - /* check for smb.conf reload */ - if (counter >= service_load_counter + SMBD_RELOAD_CHECK) - { - service_load_counter = counter; - - /* reload services, if files have changed. */ - reload_services(True); - } - - /* - * If reload_after_sighup == True then we got a SIGHUP - * and are being asked to reload. Fix from <branko.cibej@hermes.si> - */ - - if (reload_after_sighup) - { - DEBUG(0,("Reloading services after SIGHUP\n")); - reload_services(False); - reload_after_sighup = False; - /* - * Use this as an excuse to print some stats. - */ - } - - /* automatic timeout if all connections are closed */ - if (counter >= IDLE_CLOSED_TIMEOUT) - { - DEBUG( 2, ( "Closing idle connection\n" ) ); - return; - } - - } - - if(got_smb) - process_msrpc(p, c, InBuffer, OutBuffer); - } -} diff --git a/source3/netlogond/netlogond.c b/source3/netlogond/netlogond.c deleted file mode 100644 index fb0ace784d..0000000000 --- a/source3/netlogond/netlogond.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Main SMB server routines - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -fstring pipe_name; - -pstring servicesf = CONFIGFILE; -extern pstring debugf; -extern BOOL append_log; -extern int DEBUGLEVEL; - -/************************************************************************* - initialise an msrpc service - *************************************************************************/ -void msrpc_service_init(void) -{ - if (!pwdb_initialise(True)) - { - exit(-1); - } - - if(!initialise_sam_password_db()) - { - exit(-1); - } - - if(!initialise_passgrp_db()) - { - exit(-1); - } - - if(!initialise_group_db()) - { - exit(-1); - } - - if(!initialise_alias_db()) - { - exit(-1); - } - - if(!initialise_builtin_db()) - { - exit(-1); - } - - if (!get_member_domain_sid()) - { - DEBUG(0,("ERROR: Samba cannot obtain PDC SID from PDC(s) %s.\n", - lp_passwordserver())); - exit(-1); - } -} - -/**************************************************************************** - reload the services file - **************************************************************************/ -BOOL reload_services(BOOL test) -{ - BOOL ret; - - if (lp_loaded()) { - pstring fname; - pstrcpy(fname,lp_configfile()); - if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) { - pstrcpy(servicesf,fname); - test = False; - } - } - - reopen_logs(); - - if (test && !lp_file_list_changed()) - return(True); - - lp_killunused(NULL); - - ret = lp_load(servicesf,False,False,True); - - /* perhaps the config filename is now set */ - if (!test) - reload_services(True); - - reopen_logs(); - - load_interfaces(); - - return(ret); -} - -/**************************************************************************** - main program -****************************************************************************/ - int main(int argc,char *argv[]) -{ -#ifdef HAVE_SET_AUTH_PARAMETERS - set_auth_parameters(argc,argv); -#endif - -#ifdef HAVE_SETLUID - /* needed for SecureWare on SCO */ - setluid(0); -#endif - - append_log = True; - - TimeInit(); - - setup_logging(argv[0],False); - fstrcpy(pipe_name, "NETLOGON"); - slprintf(debugf, sizeof(debugf), "%s/log.%s", LOGFILEBASE, pipe_name); - add_msrpc_command_processor( pipe_name, argv[0], api_netlog_rpc ); - - return msrpc_main(argc, argv); -} diff --git a/source3/passdb/mysqlpass.c b/source3/passdb/mysqlpass.c deleted file mode 100644 index 75be8b638b..0000000000 --- a/source3/passdb/mysqlpass.c +++ /dev/null @@ -1,673 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * Samba MYSQL SAM Database, by Benjamin Kuit. - * Copyright (C) Benjamin Kuit 1999, - * Copyright (C) Andrew Tridgell 1992-1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1998, - * - * 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. - */ - -#if defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM) - -#include "includes.h" - -extern int DEBUGLEVEL; - -#define UNIX_NAME(row) ((*row)[0]) -#define UNIX_UID(row) ((*row)[1]) -#define NT_NAME(row) ((*row)[2]) -#define RID(row) ((*row)[3]) -#define LM_HASH(row) ((*row)[4]) -#define NT_HASH(row) ((*row)[5]) -#define FLAGS(row) ((*row)[6]) -#define CHANGE_TIME(row) ((*row)[7]) - -static fstring mysql_table = { 0 }; - -struct mysql_struct { - MYSQL handle; - MYSQL_RES *result; - uint current_row; -}; -typedef struct mysql_struct mysql_ctrl; - -static char *mysql_retrieve_password(char *passfile) -{ - static fstring pass; - static time_t last_checked = (time_t)0; - static char pass_chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_-+=|~`\\{}[]:;\"'?/>.<,"; - fstring temppass; - FILE *filep; - int length; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( passfile == NULL ) { - pass[0]=0; - return pass; - } - - if ( time(NULL) - last_checked <= 60 ) { - return pass; - } - - if ( file_modtime(passfile) < last_checked ) { - return pass; - } - - filep = sys_fopen(passfile,"r"); - - if ( filep == NULL ) { - return pass; - } - - memset(temppass,0,sizeof(temppass)); - - if ( fgets( temppass, sizeof(temppass)-1, filep) == NULL ) { - fclose(filep); - return pass; - } - - fclose(filep); - - length = strspn( temppass, pass_chars ); - temppass[length<sizeof(temppass)-1?length:sizeof(temppass)-1] = '\0'; - - fstrcpy( pass, temppass ); - - last_checked = time(NULL); - - return pass; -} - -static int mysql_db_connect( MYSQL *handle ) -{ - char *password; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - password = mysql_retrieve_password(lp_mysql_passfile()); - - if ( !mysql_connect(handle, lp_mysql_host(), lp_mysql_user(), password) ) { - DEBUG(0,("mysql_connect: %s\n",mysql_error(handle))); - return -1; - } - - if ( mysql_select_db( handle, lp_mysql_db()) ) { - DEBUG(0,("mysql_connect: %s\n",mysql_error(handle))); - mysql_close(handle); - return -1; - } - - fstrcpy(mysql_table,lp_mysql_table()); - - return 0; -} - -static int mysql_lock_table( MYSQL *handle, BOOL write_access ) -{ - fstring query; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - slprintf( query, sizeof(query), "lock tables %s %s", mysql_table, write_access==True?"write":"read"); - - if ( mysql_query( handle, query ) ) { - DEBUG(0,("Cannot get lock: %s: %s\n",query,mysql_error(handle) )); - return -1; - } - - return 0; -} - -int mysql_db_lock_connect( MYSQL *handle ) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( mysql_db_connect( handle ) ) { - return -1; - } - - if ( mysql_lock_table( handle, True ) ) { - mysql_close( handle ); - return -1; - } - - return 0; -} - -static MYSQL_RES *mysql_select_results( MYSQL *handle, char *selection ) -{ - MYSQL_RES *result; - pstring query; - int query_length; - char select[] = "select "; - char where[] = " where "; - char from[] = " from "; - char mysql_query_string[] = "unix_name, unix_uid, nt_name, user_rid, smb_passwd, smb_nt_passwd, acct_ctrl, pass_last_set_time"; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - query_length = sizeof( select ) + sizeof( mysql_query_string ) + sizeof(from ) + strlen( mysql_table ); - - if ( selection != NULL && *selection != '\0' ) { - query_length += sizeof( where ) + strlen( selection ); - } - - if ( query_length >= sizeof( query ) ) { - DEBUG(0,("Query string too long\n")); - return NULL; - } - - pstrcpy( query, select); - pstrcat( query, mysql_query_string ); - pstrcat( query, from ); - pstrcat( query, mysql_table ); - - if ( selection != NULL && *selection != '\0' ) { - pstrcat( query, where ); - pstrcat( query, selection ); - } - - DEBUG(5,("mysql> %s\n",query)); - if ( mysql_query( handle, query ) ) { - DEBUG(0,("%s: %s\n", query, mysql_error(handle) )); - return NULL; - } - - result = mysql_store_result( handle ); - - if ( mysql_num_fields( result ) != 8 ) { - DEBUG(0,("mysql_num_result = %d (!=8)\n",mysql_num_fields( result ))); - return NULL; - } - - if ( result == NULL ) { - DEBUG(0,("mysql_store_result: %s\n",mysql_error(handle))); - return NULL; - } - - return result; -} - -void *mysql_startpwent( BOOL update ) -{ - mysql_ctrl *mysql; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - mysql = (mysql_ctrl *)malloc( sizeof(mysql_ctrl) ); - if ( mysql == NULL ) { - DEBUG(0,("malloc: Out of memory\n")); - return NULL; - } - - memset( mysql, 0, sizeof(mysql_ctrl) ); - - if ( mysql_db_connect( &mysql->handle ) ) { - return NULL; - } - - if ( mysql_lock_table( &mysql->handle, update ) ) { - mysql_close( &mysql->handle ); - return NULL; - } - - mysql->result = mysql_select_results( &mysql->handle, NULL ); - - if ( mysql->result == NULL ) { - mysql_close( &mysql->handle ); - return NULL; - } - - mysql->current_row = 0; - - return (void*)mysql; -} - -void mysql_endpwent( void *ptr ) -{ - mysql_ctrl *handle; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - handle = (mysql_ctrl *)ptr; - - mysql_free_result( handle->result ); - - mysql_close( &handle->handle ); - - free( handle ); -} - -SMB_BIG_UINT mysql_getpwpos(void *vp) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return ((mysql_ctrl *)vp)->current_row; -} - -BOOL mysql_setpwpos(void *vp, SMB_BIG_UINT pos) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - mysql_data_seek( ((mysql_ctrl*)vp)->result, (uint)pos ); - ((mysql_ctrl *)vp)->current_row=(uint)pos; - - return True; -} - -static void quote_hash( char *target, unsigned char *passwd ) -{ - char hex[] = "0123456789ABCDEF"; - int i; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( passwd == NULL ) { - fstrcpy(target,"NULL"); - } - else { - target[0]='\''; - for (i=0;i<32;i++) { - target[i+1] = hex[(passwd[i>>1]>>(((~i)&1)<<2))&15]; - } - target[33] = '\''; - target[34] = '\0'; - } -} - -static unsigned char *decode_hash( char *hash, unsigned char *buffer ) -{ - char hex[] = "0123456789ABCDEF"; - int pos, v1, v2; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( hash == NULL ) { - return NULL; - } - - for (pos=0;pos<16;pos++) { - for( v1 = 0; v1 < sizeof(hex) && hash[0] != hex[v1]; v1++ ); - for( v2 = 0; v2 < sizeof(hex) && hash[1] != hex[v2]; v2++ ); - - if ( v1 == sizeof(hex) || v2 == sizeof(hex) ) { - return NULL; - } - - buffer[pos] = (v1<<4)|v2; - hash += 2; - } - - return buffer; -} - -void *mysql_fill_smb_passwd( MYSQL_ROW *row ) -{ - static struct smb_passwd pw_buf; - static fstring unix_name; - static fstring nt_name; - static unsigned char smbpwd[16]; - static unsigned char smbntpwd[16]; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - pwdb_init_smb(&pw_buf); - - fstrcpy( unix_name, UNIX_NAME(row) ); - pw_buf.unix_name = unix_name; - pw_buf.unix_uid = get_number( UNIX_UID(row) ); - - if ( NT_NAME(row) != NULL ) { - fstrcpy( nt_name, NT_NAME(row) ); - pw_buf.nt_name = nt_name; - } - - if ( RID(row) != NULL ) { - pw_buf.user_rid = get_number( RID(row) ); - } - - pw_buf.smb_passwd = decode_hash( LM_HASH(row), smbpwd ); - if ( !pw_buf.smb_passwd ) { - DEBUG(4, ("entry invalidated for unix user %s\n", unix_name )); - return NULL; - } - - pw_buf.smb_nt_passwd = decode_hash( NT_HASH(row), smbntpwd ); - - if ( FLAGS(row) != NULL ) { - pw_buf.acct_ctrl = get_number( FLAGS(row) ); - } - - if ( pw_buf.acct_ctrl == 0 ) { - pw_buf.acct_ctrl = ACB_NORMAL; - } - - pw_buf.pass_last_set_time = get_number( CHANGE_TIME(row) ); - - return (void*)&pw_buf; -} - -MYSQL_ROW *mysql_getpwent(void *vp) -{ - mysql_ctrl *mysql; - static MYSQL_ROW row; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - mysql = (mysql_ctrl*)vp; - row = mysql_fetch_row( mysql->result ); - - if ( row == NULL ) { - return NULL; - } - - mysql->current_row++; - - return &row; -} - -struct smb_passwd *mysql_getsmbpwent(void *vp) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return (struct smb_passwd*)mysql_fill_smb_passwd( mysql_getpwent(vp) ); -} - -void *mysql_fetch_passwd( void *(*filler)(MYSQL_ROW*), char *where ) -{ - void *retval; - MYSQL handle; - MYSQL_RES *result; - MYSQL_ROW row; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( filler == NULL ) { - return NULL; - } - - if ( where == NULL || *where == '\0' ) { - DEBUG(0,("Null or empty query\n")); - return NULL; - } - - if ( mysql_db_connect( &handle ) ) { - return NULL; - } - - result = mysql_select_results( &handle, where ); - if ( result == NULL ) { - mysql_close( &handle ); - return NULL; - } - - row = mysql_fetch_row ( result ); - if ( row == NULL ) { - mysql_free_result( result ); - mysql_close( &handle ); - return NULL; - } - - if ( DEBUGLEVEL >= 7 ) { - int field; - for (field=0; field< mysql_num_fields( result ); field++ ) { - DEBUG(7,(" row[%d] = \"%s\"\n",field,row[field]?row[field]:"NULL")); - } - } - - retval = (*filler)( &row ); - - mysql_free_result( result ); - mysql_close( &handle ); - - return retval; -} - -void *mysql_getpwuid(void *(*filler)(MYSQL_ROW *), uid_t uid) -{ - fstring where; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - slprintf( where, sizeof(where), "unix_uid=%lu", uid); - - return mysql_fetch_passwd(filler,where); -} - -struct smb_passwd *mysql_getsmbpwuid(uid_t uid) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return (struct smb_passwd *)mysql_getpwuid( mysql_fill_smb_passwd, uid ); -} - -void *mysql_getpwnam(void *(*filler)(MYSQL_ROW *), char *field, const char *name) -{ - fstring where; - char format[] = "%s='%s'"; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( filler == NULL ) { - DEBUG(0,("Empty fill opteration\n")); - return NULL; - } - - if ( field == NULL || *field == '\0' ) { - DEBUG(0,("Empty or NULL field name\n")); - return NULL; - } - - if ( name == NULL || *name == '\0' ) { - DEBUG(0,("Empty or NULL query\n")); - return NULL; - } - - if ( sizeof(format) + strlen(name) + strlen(field) > sizeof(where) ) { - DEBUG(0,("Query string too long\n")); - return NULL; - } - - slprintf(where, sizeof( where ), format, field, name ); - - return mysql_fetch_passwd( filler, where ); -} - -struct smb_passwd *mysql_getsmbpwnam(const char *unix_name) -{ - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return mysql_getpwnam( mysql_fill_smb_passwd, "unix_name", unix_name ); -} - -static void quote_string(char *target, char *string) -{ - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( string == NULL ) { - fstrcpy( target, "NULL" ); - } - else { - target[0] = '\''; - safe_strcpy(&target[1],string,sizeof(fstring)-2); - safe_strcpy(&target[strlen(target)],"'",2); - } -} - -BOOL mysql_del_smb( MYSQL *handle, char *unix_name ) -{ - pstring query; - char format[] = "delete from %s where unix_name='%s'"; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if (strlen( format ) + strlen(mysql_table) + strlen(unix_name)) { - return False; - } - - slprintf( query, sizeof(query), format, mysql_table, unix_name); - - if ( mysql_query( handle, query ) ) { - DEBUG(0,("%s: %s\n", query, mysql_error(handle) )); - return False; - } - - return True; -} - -BOOL mysql_add_smb( MYSQL *handle, struct smb_passwd *smb ) -{ - pstring query; - char format[] = "insert into %s (unix_name, unix_uid) values ( '%s', %lu )"; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( strlen(format) + strlen(mysql_table) + strlen(smb->unix_name) + 10 > sizeof(query) ) { - DEBUG(0,("Query too long\n")); - return False; - } - - slprintf( query, sizeof(query), "insert into %s (unix_name,unix_uid) values ('%s', %lu)", mysql_table, smb->unix_name, smb->unix_uid); - - if ( mysql_query( handle, query ) ) { - DEBUG(0,("%s: %s\n",query,mysql_error(handle) )); - return False; - } - - return True; -} - -BOOL mysql_mod_smb( MYSQL *handle, struct smb_passwd *smb, BOOL override ) -{ - pstring query; - fstring smb_passwd; - fstring smb_nt_passwd; - fstring nt_name; - - char format[] = "update %s set nt_name=%s, user_rid=%lu, smb_passwd=%s, smb_nt_passwd=%s, acct_ctrl=%u, pass_last_set_time=unix_timestamp() where unix_name='%s'"; - char extra[] = " and not ISNULL(smb_passwd)"; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( strlen(format) + 2*20 + 3*10 + 2*32 + strlen(mysql_table) >= sizeof( query ) + strlen( extra ) ) { - DEBUG(0,("Query string too long\n")); - return False; - } - - quote_hash(smb_passwd, smb->smb_passwd); - quote_hash(smb_nt_passwd, smb->smb_nt_passwd); - - quote_string(nt_name, smb->nt_name); - - slprintf( query, sizeof(query), format, mysql_table, nt_name, (long unsigned)smb->user_rid, smb_passwd, smb_nt_passwd, smb->acct_ctrl, smb->unix_name); - - if ( override != True ) { - pstrcat( query, extra ); - } - - if ( mysql_query( handle, query ) ) { - DEBUG(0,("%s: %s\n",query,mysql_error(handle) )); - return False; - } - - if ( mysql_affected_rows( handle ) < 1 ) { - DEBUG(3,("No entries changed\n")); - return False; - } - - return True; -} - -BOOL mysql_add_smbpwd_entry(struct smb_passwd *smb) -{ - MYSQL handle; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( smb == NULL ) { - return False; - } - - if ( mysql_db_lock_connect( &handle ) ) { - return False; - } - - if ( !mysql_add_smb( &handle, smb ) ) { - mysql_close( &handle ); - return False; - } - - if ( !mysql_mod_smb( &handle, smb, True ) ) { - mysql_del_smb( &handle, smb->unix_name ); - mysql_close( &handle ); - return False; - } - - mysql_close(&handle); - return True; -} - -BOOL mysql_mod_smbpwd_entry(struct smb_passwd *smb, BOOL override) -{ - MYSQL handle; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - if ( smb == NULL ) { - return False; - } - - if ( mysql_db_lock_connect( &handle ) ) { - return False; - } - - if ( !mysql_mod_smb( &handle, smb, override ) ) { - mysql_close(&handle); - return False; - } - - mysql_close(&handle); - return True; -} - -static struct smb_passdb_ops mysql_ops = { - mysql_startpwent, - mysql_endpwent, - mysql_getpwpos, - mysql_setpwpos, - mysql_getsmbpwnam, - mysql_getsmbpwuid, - mysql_getsmbpwent, - mysql_add_smbpwd_entry, - mysql_mod_smbpwd_entry -}; - -struct smb_passdb_ops *mysql_initialise_password_db(void) -{ - (void*)mysql_retrieve_password(NULL); - return &mysql_ops; -} - -#else - void mysql_dummy_smb_function(void) { } -#endif diff --git a/source3/passdb/mysqlsampass.c b/source3/passdb/mysqlsampass.c deleted file mode 100644 index 4615591bfb..0000000000 --- a/source3/passdb/mysqlsampass.c +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * Samba MYSQL SAM Database, by Benjamin Kuit. - * Copyright (C) Benjamin Kuit 1999, - * Copyright (C) Andrew Tridgell 1992-1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1998, - * - * 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. - */ - -#if defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM) - -#include "includes.h" - -MYSQL_ROW *mysql_getpwent(void *vp); - -extern int DEBUGLEVEL; - -extern pstring samlogon_user; -extern BOOL sam_logon_in_ssb; - -void *mysql_fill_sam_passwd( MYSQL_ROW *row ) -{ - static struct sam_passwd *user; - - static pstring full_name; - static pstring home_dir; - static pstring home_drive; - static pstring logon_script; - static pstring profile_path; - static pstring acct_desc; - static pstring workstations; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - user = pwdb_smb_to_sam((struct smb_passwd *)mysql_fill_smb_passwd(row)); - - if ( user == NULL ) { - return NULL; - } - - /* 'Researched' from sampass.c =) */ - - pstrcpy(samlogon_user, user->unix_name); - - if (samlogon_user[strlen(samlogon_user)-1] == '$' && - user->group_rid != DOMAIN_GROUP_RID_USERS) - { - DEBUG(0,("trust account %s should be in DOMAIN_GROUP_RID_USERS\n", samlogon_user)); - } - - /* XXXX hack to get standard_sub_basic() to use sam logon username */ - /* possibly a better way would be to do a become_user() call */ - sam_logon_in_ssb = True; - - pstrcpy(full_name , ""); - pstrcpy(logon_script , lp_logon_script ()); - pstrcpy(profile_path , lp_logon_path ()); - pstrcpy(home_drive , lp_logon_drive ()); - pstrcpy(home_dir , lp_logon_home ()); - pstrcpy(acct_desc , ""); - pstrcpy(workstations , ""); - - sam_logon_in_ssb = False; - - user->full_name = full_name; - user->home_dir = home_dir; - user->dir_drive = home_drive; - user->logon_script = logon_script; - user->profile_path = profile_path; - user->acct_desc = acct_desc; - user->workstations = workstations; - - user->unknown_str = NULL; /* don't know, yet! */ - user->munged_dial = NULL; /* "munged" dial-back telephone number */ - - user->unknown_3 = 0xffffff; /* don't know */ - user->logon_divs = 168; /* hours per week */ - user->hours_len = 21; /* 21 times 8 bits = 168 */ - memset(user->hours, 0xff, user->hours_len); /* available at all hours */ - user->unknown_5 = 0x00020000; /* don't know */ - user->unknown_6 = 0x000004ec; /* don't know */ - - return (void*)user; -} - -struct sam_passwd *mysql_getsampwent(void *vp) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return (struct sam_passwd*)mysql_fill_sam_passwd( mysql_getpwent(vp) ); -} - -struct sam_passwd *mysql_getsampwrid(uint32 rid) -{ - fstring where; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - slprintf( where, sizeof(where), "user_rid=%lu", (long unsigned)rid); - - return (struct sam_passwd *)mysql_fetch_passwd( mysql_fill_sam_passwd, where ); -} - -struct sam_passwd *mysql_getsampwuid(uid_t uid) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return (struct sam_passwd *)mysql_getpwuid( mysql_fill_sam_passwd, uid ); -} - -struct sam_passwd *mysql_getsampwntnam(const char *nt_name) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return (struct sam_passwd *)mysql_getpwnam( mysql_fill_sam_passwd, "nt_name", nt_name); -} - -struct sam_disp_info *mysql_getsamdispntnam(const char *nt_name) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return pwdb_sam_to_dispinfo(mysql_getsampwntnam(nt_name)); -} - -struct sam_disp_info *mysql_getsamdisprid(uint32 rid) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return pwdb_sam_to_dispinfo(mysql_getsampwrid(rid)); -} - -struct sam_disp_info *mysql_getsamdispent(void *vp) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return pwdb_sam_to_dispinfo(mysql_getsampwent(vp)); -} - -static BOOL mysql_mod_sam( MYSQL *handle, struct sam_passwd *sam, BOOL override ) -{ - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - return True; -} - -BOOL mysql_add_sampwd_entry(struct sam_passwd *sam) -{ - MYSQL handle; - struct smb_passwd *smb; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - smb = pwdb_sam_to_smb( sam ); - - if ( smb == NULL ) { - return False; - } - - if ( mysql_db_lock_connect( &handle ) ) { - return False; - } - - if ( !mysql_add_smb( &handle, smb ) ) { - mysql_close(&handle); - return False; - } - - if ( !mysql_mod_smb( &handle, smb, True ) ) { - mysql_del_smb( &handle, smb->unix_name ); - mysql_close(&handle); - return False; - } - - if ( !mysql_mod_sam( &handle, sam, True ) ) { - mysql_del_smb( &handle, smb->unix_name ); - mysql_close(&handle); - return False; - } - - mysql_close(&handle); - return True; -} - -BOOL mysql_mod_sampwd_entry(struct sam_passwd *sam, BOOL override) -{ - MYSQL handle; - struct smb_passwd *smb; - - DEBUG(5,("%s\n",FUNCTION_MACRO)); - - smb = pwdb_sam_to_smb(sam); - - if ( smb == NULL ) { - return False; - } - - if ( mysql_db_lock_connect( &handle ) ) { - return False; - } - - if ( !mysql_mod_smb( &handle, smb, override ) ) { - mysql_close(&handle); - return False; - } - - if ( !mysql_mod_sam( &handle, sam, override ) ) { - mysql_close(&handle); - return False; - } - - mysql_close(&handle); - return True; -} - -static struct sam_passdb_ops sam_mysql_ops = -{ - mysql_startpwent, - mysql_endpwent, - mysql_getpwpos, - mysql_setpwpos, - mysql_getsampwntnam, - mysql_getsampwuid, - mysql_getsampwrid, - mysql_getsampwent, - mysql_add_sampwd_entry, - mysql_mod_sampwd_entry, - mysql_getsamdispntnam, - mysql_getsamdisprid, - mysql_getsamdispent -}; - -struct sam_passdb_ops *mysql_initialise_sam_password_db(void) -{ - return &sam_mysql_ops; -} - -#else - void mysql_dummy_sam_function(void) { } -#endif diff --git a/source3/passdb/passgrpldap.c b/source3/passdb/passgrpldap.c deleted file mode 100644 index 1092a3c5b1..0000000000 --- a/source3/passdb/passgrpldap.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2.0. - LDAP passgrp database for SAMBA - Copyright (C) Matthew Chapman 1998 - - 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" - -#ifdef WITH_LDAP - -#include <lber.h> -#include <ldap.h> - -extern int DEBUGLEVEL; - -/* Internal state */ -extern LDAP *ldap_struct; -extern LDAPMessage *ldap_results; -extern LDAPMessage *ldap_entry; - - -/*************************************************************** - Enumerate RIDs of groups which user is a member of, of type - given by attribute. - ****************************************************************/ - -static void ldappassgrp_member(char *attribute, uint32 **rids, int *numrids) -{ - char **values; - uint32 *ridlist; - int i; - - if((values = ldap_get_values(ldap_struct, ldap_entry, attribute))) { - *numrids = i = ldap_count_values(values); - *rids = ridlist = malloc(i * sizeof(uint32)); - do { - ridlist[--i] = atoi(values[i]); - } while(i > 0); - ldap_value_free(values); - } else { - *numrids = 0; - *rids = NULL; - } -} - - -/*************************************************************** - Begin/end smbgrp enumeration. - ****************************************************************/ - -static void *ldappassgrp_enumfirst(BOOL update) -{ - if (!ldap_connect()) - return NULL; - - ldap_search_for("&(objectclass=sambaAccount)(|(group=*)(alias=*))"); - - return ldap_struct; -} - -static void ldappassgrp_enumclose(void *vp) -{ - ldap_disconnect(); -} - - -/************************************************************************* - Save/restore the current position in a query - *************************************************************************/ - -static SMB_BIG_UINT ldappassgrp_getdbpos(void *vp) -{ - return (SMB_BIG_UINT)((ulong)ldap_entry); -} - -static BOOL ldappassgrp_setdbpos(void *vp, SMB_BIG_UINT tok) -{ - ldap_entry = (LDAPMessage *)((ulong)tok); - return (True); -} - - -/************************************************************************* - Return limited smb_passwd information, and group membership. - *************************************************************************/ - -static struct smb_passwd *ldappassgrp_getpwbynam(const char *name, - uint32 **grp_rids, int *num_grps, - uint32 **als_rids, int *num_alss) -{ - struct smb_passwd *ret; - - if(!ldap_connect()) - return NULL; - - ldap_search_by_ntname(name); - ldappassgrp_member("group", grp_rids, num_grps); - ldappassgrp_member("alias", als_rids, num_alss); - ret = ldap_getpw(); - - ldap_disconnect(); - return ret; -} - -static struct smb_passwd *ldappassgrp_getpwbyuid(uid_t userid, - uint32 **grp_rids, int *num_grps, - uint32 **als_rids, int *num_alss) -{ - struct smb_passwd *ret; - - if(!ldap_connect()) - return NULL; - - ldap_search_by_uid(userid); - ldappassgrp_member("group", grp_rids, num_grps); - ldappassgrp_member("alias", als_rids, num_alss); - ret = ldap_getpw(); - - ldap_disconnect(); - return ret; -} - -static struct smb_passwd *ldappassgrp_getpwbyrid(uint32 user_rid, - uint32 **grp_rids, int *num_grps, - uint32 **als_rids, int *num_alss) -{ - struct smb_passwd *ret; - - if(!ldap_connect()) - return NULL; - - ldap_search_by_rid(user_rid); - ldappassgrp_member("group", grp_rids, num_grps); - ldappassgrp_member("alias", als_rids, num_alss); - ret = ldap_getpw(); - - ldap_disconnect(); - return ret; -} - -static struct smb_passwd *ldappassgrp_getcurrentpw(void *vp, - uint32 **grp_rids, int *num_grps, - uint32 **als_rids, int *num_alss) -{ - ldappassgrp_member("group", grp_rids, num_grps); - ldappassgrp_member("alias", als_rids, num_alss); - return ldap_getpw(); -} - - - -static struct passgrp_ops ldappassgrp_ops = -{ - ldappassgrp_enumfirst, - ldappassgrp_enumclose, - ldappassgrp_getdbpos, - ldappassgrp_setdbpos, - - ldappassgrp_getpwbynam, - ldappassgrp_getpwbyuid, - ldappassgrp_getpwbyrid, - ldappassgrp_getcurrentpw, -}; - -struct passgrp_ops *ldap_initialise_password_grp(void) -{ - return &ldappassgrp_ops; -} - -#else - void passgrpldap_dummy_function(void); - void passgrpldap_dummy_function(void) { } /* stop some compilers complaining */ -#endif - diff --git a/source3/passdb/sampass.c b/source3/passdb/sampass.c deleted file mode 100644 index b9be8a7bae..0000000000 --- a/source3/passdb/sampass.c +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup - * Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995. - * - * 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" - -#ifdef USE_SMBPASS_DB - -extern int DEBUGLEVEL; -extern pstring samlogon_user; -extern BOOL sam_logon_in_ssb; - -extern DOM_SID global_sam_sid; - -/*************************************************************** - Start to enumerate the smbpasswd list. Returns a void pointer - to ensure no modification outside this module. -****************************************************************/ - -static void *startsamfilepwent(BOOL update) -{ - return startsmbpwent(update); -} - -/*************************************************************** - End enumeration of the smbpasswd list. -****************************************************************/ - -static void endsamfilepwent(void *vp) -{ - endsmbpwent(vp); -} - -/************************************************************************* - Return the current position in the smbpasswd list as an SMB_BIG_UINT. - This must be treated as an opaque token. -*************************************************************************/ - -static SMB_BIG_UINT getsamfilepwpos(void *vp) -{ - return getsmbpwpos(vp); -} - -/************************************************************************* - Set the current position in the smbpasswd list from an SMB_BIG_UINT. - This must be treated as an opaque token. -*************************************************************************/ - -static BOOL setsamfilepwpos(void *vp, SMB_BIG_UINT tok) -{ - return setsmbpwpos(vp, tok); -} - -/************************************************************************* - Routine to return the next entry in the smbpasswd list. - this function is a nice, messy combination of reading: - - the smbpasswd file - - the unix password database - - smb.conf options (not done at present). - *************************************************************************/ - -static struct sam_passwd *getsamfile21pwent(void *vp) -{ - struct sam_passwd *user; - - static pstring full_name; - static pstring home_dir; - static pstring home_drive; - static pstring logon_script; - static pstring profile_path; - static pstring acct_desc; - static pstring workstations; - - DEBUG(5,("getsamfile21pwent\n")); - - user = pwdb_smb_to_sam(getsmbfilepwent(vp)); - if (user == NULL) - { - return NULL; - } - - /* - * get all the other gubbins we need. substitute unix name for %U - * as putting the nt name in is a bit meaningless. - */ - - pstrcpy(samlogon_user, user->unix_name); - - if (samlogon_user[strlen(samlogon_user)-1] == '$' && - user->group_rid != DOMAIN_GROUP_RID_USERS) - { - DEBUG(0,("trust account %s should be in DOMAIN_GROUP_RID_USERS\n", - samlogon_user)); - } - - /* XXXX hack to get standard_sub_basic() to use sam logon username */ - /* possibly a better way would be to do a become_user() call */ - sam_logon_in_ssb = True; - - pstrcpy(full_name , ""); - pstrcpy(logon_script , lp_logon_script ()); - pstrcpy(profile_path , lp_logon_path ()); - pstrcpy(home_drive , lp_logon_drive ()); - pstrcpy(home_dir , lp_logon_home ()); - pstrcpy(acct_desc , ""); - pstrcpy(workstations , ""); - - sam_logon_in_ssb = False; - - /* - only overwrite values with defaults IIF specific backend - didn't filled the values - */ - - if (user->full_name == NULL) - user->full_name = full_name; - if (user->home_dir == NULL) - user->home_dir = home_dir; - if (user->dir_drive == NULL) - user->dir_drive = home_drive; - if (user->logon_script == NULL) - user->logon_script = logon_script; - if (user->profile_path == NULL) - user->profile_path = profile_path; - if (user->acct_desc == NULL) - user->acct_desc = acct_desc; - if (user->workstations == NULL) - user->workstations = workstations; - - user->unknown_str = NULL; /* don't know, yet! */ - user->munged_dial = NULL; /* "munged" dial-back telephone number */ - - user->unknown_3 = 0xffffff; /* don't know */ - user->logon_divs = 168; /* hours per week */ - user->hours_len = 21; /* 21 times 8 bits = 168 */ - memset(user->hours, 0xff, user->hours_len); /* available at all hours */ - user->unknown_5 = 0x00020000; /* don't know */ - user->unknown_6 = 0x000004ec; /* don't know */ - - return user; -} - -/************************************************************************ -search sam db by uid. -*************************************************************************/ -static struct sam_passwd *getsamfilepwuid(uid_t uid) -{ - struct sam_passwd *pwd = NULL; - void *fp = NULL; - - DEBUG(10, ("search by uid: %x\n", (int)uid)); - - /* Open the smb password file - not for update. */ - fp = startsam21pwent(False); - - if (fp == NULL) - { - DEBUG(0, ("unable to open sam password database.\n")); - return NULL; - } - - while ((pwd = getsamfile21pwent(fp)) != NULL && pwd->unix_uid != uid) - { - } - - if (pwd != NULL) - { - DEBUG(10, ("found by unix_uid: %x\n", (int)uid)); - } - - endsam21pwent(fp); - - return pwd; -} - -/************************************************************************ -search sam db by rid. -*************************************************************************/ -static struct sam_passwd *getsamfilepwrid(uint32 user_rid) -{ - DOM_NAME_MAP gmep; - DOM_SID sid; - sid_copy(&sid, &global_sam_sid); - sid_append_rid(&sid, user_rid); - - if (!lookupsmbpwsid(&sid, &gmep)) - { - return NULL; - } - - return getsamfilepwuid((uid_t)gmep.unix_id); -} - -/************************************************************************ -search sam db by nt name. -*************************************************************************/ -static struct sam_passwd *getsamfilepwntnam(const char *nt_name) -{ - DOM_NAME_MAP gmep; - - if (!lookupsmbpwntnam(nt_name, &gmep)) - { - return NULL; - } - - return getsamfilepwuid((uid_t)gmep.unix_id); -} - -/* - * Stub functions - implemented in terms of others. - */ - -static BOOL mod_samfile21pwd_entry(struct sam_passwd* pwd, BOOL override) -{ - return mod_smbpwd_entry(pwdb_sam_to_smb(pwd), override); -} - -static BOOL add_samfile21pwd_entry(struct sam_passwd *newpwd) -{ - return add_smbpwd_entry(pwdb_sam_to_smb(newpwd)); -} - -static struct sam_disp_info *getsamfiledispntnam(const char *ntname) -{ - return pwdb_sam_to_dispinfo(getsam21pwntnam(ntname)); -} - -static struct sam_disp_info *getsamfiledisprid(uint32 rid) -{ - return pwdb_sam_to_dispinfo(getsam21pwrid(rid)); -} - -static struct sam_disp_info *getsamfiledispent(void *vp) -{ - return pwdb_sam_to_dispinfo(getsam21pwent(vp)); -} - -static struct sam_passdb_ops sam_file_ops = -{ - startsamfilepwent, - endsamfilepwent, - getsamfilepwpos, - setsamfilepwpos, - getsamfilepwntnam, - getsamfilepwuid, - getsamfilepwrid, - getsamfile21pwent, - add_samfile21pwd_entry, - mod_samfile21pwd_entry, - getsamfiledispntnam, - getsamfiledisprid, - getsamfiledispent -}; - -struct sam_passdb_ops *file_initialise_sam_password_db(void) -{ - return &sam_file_ops; -} - -#else - /* Do *NOT* make this function static. It breaks the compile on gcc. JRA */ - void sampass_dummy_function(void) { } /* stop some compilers complaining */ -#endif /* USE_SMBPASS_DB */ diff --git a/source3/passdb/sampassdb.c b/source3/passdb/sampassdb.c deleted file mode 100644 index bca5bfa45f..0000000000 --- a/source3/passdb/sampassdb.c +++ /dev/null @@ -1,793 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Password and authentication handling - Copyright (C) Jeremy Allison 1996-1998 - Copyright (C) Luke Kenneth Casson Leighton 1996-1998 - - 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 "nterr.h" - -extern int DEBUGLEVEL; -extern DOM_SID global_sam_sid; - -/* - * NOTE. All these functions are abstracted into a structure - * that points to the correct function for the selected database. JRA. - * - * NOTE. for the get/mod/add functions, there are two sets of functions. - * one supports struct sam_passwd, the other supports struct smb_passwd. - * for speed optimisation it is best to support both these sets. - * - * it is, however, optional to support one set but not the other: there - * is conversion-capability built in to passdb.c, and run-time error - * detection for when neither are supported. - * - * password database writers are recommended to implement the sam_passwd - * functions in a first pass, as struct sam_passwd contains more - * information, needed by the NT Domain support. - * - * an API writer is expected to create either one set (struct smb_passwd) or - * the other (struct sam_passwd) OR both, and optionally also to write display - * info routines * (struct sam_disp_info). functions which the API writer - * chooses NOT to write must be wrapped in conversion functions (pwdb_x_to_y) - * such that API users can call any function and still get valid results. - * - * the password API does NOT fill in the gaps if you set an API function - * to NULL: it will deliberately attempt to call the NULL function. - * - */ - -static struct sam_passdb_ops *pwdb_ops; - -/*************************************************************** - Initialise the password db operations. -***************************************************************/ - -BOOL initialise_sam_password_db(void) -{ - if (pwdb_ops) - { - return True; - } - -#ifdef WITH_NISPLUS - pwdb_ops = nisplus_initialise_sam_password_db(); -#elif defined(WITH_LDAP) - pwdb_ops = ldap_initialise_sam_password_db(); -#elif defined(HAVE_MYSQL_H) && defined(WITH_MYSQLSAM) - pwdb_ops = mysql_initialise_sam_password_db(); -#elif defined(USE_SMBPASS_DB) - pwdb_ops = file_initialise_sam_password_db(); -#endif - - return (pwdb_ops != NULL); -} - -/* - * Functions that return/manipulate a struct sam_passwd. - */ - -/*************************************************************** - Start to enumerate the smb or sam passwd list. Returns a void pointer - to ensure no modification outside this module. - - Note that currently it is being assumed that a pointer returned - from this function may be used to enumerate struct sam_passwd - entries as well as struct smb_passwd entries. This may need - to change. JRA. - -****************************************************************/ - -void *startsam21pwent(BOOL update) -{ - return pwdb_ops->startsam21pwent(update); -} - -/*************************************************************** - End enumeration of the sam passwd list. - - Note that currently it is being assumed that a pointer returned - from this function may be used to enumerate struct sam_passwd - entries as well as struct smb_passwd entries. This may need - to change. JRA. - -****************************************************************/ - -void endsam21pwent(void *vp) -{ - pwdb_ops->endsam21pwent(vp); -} - -/************************************************************************* - Routine to return the next entry in the smb passwd list. - *************************************************************************/ - -struct sam_passwd *getsam21pwent(void *vp) -{ - return pwdb_sam_map_names(pwdb_ops->getsam21pwent(vp)); -} - -/************************************************************************ - Routine to search the smb passwd file for an entry matching the username. - and then modify its password entry. We can't use the startsampwent()/ - getsampwent()/endsampwent() interfaces here as we depend on looking - in the actual file to decide how much room we have to write data. - override = False, normal - override = True, override XXXXXXXX'd out password or NO PASS -************************************************************************/ - -BOOL mod_sam21pwd_entry(struct sam_passwd* pwd, BOOL override) -{ - struct sam_passwd *mapped; - - DEBUG(10,("mod_sam21pwd_entry: unix user %s rid %d\n", - pwd->unix_name, pwd->user_rid)); - - mapped = pwdb_sam_map_names(pwd); - if (mapped != NULL) - { - return pwdb_ops->mod_sam21pwd_entry(mapped, override); - } - return False; -} - -/************************************************************************ - Utility function to search sam passwd by name. use this if your database - does not have search facilities. -*************************************************************************/ - -struct sam_passwd *iterate_getsam21pwntnam(const char *ntname) -{ - fstring nt_name; - struct sam_passwd *pwd = NULL; - void *fp = NULL; - - DEBUG(10, ("search by name: %s\n", ntname)); - - fstrcpy(nt_name, ntname); - - /* Open the smb password database - not for update. */ - fp = startsmbpwent(False); - - if (fp == NULL) - { - DEBUG(0, ("unable to open sam password database.\n")); - return NULL; - } - - while ((pwd = getsam21pwent(fp)) != NULL && !strequal(pwd->nt_name, nt_name)) - { - DEBUG(10, ("iterate: %s 0x%x\n", pwd->nt_name, pwd->user_rid)); - } - - if (pwd != NULL) - { - DEBUG(10, ("found by name: %s\n", nt_name)); - } - - endsmbpwent(fp); - return pwd; -} - -/************************************************************************ - Utility function to search sam passwd by rid. use this if your database - does not have search facilities. - - search capability by both rid and uid are needed as the rid <-> uid - mapping may be non-monotonic. - -*************************************************************************/ - -struct sam_passwd *iterate_getsam21pwrid(uint32 rid) -{ - struct sam_passwd *pwd = NULL; - void *fp = NULL; - - DEBUG(10, ("search by rid: %x\n", rid)); - - /* Open the smb password file - not for update. */ - fp = startsmbpwent(False); - - if (fp == NULL) - { - DEBUG(0, ("unable to open sam password database.\n")); - return NULL; - } - - while ((pwd = getsam21pwent(fp)) != NULL && pwd->user_rid != rid) - { - DEBUG(10, ("iterate: %s 0x%x\n", pwd->nt_name, pwd->user_rid)); - } - - if (pwd != NULL) - { - DEBUG(10, ("found by user_rid: %x\n", rid)); - } - - endsmbpwent(fp); - return pwd; -} - -/************************************************************************ - Utility function to search sam passwd by uid. use this if your database - does not have search facilities. - - search capability by both rid and uid are needed as the rid <-> uid - mapping may be non-monotonic. - -*************************************************************************/ - -struct sam_passwd *iterate_getsam21pwuid(uid_t uid) -{ - struct sam_passwd *pwd = NULL; - void *fp = NULL; - - DEBUG(10, ("search by uid: %x\n", (int)uid)); - - /* Open the smb password file - not for update. */ - fp = startsmbpwent(False); - - if (fp == NULL) - { - DEBUG(0, ("unable to open sam password database.\n")); - return NULL; - } - - while ((pwd = getsam21pwent(fp)) != NULL && pwd->unix_uid != uid) - { - } - - if (pwd != NULL) - { - DEBUG(10, ("found by unix_uid: %x\n", (int)uid)); - } - - endsmbpwent(fp); - return pwd; -} - -/************************************************************************* - Routine to return a display info structure, by rid - *************************************************************************/ -struct sam_disp_info *getsamdisprid(uint32 rid) -{ - return pwdb_ops->getsamdisprid(rid); -} - -/************************************************************************ - Routine to search sam passwd by name. -*************************************************************************/ - -struct sam_passwd *getsam21pwntnam(const char *name) -{ - return pwdb_sam_map_names(pwdb_ops->getsam21pwntnam(name)); -} - -/************************************************************************ - Routine to search sam passwd by rid. -*************************************************************************/ - -struct sam_passwd *getsam21pwrid(uint32 rid) -{ - return pwdb_sam_map_names(pwdb_ops->getsam21pwrid(rid)); -} - - -/********************************************************** - ********************************************************** - - utility routines which are likely to be useful to all password - databases - - ********************************************************** - **********************************************************/ - -/************************************************************* - initialises a struct sam_disp_info. - **************************************************************/ - -static void pwdb_init_dispinfo(struct sam_disp_info *user) -{ - if (user == NULL) return; - bzero(user, sizeof(*user)); - user->user_rid = 0xffffffff; -} - -/************************************************************* - initialises a struct sam_passwd. - **************************************************************/ -void pwdb_init_sam(struct sam_passwd *user) -{ - if (user == NULL) return; - bzero(user, sizeof(*user)); - - init_nt_time(&user->logon_time); - init_nt_time(&user->logoff_time); - init_nt_time(&user->kickoff_time); - init_nt_time(&user->pass_last_set_time); - init_nt_time(&user->pass_can_change_time); - init_nt_time(&user->pass_must_change_time); - - user->unix_uid = (uid_t)-1; - user->unix_gid = (gid_t)-1; - user->user_rid = 0xffffffff; - user->group_rid = 0xffffffff; -} - -/************************************************************************* - Routine to return the next entry in the sam passwd list. - *************************************************************************/ - -struct sam_disp_info *pwdb_sam_to_dispinfo(struct sam_passwd *user) -{ - static struct sam_disp_info disp_info; - - if (user == NULL) return NULL; - - pwdb_init_dispinfo(&disp_info); - - disp_info.nt_name = user->nt_name; - disp_info.full_name = user->full_name; - disp_info.user_rid = user->user_rid; - - return &disp_info; -} - -static void select_name(fstring *string, char **name, const UNISTR2 *from) -{ - if (from->buffer != 0) - { - unistr2_to_ascii(*string, from, sizeof(*string)); - *name = *string; - } -} - -/************************************************************* - copies a sam passwd. - **************************************************************/ -void copy_id23_to_sam_passwd(struct sam_passwd *to, const SAM_USER_INFO_23 *from) -{ - static fstring nt_name; - static fstring full_name; - static fstring home_dir; - static fstring dir_drive; - static fstring logon_script; - static fstring profile_path; - static fstring acct_desc; - static fstring workstations; - static fstring unknown_str; - static fstring munged_dial; - - if (from == NULL || to == NULL) return; - - to->logon_time = from->logon_time; - to->logoff_time = from->logoff_time; - to->kickoff_time = from->kickoff_time; - to->pass_last_set_time = from->pass_last_set_time; - to->pass_can_change_time = from->pass_can_change_time; - to->pass_must_change_time = from->pass_must_change_time; - - select_name(&nt_name , &to->nt_name , &from->uni_user_name ); - select_name(&full_name , &to->full_name , &from->uni_full_name ); - select_name(&home_dir , &to->home_dir , &from->uni_home_dir ); - select_name(&dir_drive , &to->dir_drive , &from->uni_dir_drive ); - select_name(&logon_script, &to->logon_script, &from->uni_logon_script); - select_name(&profile_path, &to->profile_path, &from->uni_profile_path); - select_name(&acct_desc , &to->acct_desc , &from->uni_acct_desc ); - select_name(&workstations, &to->workstations, &from->uni_workstations); - select_name(&unknown_str , &to->unknown_str , &from->uni_unknown_str ); - select_name(&munged_dial , &to->munged_dial , &from->uni_munged_dial ); - - to->unix_uid = (uid_t)-1; - to->unix_gid = (gid_t)-1; - to->user_rid = from->user_rid; - to->group_rid = from->group_rid; - - to->smb_passwd = NULL; - to->smb_nt_passwd = NULL; - - to->acct_ctrl = from->acb_info; - to->unknown_3 = from->unknown_3; - - to->logon_divs = from->logon_divs; - to->hours_len = from->logon_hrs.len; - memcpy(to->hours, from->logon_hrs.hours, MAX_HOURS_LEN); - - to->unknown_5 = from->unknown_5; - to->unknown_6 = from->unknown_6; -} - - -/************************************************************* - copies a sam passwd. - **************************************************************/ -void copy_sam_passwd(struct sam_passwd *to, const struct sam_passwd *from) -{ - static fstring nt_name; - static fstring unix_name; - static fstring full_name; - static fstring home_dir; - static fstring dir_drive; - static fstring logon_script; - static fstring profile_path; - static fstring acct_desc; - static fstring workstations; - static fstring unknown_str; - static fstring munged_dial; - - if (from == NULL || to == NULL) return; - - memcpy(to, from, sizeof(*from)); - - if (from->nt_name != NULL) - { - fstrcpy(nt_name , from->nt_name); - to->nt_name = nt_name; - } - else if (to->nt_name != NULL) - { - fstrcpy(nt_name , to->nt_name); - to->nt_name = nt_name; - } - - if (from->unix_name != NULL) - { - fstrcpy(unix_name, from->unix_name); - to->unix_name = unix_name; - } - else if (to->unix_name != NULL) - { - fstrcpy(unix_name, to->unix_name); - to->unix_name = unix_name; - } - - if (from->full_name != NULL) - { - fstrcpy(full_name, from->full_name); - to->full_name = full_name; - } - else if (to->full_name != NULL) - { - fstrcpy(full_name, to->full_name); - to->full_name = full_name; - } - - if (from->home_dir != NULL) - { - fstrcpy(home_dir , from->home_dir); - to->home_dir = home_dir; - } - else if (to->home_dir != NULL) - { - fstrcpy(home_dir , to->home_dir); - to->home_dir = home_dir; - } - - if (from->dir_drive != NULL) - { - fstrcpy(dir_drive , from->dir_drive); - to->dir_drive = dir_drive; - } - else if (to->dir_drive != NULL) - { - fstrcpy(dir_drive , to->dir_drive); - to->dir_drive = dir_drive; - } - - if (from->logon_script != NULL) - { - fstrcpy(logon_script , from->logon_script); - to->logon_script = logon_script; - } - else if (to->logon_script != NULL) - { - fstrcpy(logon_script , to->logon_script); - to->logon_script = logon_script; - } - - if (from->profile_path != NULL) - { - fstrcpy(profile_path , from->profile_path); - to->profile_path = profile_path; - } - else if (to->profile_path != NULL) - { - fstrcpy(profile_path , to->profile_path); - to->profile_path = profile_path; - } - - if (from->acct_desc != NULL) - { - fstrcpy(acct_desc , from->acct_desc); - to->acct_desc = acct_desc; - } - else if (to->acct_desc != NULL) - { - fstrcpy(acct_desc , to->acct_desc); - to->acct_desc = acct_desc; - } - - if (from->workstations != NULL) - { - fstrcpy(workstations , from->workstations); - to->workstations = workstations; - } - else if (to->workstations != NULL) - { - fstrcpy(workstations , to->workstations); - to->workstations = workstations; - } - - if (from->unknown_str != NULL) - { - fstrcpy(unknown_str , from->unknown_str); - to->unknown_str = unknown_str; - } - else if (to->unknown_str != NULL) - { - fstrcpy(unknown_str , to->unknown_str); - to->unknown_str = unknown_str; - } - - if (from->munged_dial != NULL) - { - fstrcpy(munged_dial , from->munged_dial); - to->munged_dial = munged_dial; - } - else if (to->munged_dial != NULL) - { - fstrcpy(munged_dial , to->munged_dial); - to->munged_dial = munged_dial; - } -} - - -/************************************************************* - converts a sam_passwd structure to a smb_passwd structure. - **************************************************************/ -struct smb_passwd *pwdb_sam_to_smb(struct sam_passwd *user) -{ - static struct smb_passwd pw_buf; - static fstring nt_name; - static fstring unix_name; - - if (user == NULL) return NULL; - - pwdb_init_smb(&pw_buf); - - if (user->nt_name != NULL) - { - fstrcpy(nt_name , user->nt_name); - pw_buf.nt_name = nt_name; - } - if (user->unix_name != NULL) - { - fstrcpy(unix_name, user->unix_name); - pw_buf.unix_name = unix_name; - } - pw_buf.unix_uid = user->unix_uid; - pw_buf.user_rid = user->user_rid; - pw_buf.smb_passwd = user->smb_passwd; - pw_buf.smb_nt_passwd = user->smb_nt_passwd; - pw_buf.acct_ctrl = user->acct_ctrl; - pw_buf.pass_last_set_time = nt_time_to_unix(&user->pass_last_set_time); - - return &pw_buf; -} - - -/************************************************************* - converts a smb_passwd structure to a sam_passwd structure. - **************************************************************/ - -struct sam_passwd *pwdb_smb_to_sam(struct smb_passwd *user) -{ - static struct sam_passwd pw_buf; - struct passwd *pass=NULL; - static fstring nt_name; - static fstring unix_name; - static pstring unix_gecos; - - if (user == NULL) return NULL; - - pwdb_init_sam(&pw_buf); - - if (user->nt_name != NULL) - { - fstrcpy(nt_name , user->nt_name); - pw_buf.nt_name = nt_name; - } - if (user->unix_name != NULL) - { - fstrcpy(unix_name, user->unix_name); - pw_buf.unix_name = unix_name; - } - pw_buf.unix_uid = user->unix_uid; - pw_buf.user_rid = user->user_rid; - pw_buf.smb_passwd = user->smb_passwd; - pw_buf.smb_nt_passwd = user->smb_nt_passwd; - pw_buf.acct_ctrl = user->acct_ctrl; - - pass = hashed_getpwnam(unix_name); - if (pass != NULL) - { - pstrcpy(unix_gecos, pass->pw_gecos); - pw_buf.full_name=unix_gecos; - } - - if ( user->pass_last_set_time != (time_t)-1 ) - { - unix_to_nt_time(&pw_buf.pass_last_set_time, user->pass_last_set_time); - unix_to_nt_time(&pw_buf.pass_can_change_time, user->pass_last_set_time); - } - - return &pw_buf; -} - -static BOOL trust_account_warning_done = False; - -/************************************************************* - fills in missing details. one set of details _must_ exist. - **************************************************************/ -struct sam_passwd *pwdb_sam_map_names(struct sam_passwd *sam) -{ - DOM_NAME_MAP gmep; - BOOL found = False; - DOM_SID sid; - static fstring unix_name; - static fstring nt_name; - - /* - * name details - */ - - if (sam == NULL) - { - DEBUG(10,("pwdb_sam_map_names: NULL\n")); - return NULL; - } - - DEBUG(10,("pwdb_sam_map_names: unix %s nt %s unix %d nt%d\n", - sam->unix_name != NULL ? sam->unix_name : "NULL", - sam->nt_name != NULL ? sam->nt_name : "NULL", - sam->unix_uid, sam->user_rid)); - - if (!found && sam->unix_name != NULL) - { - found = lookupsmbpwnam(sam->unix_name, &gmep); - } - if (!found && sam->unix_uid != (uid_t)-1) - { - found = lookupsmbpwuid(sam->unix_uid , &gmep); - } - if (!found && sam->user_rid != 0xffffffff) - { - sid_copy(&sid, &global_sam_sid); - sid_append_rid(&sid, sam->user_rid); - found = lookupsmbpwsid (&sid , &gmep); - } - if (!found && sam->nt_name != NULL) - { - found = lookupsmbpwntnam(sam->nt_name, &gmep); - } - - if (!found) - { - return NULL; - } - - if (!sid_front_equal(&global_sam_sid, &gmep.sid)) - { - return NULL; - } - - fstrcpy(unix_name, gmep.unix_name); - fstrcpy(nt_name , gmep.nt_name ); - if (sam->unix_name == NULL ) sam->unix_name = unix_name; - if (sam->nt_name == NULL ) sam->nt_name = nt_name ; - if (sam->unix_uid == (uid_t)-1 ) sam->unix_uid = (uid_t)gmep.unix_id; - if (sam->user_rid == 0xffffffff) sid_split_rid(&gmep.sid, &sam->user_rid); - - DEBUG(10,("pwdb_sam_map_name: found unix user %s nt %s uid %d rid 0x%x\n", - sam->unix_name, sam->nt_name, sam->unix_uid, sam->user_rid)); - - /* - * group details - */ - - found = False; - - if (sam->unix_gid != (gid_t)-1 && sam->group_rid != 0xffffffff) - { - return sam; - } - - if (sam->unix_gid == (gid_t)-1 && sam->group_rid == 0xffffffff) - { - struct passwd *pass = hashed_getpwnam(unix_name); - if (pass != NULL) - { - sam->unix_gid = pass->pw_gid; - } - else - { - DEBUG(0,("pwdb_sam_map_names: no unix password entry for %s\n", - unix_name)); - } - } - - if (!found && sam->unix_gid != (gid_t)-1) - { - found = lookupsmbgrpgid(sam->unix_gid , &gmep); - } - if (!found && sam->group_rid != 0xffffffff) - { - sid_copy(&sid, &global_sam_sid); - sid_append_rid(&sid, sam->group_rid); - found = lookupsmbgrpsid(&sid , &gmep); - } - - if (!found) - { - if (IS_BITS_SET_SOME(sam->acct_ctrl, ACB_WSTRUST|ACB_DOMTRUST|ACB_SVRTRUST)) - { - if (!trust_account_warning_done) - { - trust_account_warning_done = True; - DEBUG(0, ("\ -pwdb_sam_map_names: your unix password database appears to have difficulties\n\ -resolving trust account %s, probably because it ends in a '$'.\n\ -you will get this warning only once (for all trust accounts)\n", unix_name)); - } - /* - * oh, dear. - */ - if (sam->unix_gid != (gid_t)-1) - { - sam->unix_gid = (gid_t)-1; - } - sam->group_rid = DOMAIN_GROUP_RID_USERS; - - return sam; - } - else - { - DEBUG(0, ("pwdb_sam_map_names: could not find Primary Group for %s\n", - unix_name)); - return NULL; - } - } - - if (!sid_front_equal(&global_sam_sid, &gmep.sid)) - { - fstring sid_str; - sid_to_string(sid_str, &gmep.sid); - DEBUG(0,("UNIX User %s Primary Group is in the wrong domain! %s\n", - sam->unix_name, sid_str)); - return NULL; - } - - if (sam->unix_gid == (gid_t)-1 ) sam->unix_gid = (gid_t)gmep.unix_id; - if (sam->group_rid == 0xffffffff) sid_split_rid(&gmep.sid, &sam->group_rid); - - DEBUG(10,("pwdb_sam_map_name: found gid %d and group rid 0x%x for unix user %s\n", - sam->unix_gid, sam->group_rid, sam->unix_name)); - - return sam; -} diff --git a/source3/passdb/sampassldap.c b/source3/passdb/sampassldap.c deleted file mode 100644 index fd503c3d27..0000000000 --- a/source3/passdb/sampassldap.c +++ /dev/null @@ -1,422 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2.0. - LDAP protocol helper functions for SAMBA - Copyright (C) Matthew Chapman 1998 - - 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" - -#ifdef WITH_LDAP - -#include <lber.h> -#include <ldap.h> - -extern int DEBUGLEVEL; - -/* Internal state */ -extern LDAP *ldap_struct; -extern LDAPMessage *ldap_results; -extern LDAPMessage *ldap_entry; - - -/******************************************************************* - NT name/RID search functions. - ******************************************************************/ - -BOOL ldap_search_by_rid(uint32 rid) -{ - fstring filter; - - slprintf(filter, sizeof(filter)-1, - "(&(rid=%x)(objectclass=sambaAccount))", rid); - return ldap_search_for(filter); -} - -BOOL ldap_search_by_ntname(const char *ntname) -{ - fstring filter; - - slprintf(filter, sizeof(filter)-1, - "(&(ntuid=%s)(objectclass=sambaAccount))", ntname); - return ldap_search_for(filter); -} - - -/******************************************************************* - Store NTTIMEs as time_t's. - ******************************************************************/ - -static void ldap_save_time(LDAPMod ***modlist, int modop, char *attribute, - NTTIME *nttime) -{ - fstring tstr; - time_t t; - - t = nt_time_to_unix(nttime); - - if(t == -1) - return; - - slprintf(tstr, sizeof(tstr)-1, "%08X", t); - ldap_make_mod(modlist, modop, attribute, tstr); -} - -static void ldap_read_time(char *attribute, NTTIME *nttime) -{ - fstring timestr; - time_t t; - - if(ldap_get_attribute(attribute, timestr)) - { - t = (time_t)strtol(timestr, NULL, 16); - unix_to_nt_time(nttime, t); - } -} - - -/******************************************************************* - Contruct a sam_passwd structure. - ******************************************************************/ - -static struct sam_passwd *ldapsam_getsam() -{ - static pstring full_name; - static pstring acct_desc; - static pstring home_dir; - static pstring home_drive; - static pstring logon_script; - static pstring profile_path; - static pstring workstations; - pstring temp; - struct sam_passwd *sam21; - struct smb_passwd *smbpw; - - if(!ldap_entry) - return NULL; - - smbpw = ldap_getpw(); - sam21 = pwdb_smb_to_sam(smbpw); - - if(ldap_get_attribute("gidNumber", temp)) - sam21->unix_gid = atoi(temp); - - if(ldap_get_attribute("grouprid", temp)) - sam21->group_rid = strtol(temp, NULL, 16); - - if(ldap_get_attribute("cn", full_name)) - sam21->full_name = full_name; - - if(ldap_get_attribute("description", acct_desc)) - sam21->acct_desc = acct_desc; - - if(ldap_get_attribute("smbHome", home_dir)) - sam21->home_dir = home_dir; - - if(ldap_get_attribute("homeDrive", home_drive)) - sam21->dir_drive = home_drive; - - if(ldap_get_attribute("script", logon_script)) - sam21->logon_script = logon_script; - - if(ldap_get_attribute("profile", profile_path)) - sam21->profile_path = profile_path; - - if(ldap_get_attribute("workstations", workstations)) - sam21->workstations = workstations; - - ldap_read_time("pwdCanChange", &sam21->pass_can_change_time); - ldap_read_time("pwdMustChange", &sam21->pass_must_change_time); - ldap_read_time("logonTime", &sam21->logon_time); - ldap_read_time("logoffTime", &sam21->logoff_time); - ldap_read_time("kickoffTime", &sam21->kickoff_time); - - sam21->unknown_3 = 0xffffff; /* don't know */ - sam21->logon_divs = 168; /* hours per week */ - sam21->hours_len = 21; /* 21 times 8 bits = 168 */ - memset(sam21->hours, 0xff, sam21->hours_len); /* all hours */ - sam21->unknown_5 = 0x00020000; /* don't know */ - sam21->unknown_6 = 0x000004ec; /* don't know */ - sam21->unknown_str = NULL; - sam21->munged_dial = NULL; - - ldap_entry = ldap_next_entry(ldap_struct, ldap_entry); - return sam21; -} - - -/******************************************************************* - Contruct a sam_disp_info structure. - ******************************************************************/ - -static struct sam_disp_info *ldapsam_getdispinfo() -{ - static struct sam_disp_info dispinfo; - static pstring nt_name; - static pstring full_name; - pstring temp; - - if(!ldap_entry) - return NULL; - - if(!ldap_get_attribute("ntuid", nt_name) && - !ldap_get_attribute("uid", nt_name)) { - DEBUG(0,("Missing uid\n")); - return NULL; } - dispinfo.nt_name = nt_name; - - DEBUG(2,("Retrieving account [%s]\n",nt_name)); - - if(ldap_get_attribute("rid", temp)) - dispinfo.user_rid = strtol(temp, NULL, 16); - else { - DEBUG(0,("Missing rid\n")); - return NULL; } - - if(ldap_get_attribute("cn", full_name)) - dispinfo.full_name = full_name; - else - dispinfo.full_name = NULL; - - ldap_entry = ldap_next_entry(ldap_struct, ldap_entry); - return &dispinfo; -} - - -/************************************************************************ - Queues the necessary modifications to save a sam_passwd structure - ************************************************************************/ - -static void ldapsam_sammods(struct sam_passwd *newpwd, LDAPMod ***mods, - int operation) -{ - struct smb_passwd *smbpw; - pstring temp; - - smbpw = pwdb_sam_to_smb(newpwd); - ldap_smbpwmods(smbpw, mods, operation); - - slprintf(temp, sizeof(temp)-1, "%d", newpwd->unix_gid); - ldap_make_mod(mods, operation, "gidNumber", temp); - - slprintf(temp, sizeof(temp)-1, "%x", newpwd->group_rid); - ldap_make_mod(mods, operation, "grouprid", temp); - - ldap_make_mod(mods, operation, "cn", newpwd->full_name); - ldap_make_mod(mods, operation, "description", newpwd->acct_desc); - ldap_make_mod(mods, operation, "smbHome", newpwd->home_dir); - ldap_make_mod(mods, operation, "homeDrive", newpwd->dir_drive); - ldap_make_mod(mods, operation, "script", newpwd->logon_script); - ldap_make_mod(mods, operation, "profile", newpwd->profile_path); - ldap_make_mod(mods, operation, "workstations", newpwd->workstations); - - ldap_save_time(mods, operation, "pwdCanChange", - &newpwd->pass_can_change_time); - ldap_save_time(mods, operation, "pwdMustChange", - &newpwd->pass_must_change_time); - ldap_save_time(mods, operation, "logonTime", - &newpwd->logon_time); - ldap_save_time(mods, operation, "logoffTime", - &newpwd->logoff_time); - ldap_save_time(mods, operation, "kickoffTime", - &newpwd->kickoff_time); -} - - -/*************************************************************** - Begin/end account enumeration. - ****************************************************************/ - -static void *ldapsam_enumfirst(BOOL update) -{ - if (!ldap_connect()) - return NULL; - - ldap_search_for("objectclass=sambaAccount"); - - return ldap_struct; -} - -static void ldapsam_enumclose(void *vp) -{ - ldap_disconnect(); -} - - -/************************************************************************* - Save/restore the current position in a query - *************************************************************************/ - -static SMB_BIG_UINT ldapsam_getdbpos(void *vp) -{ - return (SMB_BIG_UINT)((ulong)ldap_entry); -} - -static BOOL ldapsam_setdbpos(void *vp, SMB_BIG_UINT tok) -{ - ldap_entry = (LDAPMessage *)((ulong)tok); - return (True); -} - - -/************************************************************************* - Return sam_passwd information. - *************************************************************************/ - -static struct sam_passwd *ldapsam_getsambynam(const char *name) -{ - struct sam_passwd *ret; - - if(!ldap_connect()) - return NULL; - - ldap_search_by_ntname(name); - ret = ldapsam_getsam(); - - ldap_disconnect(); - return ret; -} - -static struct sam_passwd *ldapsam_getsambyuid(uid_t userid) -{ - struct sam_passwd *ret; - - if(!ldap_connect()) - return NULL; - - ldap_search_by_uid(userid); - ret = ldapsam_getsam(); - - ldap_disconnect(); - return ret; -} - -static struct sam_passwd *ldapsam_getsambyrid(uint32 user_rid) -{ - struct sam_passwd *ret; - - if(!ldap_connect()) - return NULL; - - ldap_search_by_rid(user_rid); - ret = ldapsam_getsam(); - - ldap_disconnect(); - return ret; -} - -static struct sam_passwd *ldapsam_getcurrentsam(void *vp) -{ - return ldapsam_getsam(); -} - - -/************************************************************************ - Modify user information given a sam_passwd struct. - *************************************************************************/ - -static BOOL ldapsam_addsam(struct sam_passwd *newpwd) -{ - LDAPMod **mods; - - if (!newpwd || !ldap_allocaterid(&newpwd->user_rid)) - return (False); - - ldapsam_sammods(newpwd, &mods, LDAP_MOD_ADD); - return ldap_makemods("uid", newpwd->unix_name, mods, True); -} - -static BOOL ldapsam_modsam(struct sam_passwd *pwd, BOOL override) -{ - LDAPMod **mods; - - if (!pwd) - return (False); - - ldapsam_sammods(pwd, &mods, LDAP_MOD_REPLACE); - return ldap_makemods("uid", pwd->unix_name, mods, False); -} - - -/************************************************************************* - Return sam_disp_info information. - *************************************************************************/ - -static struct sam_disp_info *ldapsam_getdispbynam(const char *name) -{ - struct sam_disp_info *ret; - - if(!ldap_connect()) - return NULL; - - ldap_search_by_ntname(name); - ret = ldapsam_getdispinfo(); - - ldap_disconnect(); - return ret; -} - -static struct sam_disp_info *ldapsam_getdispbyrid(uint32 user_rid) -{ - struct sam_disp_info *ret; - - if(!ldap_connect()) - return NULL; - - ldap_search_by_rid(user_rid); - ret = ldapsam_getdispinfo(); - - ldap_disconnect(); - return ret; -} - -static struct sam_disp_info *ldapsam_getcurrentdisp(void *vp) -{ - return ldapsam_getdispinfo(); -} - - - -static struct sam_passdb_ops ldapsam_ops = -{ - ldapsam_enumfirst, - ldapsam_enumclose, - ldapsam_getdbpos, - ldapsam_setdbpos, - - ldapsam_getsambynam, - ldapsam_getsambyuid, - ldapsam_getsambyrid, - ldapsam_getcurrentsam, - ldapsam_addsam, - ldapsam_modsam, - - ldapsam_getdispbynam, - ldapsam_getdispbyrid, - ldapsam_getcurrentdisp -}; - -struct sam_passdb_ops *ldap_initialise_sam_password_db(void) -{ - return &ldapsam_ops; -} - -#else - void sampassldap_dummy_function(void); - void sampassldap_dummy_function(void) { } /* stop some compilers complaining */ -#endif diff --git a/source3/passdb/smbpassgroupunix.c b/source3/passdb/smbpassgroupunix.c deleted file mode 100644 index 66c094d962..0000000000 --- a/source3/passdb/smbpassgroupunix.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup - * Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995. - * - * 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" - -#ifdef USE_SMBUNIX_DB - -extern int DEBUGLEVEL; -extern DOM_SID global_sam_sid; - -/*************************************************************** - Start to enumerate the smbpasswd list. Returns a void pointer - to ensure no modification outside this module. -****************************************************************/ - -static void *startsmbunixgrpent(BOOL update) -{ - return startsmbpwent(False); -} - -/*************************************************************** - End enumeration of the smbpasswd list. -****************************************************************/ - -static void endsmbunixgrpent(void *vp) -{ - endsmbpwent(vp); -} - -/************************************************************************* - Return the current position in the smbpasswd list as an SMB_BIG_UINT. - This must be treated as an opaque token. -*************************************************************************/ - -static SMB_BIG_UINT getsmbunixgrppos(void *vp) -{ - return getsmbpwpos(vp); -} - -/************************************************************************* - Set the current position in the smbpasswd list from an SMB_BIG_UINT. - This must be treated as an opaque token. -*************************************************************************/ - -static BOOL setsmbunixgrppos(void *vp, SMB_BIG_UINT tok) -{ - return setsmbpwpos(vp, tok); -} - -/************************************************************************* - Routine to return the next smbpassgroup entry - *************************************************************************/ -static struct smb_passwd *getsmbunixgrpent(void *vp, - uint32 **grp_rids, int *num_grps, - uint32 **als_rids, int *num_alss) -{ - /* Static buffers we will return. */ - struct sam_passwd *pw_buf; - fstring unix_name; - int i; - int unixgrps; - gid_t *grps; - BOOL failed = False; - - if (vp == NULL) - { - DEBUG(0,("getsmbunixgrpent: Bad password file pointer.\n")); - return NULL; - } - - pw_buf = getsam21pwent(vp); - - if (pw_buf == NULL) - { - return NULL; - } - - fstrcpy(unix_name, pw_buf->unix_name); - - if (grp_rids != NULL) - { - (*grp_rids) = NULL; - (*num_grps) = 0; - } - - if (als_rids != NULL) - { - (*als_rids) = NULL; - (*num_alss) = 0; - } - - if (als_rids == NULL && grp_rids == NULL) - { - /* they didn't want to know the members. */ - return pwdb_sam_to_smb(pw_buf); - } - - /* - * find all unix groups - */ - - if (get_unixgroups(unix_name, pw_buf->unix_uid, pw_buf->unix_gid, &unixgrps, &grps)) - { - return NULL; - } - - /* - * check each unix group for a mapping as an nt alias or an nt group - */ - - for (i = 0; i < unixgrps && !failed; i++) - { - uint32 rid; - - /* - * find the unix name for each user's group. - * assume the unix group is an nt name (alias? group? user?) - * (user or not our own domain will be an error). - * - * oh, oh, can anyone spot what's missing heeere? - * you guessed it: built-in aliases. those are in - * Domain S-1-5-20, and NT Domain Users can only - * have lists of RIDs as groups. - * - * doesn't stop you making NT Domain Users a member - * of a BUILTIN Alias (e.g "Administrators" or "Power Users") - * it's just that there's no way to tell that from this - * API call: wrong domain, sorry. - * - */ - - DOM_NAME_MAP gmep; - - if (!lookupsmbgrpgid(grps[i], &gmep)) - { - continue; - } - - sid_split_rid(&gmep.sid, &rid); - if (!sid_equal(&global_sam_sid, &gmep.sid)) - { - continue; - } - - switch (gmep.type) - { - case SID_NAME_ALIAS: - { - if (als_rids != NULL && add_num_to_list(als_rids, num_alss, rid) == NULL) - { - failed = True; - } - break; - } - case SID_NAME_DOM_GRP: - case SID_NAME_WKN_GRP: - { - if (grp_rids != NULL && add_num_to_list(grp_rids, num_grps, rid) == NULL) - { - failed = True; - } - break; - } - default: - { - break; - } - } - } - - if (failed) - { - if (grp_rids != NULL && (*grp_rids) != NULL) - { - free(*grp_rids); - (*num_grps) = 0; - } - - if (als_rids != NULL && (*als_rids) != NULL) - { - free(*als_rids); - (*num_alss) = 0; - } - - return NULL; - } - - return pwdb_sam_to_smb(pw_buf); -} - -static struct passgrp_ops smbunixgrp_ops = -{ - startsmbunixgrpent, - endsmbunixgrpent, - getsmbunixgrppos, - setsmbunixgrppos, - iterate_getsmbgrpntnam, /* In passgrp.c */ - iterate_getsmbgrpuid, /* In passgrp.c */ - iterate_getsmbgrprid, /* In passgrp.c */ - getsmbunixgrpent -}; - -struct passgrp_ops *unix_initialise_password_grp(void) -{ - return &smbunixgrp_ops; -} - -#else - /* Do *NOT* make this function static. It breaks the compile on gcc. JRA */ - void smbpassgroupunix_dummy_function(void) { } /* stop some compilers complaining */ -#endif /* USE_SMBPASS_DB */ diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c deleted file mode 100644 index d58ead0f93..0000000000 --- a/source3/printing/nt_printing.c +++ /dev/null @@ -1,1412 +0,0 @@ -#include "includes.h" -#include "nterr.h" - -extern int DEBUGLEVEL; - -/**************************************************************************** -parse a form line. -****************************************************************************/ -static BOOL parse_form_entry(char *line, nt_forms_struct *buf) -{ -#define NAMETOK 0 -#define FLAGTOK 1 -#define WIDTHTOK 2 -#define LENGTHTOK 3 -#define LEFTTOK 4 -#define TOPTOK 5 -#define RIGHTTOK 6 -#define BOTTOMTOK 7 -#define MAXTOK 8 - char *tok[MAXTOK]; - int count = 0; - - tok[count] = strtok(line,":"); - - /* strip the comment lines */ - if (tok[0][0]=='#') return (False); - count++; - - while ( ((tok[count] = strtok(NULL,":")) != NULL ) && count<MAXTOK-1) - { - count++; - } - - DEBUG(6,("Found [%d] tokens\n", count)); - - StrnCpy(buf->name,tok[NAMETOK],sizeof(buf->name)-1); - buf->flag=atoi(tok[FLAGTOK]); - buf->width=atoi(tok[WIDTHTOK]); - buf->length=atoi(tok[LENGTHTOK]); - buf->left=atoi(tok[LEFTTOK]); - buf->top=atoi(tok[TOPTOK]); - buf->right=atoi(tok[RIGHTTOK]); - buf->bottom=atoi(tok[BOTTOMTOK]); - - return(True); -} - -/**************************************************************************** -get a form struct list -****************************************************************************/ -int get_ntforms(nt_forms_struct **list) -{ - FILE *f; - pstring line; - char *lp_forms = lp_nt_forms(); - int total=0; - int grandtotal=0; - *line=0; - - f = sys_fopen(lp_forms,"r"); - if (!f) - { - return(0); - } - - while ( fgets(line, sizeof(pstring), f) ) - { - DEBUG(5,("%s\n",line)); - - *list = Realloc(*list, sizeof(nt_forms_struct)*(total+1)); - if (! *list) - { - total = 0; - break; - } - bzero( (char *)&(*list)[total], sizeof(nt_forms_struct) ); - if ( parse_form_entry(line, &(*list)[total] ) ) - { - total++; - } - grandtotal++; - } - fclose(f); - - DEBUG(4,("%d info lines on %d\n",total, grandtotal)); - - return(total); -} - -/**************************************************************************** -write a form struct list -****************************************************************************/ -int write_ntforms(nt_forms_struct **list, int number) -{ - FILE *f; - pstring line; - char *file = lp_nt_forms(); - int total=0; - int i; - - *line=0; - - DEBUG(6,("write_ntforms\n")); - - if((f = sys_fopen(file, "w")) == NULL) - { - DEBUG(1, ("cannot create forms file [%s]\n", file)); - return(0); - } - - for (i=0; i<number;i++) - { - - fprintf(f,"%s:%d:%d:%d:%d:%d:%d:%d\n", (*list)[i].name, - (*list)[i].flag, (*list)[i].width, (*list)[i].length, - (*list)[i].left, (*list)[i].top, (*list)[i].right, (*list)[i].bottom); - - DEBUGADD(7,("adding entry [%s]\n", (*list)[i].name)); - } - - fclose(f); - DEBUGADD(6,("closing file\n")); - return(total); -} - -/**************************************************************************** -add a form struct at the end of the list -****************************************************************************/ -void add_a_form(nt_forms_struct **list, FORM form, int *count) -{ - int n=0; - BOOL update; - fstring form_name; - - /* - * NT tries to add forms even when - * they are already in the base - * only update the values if already present - */ - - update=False; - - unistr2_to_ascii(form_name, &(form.name), sizeof(form_name)-1); - for (n=0; n<*count && update==False; n++) - { - if (!strncmp((*list)[n].name, form_name, strlen(form_name))) - { - DEBUG(3, ("NT workaround, [%s] already exists\n", form_name)); - update=True; - } - } - - if (update==False) - { - *list=Realloc(*list, (n+1)*sizeof(nt_forms_struct)); - unistr2_to_ascii((*list)[n].name, &(form.name), sizeof((*list)[n].name)-1); - (*count)++; - } - - (*list)[n].flag=form.flags; - (*list)[n].width=form.size_x; - (*list)[n].length=form.size_y; - (*list)[n].left=form.left; - (*list)[n].top=form.top; - (*list)[n].right=form.right; - (*list)[n].bottom=form.bottom; -} - -/**************************************************************************** -update a form struct -****************************************************************************/ -void update_a_form(nt_forms_struct **list, FORM form, int count) -{ - int n=0; - fstring form_name; - unistr2_to_ascii(form_name, &(form.name), sizeof(form_name)-1); - - DEBUG(6, ("[%s]\n", form_name)); - for (n=0; n<count; n++) - { - DEBUGADD(6, ("n [%d]:[%s]\n", n, (*list)[n].name)); - if (!strncmp((*list)[n].name, form_name, strlen(form_name))) - break; - } - - if (n==count) return; - - (*list)[n].flag=form.flags; - (*list)[n].width=form.size_x; - (*list)[n].length=form.size_y; - (*list)[n].left=form.left; - (*list)[n].top=form.top; - (*list)[n].right=form.right; - (*list)[n].bottom=form.bottom; -} - -/**************************************************************************** -get the nt drivers list - -open the directory and look-up the matching names -****************************************************************************/ -int get_ntdrivers(fstring **list, char *architecture) -{ - DIR *dirp; - char *dpname; - fstring name_match; - fstring short_archi; - fstring driver_name; - int match_len; - int total=0; - - DEBUG(5,("Getting the driver list from directory: [%s]\n", lp_nt_drivers_file())); - - *list=NULL; - dirp = opendir(lp_nt_drivers_file()); - - if (dirp == NULL) - { - DEBUG(0,("Error opening driver directory [%s]\n",lp_nt_drivers_file())); - return(-1); - } - - get_short_archi(short_archi, architecture); - slprintf(name_match, sizeof(name_match)-1, "NTdriver_%s_", short_archi); - match_len=strlen(name_match); - - while ((dpname = readdirname(dirp)) != NULL) - { - if (strncmp(dpname, name_match, match_len)==0) - { - DEBUGADD(7,("Found: [%s]\n", dpname)); - - StrCpy(driver_name, dpname+match_len); - all_string_sub(driver_name, "#", "/"); - *list = Realloc(*list, sizeof(fstring)*(total+1)); - StrnCpy((*list)[total], driver_name, strlen(driver_name)); - DEBUGADD(6,("Added: [%s]\n", driver_name)); - total++; - } - } - - closedir(dirp); - return(total); -} - -/**************************************************************************** -function to do the mapping between the long architecture name and -the short one. -****************************************************************************/ -void get_short_archi(char *short_archi, char *long_archi) -{ - struct table { - char *long_archi; - char *short_archi; - }; - - struct table archi_table[]= - { - {"Windows 4.0", "" }, - {"Windows NT x86", "W32X86" }, - {"Windows NT R4000", "" }, - {"Windows NT Alpha_AXP", "" }, - {"Windows NT PowerPC", "" }, - {NULL, "" } - }; - - int i=-1; - - DEBUG(7,("Getting architecture dependant directory\n")); - do { - i++; - } while ( (archi_table[i].long_archi!=NULL ) && strncmp(long_archi, archi_table[i].long_archi, strlen(long_archi)) ); - - if (archi_table[i].long_archi==NULL) - { - DEBUGADD(7,("Unknown architecture [%s] !\n", long_archi)); - } - StrnCpy (short_archi, archi_table[i].short_archi, strlen(archi_table[i].short_archi)); - - DEBUGADD(8,("index: [%d]\n", i)); - DEBUGADD(8,("long architecture: [%s]\n", long_archi)); - DEBUGADD(8,("short architecture: [%s]\n", short_archi)); -} - -/**************************************************************************** -****************************************************************************/ -static uint32 add_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 *driver) -{ - FILE *f; - pstring file; - fstring architecture; - fstring driver_name; - char **dependentfiles; - - /* create a file in the dir lp_nt_driver_file */ - /* with the full printer DRIVER name */ - /* eg: "/usr/local/samba/lib/NTdriver_HP LaserJet 6MP" */ - /* each name is really defining an *unique* printer model */ - /* I don't want to mangle the name to find it back when enumerating */ - - /* il faut substituer les / par 1 autre caractere d'abord */ - /* dans le nom de l'imprimante par un # ???*/ - - StrnCpy(driver_name, driver->name, sizeof(driver_name)-1); - - all_string_sub(driver_name, "/", "#"); - - get_short_archi(architecture, driver->environment); - - slprintf(file, sizeof(file)-1, "%s/NTdriver_%s_%s", - lp_nt_drivers_file(), architecture, driver_name); - - if((f = sys_fopen(file, "w")) == NULL) - { - DEBUG(1, ("cannot create driver file [%s]\n", file)); - return(2); - } - - /* - * cversion must be 2. - * when adding a printer ON the SERVER - * rpcAddPrinterDriver defines it to zero - * which is wrong !!! - * - * JFM, 4/14/99 - */ - driver->cversion=2; - - fprintf(f, "version: %d\n", driver->cversion); - fprintf(f, "name: %s\n", driver->name); - fprintf(f, "environment: %s\n", driver->environment); - fprintf(f, "driverpath: %s\n", driver->driverpath); - fprintf(f, "datafile: %s\n", driver->datafile); - fprintf(f, "configfile: %s\n", driver->configfile); - fprintf(f, "helpfile: %s\n", driver->helpfile); - fprintf(f, "monitorname: %s\n", driver->monitorname); - fprintf(f, "defaultdatatype: %s\n", driver->defaultdatatype); - - /* and the dependants files */ - - dependentfiles=driver->dependentfiles; - - while ( **dependentfiles != '\0' ) - { - fprintf(f, "dependentfile: %s\n", *dependentfiles); - dependentfiles++; - } - - fclose(f); - return(0); -} - -/**************************************************************************** -****************************************************************************/ -static uint32 get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr, fstring in_prt, fstring in_arch) -{ - FILE *f; - pstring file; - fstring driver_name; - fstring architecture; - NT_PRINTER_DRIVER_INFO_LEVEL_3 *info; - char *line; - fstring p; - char *v; - int i=0; - char **dependentfiles=NULL; - - /* - * replace all the / by # in the driver name - * get the short architecture name - * construct the driver file name - */ - StrnCpy(driver_name, in_prt, sizeof(driver_name)-1); - all_string_sub(driver_name, "/", "#"); - - get_short_archi(architecture, in_arch); - - slprintf(file, sizeof(file)-1, "%s/NTdriver_%s_%s", - lp_nt_drivers_file(), architecture, driver_name); - - if((f = sys_fopen(file, "r")) == NULL) - { - DEBUG(2, ("cannot open printer driver file [%s]\n", file)); - return(2); - } - - /* the file exists, allocate some memory */ - info=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3)); - ZERO_STRUCTP(info); - - /* allocate a 4Kbytes buffer for parsing lines */ - line=(char *)malloc(4096*sizeof(char)); - - while ( fgets(line, 4095, f) ) - { - - v=strncpyn(p, line, sizeof(p), ':'); - if (v==NULL) - { - DEBUG(1, ("malformed printer entry (no :)\n")); - continue; - } - - v++; - - trim_string(v, " ", NULL); - trim_string(v, NULL, " "); - trim_string(v, NULL, "\n"); - /* don't check if v==NULL as an empty arg is valid */ - - if (!strncmp(p, "version", strlen("version"))) - info->cversion=atoi(v); - - if (!strncmp(p, "name", strlen("name"))) - StrnCpy(info->name, v, strlen(v)); - - if (!strncmp(p, "environment", strlen("environment"))) - StrnCpy(info->environment, v, strlen(v)); - - if (!strncmp(p, "driverpath", strlen("driverpath"))) - StrnCpy(info->driverpath, v, strlen(v)); - - if (!strncmp(p, "datafile", strlen("datafile"))) - StrnCpy(info->datafile, v, strlen(v)); - - if (!strncmp(p, "configfile", strlen("configfile"))) - StrnCpy(info->configfile, v, strlen(v)); - - if (!strncmp(p, "helpfile", strlen("helpfile"))) - StrnCpy(info->helpfile, v, strlen(v)); - - if (!strncmp(p, "monitorname", strlen("monitorname"))) - StrnCpy(info->monitorname, v, strlen(v)); - - if (!strncmp(p, "defaultdatatype", strlen("defaultdatatype"))) - StrnCpy(info->defaultdatatype, v, strlen(v)); - - if (!strncmp(p, "dependentfile", strlen("dependentfile"))) - { - dependentfiles=(char **)Realloc(dependentfiles, sizeof(char *)*(i+1)); - - dependentfiles[i]=(char *)malloc( sizeof(char)* (strlen(v)+1) ); - - StrnCpy(dependentfiles[i], v, strlen(v) ); - i++; - } - - } - - free(line); - - fclose(f); - - dependentfiles=(char **)Realloc(dependentfiles, sizeof(char *)*(i+1)); - dependentfiles[i]=(char *)malloc( sizeof(char) ); - *dependentfiles[i]='\0'; - - info->dependentfiles=dependentfiles; - - *info_ptr=info; - - return (0); -} - -/**************************************************************************** -debugging function, dump at level 6 the struct in the logs -****************************************************************************/ -static uint32 dump_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level) -{ - uint32 success; - NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3; - char **dependentfiles; - - DEBUG(6,("Dumping printer driver at level [%d]\n", level)); - - switch (level) - { - case 3: - { - if (driver.info_3 == NULL) - { - DEBUGADD(3,("NULL pointer, memory not alloced ?\n")); - success=5; - } - else - { - info3=driver.info_3; - - DEBUGADD(6,("version:[%d]\n", info3->cversion)); - DEBUGADD(6,("name:[%s]\n", info3->name)); - DEBUGADD(6,("environment:[%s]\n", info3->environment)); - DEBUGADD(6,("driverpath:[%s]\n", info3->driverpath)); - DEBUGADD(6,("datafile:[%s]\n", info3->datafile)); - DEBUGADD(6,("configfile:[%s]\n", info3->configfile)); - DEBUGADD(6,("helpfile:[%s]\n", info3->helpfile)); - DEBUGADD(6,("monitorname:[%s]\n", info3->monitorname)); - DEBUGADD(6,("defaultdatatype:[%s]\n", info3->defaultdatatype)); - - dependentfiles=info3->dependentfiles; - - while ( **dependentfiles != '\0' ) - { - DEBUGADD(6,("dependentfile:[%s]\n", *dependentfiles)); - dependentfiles++; - } - success=0; - } - break; - } - default: - DEBUGADD(1,("Level not implemented\n")); - success=1; - break; - } - - return (success); -} - -/**************************************************************************** -****************************************************************************/ -static void add_a_devicemode(NT_DEVICEMODE *nt_devmode, FILE *f) -{ - int i; - - fprintf(f, "formname: %s\n", nt_devmode->formname); - fprintf(f, "specversion: %d\n", nt_devmode->specversion); - fprintf(f, "driverversion: %d\n", nt_devmode->driverversion); - fprintf(f, "size: %d\n", nt_devmode->size); - fprintf(f, "driverextra: %d\n", nt_devmode->driverextra); - fprintf(f, "fields: %d\n", nt_devmode->fields); - fprintf(f, "orientation: %d\n", nt_devmode->orientation); - fprintf(f, "papersize: %d\n", nt_devmode->papersize); - fprintf(f, "paperlength: %d\n", nt_devmode->paperlength); - fprintf(f, "paperwidth: %d\n", nt_devmode->paperwidth); - fprintf(f, "scale: %d\n", nt_devmode->scale); - fprintf(f, "copies: %d\n", nt_devmode->copies); - fprintf(f, "defaultsource: %d\n", nt_devmode->defaultsource); - fprintf(f, "printquality: %d\n", nt_devmode->printquality); - fprintf(f, "color: %d\n", nt_devmode->color); - fprintf(f, "duplex: %d\n", nt_devmode->duplex); - fprintf(f, "yresolution: %d\n", nt_devmode->yresolution); - fprintf(f, "ttoption: %d\n", nt_devmode->ttoption); - fprintf(f, "collate: %d\n", nt_devmode->collate); - fprintf(f, "icmmethod: %d\n", nt_devmode->icmmethod); - fprintf(f, "icmintent: %d\n", nt_devmode->icmintent); - fprintf(f, "mediatype: %d\n", nt_devmode->mediatype); - fprintf(f, "dithertype: %d\n", nt_devmode->dithertype); - - if (nt_devmode->private != NULL) - { - fprintf(f, "private: "); - for (i=0; i<nt_devmode->driverextra; i++) - fprintf(f, "%02X", nt_devmode->private[i]); - fprintf(f, "\n"); - } -} - -/**************************************************************************** -****************************************************************************/ -static void save_specifics(NT_PRINTER_PARAM *param, FILE *f) -{ - int i; - - while (param != NULL) - { - fprintf(f, "specific: %s#%d#%d#", param->value, param->type, param->data_len); - - for (i=0; i<param->data_len; i++) - fprintf(f, "%02X", param->data[i]); - - fprintf(f, "\n"); - - param=param->next; - } -} - -/**************************************************************************** -****************************************************************************/ -static uint32 add_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info) -{ - FILE *f; - pstring file; - fstring printer_name; - NT_DEVICEMODE *nt_devmode; - - /* - * JFM: one day I'll forget. - * below that's info->portname because that's the SAMBA sharename - * and I made NT 'thinks' it's the portname - * the info->sharename is the thing you can name when you add a printer - * that's the short-name when you create shared printer for 95/98 - * So I've made a limitation in SAMBA: you can only have 1 printer model - * behind a SAMBA share. - */ - - - StrnCpy(printer_name, info->portname, sizeof(printer_name)-1); - - slprintf(file, sizeof(file)-1, "%s/NTprinter_%s", - lp_nt_drivers_file(), printer_name); - - /* create a file in the dir lp_nt_driver_file */ - /* with the full printer name */ - /* eg: "/usr/local/samba/lib/NTprinter_HP LaserJet 6MP" */ - /* each name is really defining an *unique* printer model */ - /* I don't want to mangle the name to find it back when enumerating */ - - if((f = sys_fopen(file, "w")) == NULL) - { - DEBUG(1, ("cannot create printer file [%s]\n", file)); - return(2); - } - - fprintf(f, "attributes: %d\n", info->attributes); - fprintf(f, "priority: %d\n", info->priority); - fprintf(f, "default_priority: %d\n", info->default_priority); - fprintf(f, "starttime: %d\n", info->starttime); - fprintf(f, "untiltime: %d\n", info->untiltime); - fprintf(f, "status: %d\n", info->status); - fprintf(f, "cjobs: %d\n", info->cjobs); - fprintf(f, "averageppm: %d\n", info->averageppm); - - /* - * in addprinter: no servername and the printer is the name - * in setprinter: servername is \\server - * and printer is \\server\\printer - * - * Samba manages only local printers. - * we currently don't support things like path=\\other_server\printer - */ - - if (info->servername[0]!='\0') - { - trim_string(info->printername, info->servername, NULL); - trim_string(info->printername, "\\", NULL); - info->servername[0]='\0'; - } - - fprintf(f, "servername: %s\n", info->servername); - fprintf(f, "printername: %s\n", info->printername); - fprintf(f, "sharename: %s\n", info->sharename); - fprintf(f, "portname: %s\n", info->portname); - fprintf(f, "drivername: %s\n", info->drivername); - fprintf(f, "comment: %s\n", info->comment); - fprintf(f, "location: %s\n", info->location); - fprintf(f, "sepfile: %s\n", info->sepfile); - fprintf(f, "printprocessor: %s\n", info->printprocessor); - fprintf(f, "datatype: %s\n", info->datatype); - fprintf(f, "parameters: %s\n", info->parameters); - - /* store the devmode and the private part if it exist */ - nt_devmode=info->devmode; - if (nt_devmode!=NULL) - { - add_a_devicemode(nt_devmode, f); - } - - /* and store the specific parameters */ - if (info->specific != NULL) - { - save_specifics(info->specific, f); - } - - fclose(f); - - return (0); -} - -/**************************************************************************** -fill a NT_PRINTER_PARAM from a text file - -used when reading from disk. -****************************************************************************/ -static void dissect_and_fill_a_param(NT_PRINTER_PARAM *param, char *v) -{ - char *tok[5]; - int count = 0; - - DEBUG(5,("dissect_and_fill_a_param\n")); - - tok[count] = strtok(v,"#"); - count++; - - while ( ((tok[count] = strtok(NULL,"#")) != NULL ) && count<4) - { - count++; - } - - StrnCpy(param->value, tok[0], sizeof(param->value)-1); - param->type=atoi(tok[1]); - param->data_len=atoi(tok[2]); - param->data=(uint8 *)malloc(param->data_len * sizeof(uint8)); - strhex_to_str(param->data, 2*(param->data_len), tok[3]); - param->next=NULL; - - DEBUGADD(5,("value:[%s], len:[%d]\n", param->value, param->data_len)); -} - -/**************************************************************************** -fill a NT_PRINTER_PARAM from a text file - -used when reading from disk. -****************************************************************************/ -void dump_a_param(NT_PRINTER_PARAM *param) -{ - DEBUG(5,("dump_a_param\n")); - DEBUGADD(6,("value [%s]\n", param->value)); - DEBUGADD(6,("type [%d]\n", param->type)); - DEBUGADD(6,("data len [%d]\n", param->data_len)); -} - -/**************************************************************************** -****************************************************************************/ -BOOL add_a_specific_param(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *param) -{ - NT_PRINTER_PARAM *current; - - DEBUG(8,("add_a_specific_param\n")); - - param->next=NULL; - - if (info_2->specific == NULL) - { - info_2->specific=param; - } - else - { - current=info_2->specific; - while (current->next != NULL) { - current=current->next; - } - current->next=param; - } - return (True); -} - -/**************************************************************************** -****************************************************************************/ -BOOL unlink_specific_param_if_exist(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *param) -{ - NT_PRINTER_PARAM *current; - NT_PRINTER_PARAM *previous; - - current=info_2->specific; - previous=current; - - if (current==NULL) return (False); - - if ( !strcmp(current->value, param->value) && - (strlen(current->value)==strlen(param->value)) ) - { - DEBUG(9,("deleting first value\n")); - info_2->specific=current->next; - free(current); - DEBUG(9,("deleted first value\n")); - return (True); - } - - current=previous->next; - - while ( current!=NULL ) - { - if (!strcmp(current->value, param->value) && - strlen(current->value)==strlen(param->value) ) - { - DEBUG(9,("deleting current value\n")); - previous->next=current->next; - free(current); - DEBUG(9,("deleted current value\n")); - return(True); - } - - previous=previous->next; - current=current->next; - } - return (False); -} - -/**************************************************************************** -****************************************************************************/ -static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharename) -{ - FILE *f; - pstring file; - fstring printer_name; - NT_PRINTER_INFO_LEVEL_2 *info; - NT_DEVICEMODE *nt_devmode; - NT_PRINTER_PARAM *param; - char *line; - fstring p; - char *v; - - /* - * the sharename argument is the SAMBA sharename - */ - StrnCpy(printer_name, sharename, sizeof(printer_name)-1); - - slprintf(file, sizeof(file)-1, "%s/NTprinter_%s", - lp_nt_drivers_file(), printer_name); - - if((f = sys_fopen(file, "r")) == NULL) - { - DEBUG(2, ("cannot open printer file [%s]\n", file)); - return(2); - } - - /* the file exists, allocate some memory */ - info=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2)); - ZERO_STRUCTP(info); - - nt_devmode=(NT_DEVICEMODE *)malloc(sizeof(NT_DEVICEMODE)); - ZERO_STRUCTP(nt_devmode); - init_devicemode(nt_devmode); - - info->devmode=nt_devmode; - - line=(char *)malloc(4096*sizeof(char)); - - while ( fgets(line, 4095, f) ) - { - - v=strncpyn(p, line, sizeof(p), ':'); - if (v==NULL) - { - DEBUG(1, ("malformed printer entry (no `:')\n")); - DEBUGADD(2, ("line [%s]\n", line)); - continue; - } - - v++; - - trim_string(v, " ", NULL); - trim_string(v, NULL, " "); - trim_string(v, NULL, "\n"); - - /* don't check if v==NULL as an empty arg is valid */ - - DEBUGADD(15, ("[%s]:[%s]\n", p, v)); - - /* - * The PRINTER_INFO_2 fields - */ - - if (!strncmp(p, "attributes", strlen("attributes"))) - info->attributes=atoi(v); - - if (!strncmp(p, "priority", strlen("priority"))) - info->priority=atoi(v); - - if (!strncmp(p, "default_priority", strlen("default_priority"))) - info->default_priority=atoi(v); - - if (!strncmp(p, "starttime", strlen("starttime"))) - info->starttime=atoi(v); - - if (!strncmp(p, "untiltime", strlen("untiltime"))) - info->untiltime=atoi(v); - - if (!strncmp(p, "status", strlen("status"))) - info->status=atoi(v); - - if (!strncmp(p, "cjobs", strlen("cjobs"))) - info->cjobs=atoi(v); - - if (!strncmp(p, "averageppm", strlen("averageppm"))) - info->averageppm=atoi(v); - - if (!strncmp(p, "servername", strlen("servername"))) - StrnCpy(info->servername, v, strlen(v)); - - if (!strncmp(p, "printername", strlen("printername"))) - StrnCpy(info->printername, v, strlen(v)); - - if (!strncmp(p, "sharename", strlen("sharename"))) - StrnCpy(info->sharename, v, strlen(v)); - - if (!strncmp(p, "portname", strlen("portname"))) - StrnCpy(info->portname, v, strlen(v)); - - if (!strncmp(p, "drivername", strlen("drivername"))) - StrnCpy(info->drivername, v, strlen(v)); - - if (!strncmp(p, "comment", strlen("comment"))) - StrnCpy(info->comment, v, strlen(v)); - - if (!strncmp(p, "location", strlen("location"))) - StrnCpy(info->location, v, strlen(v)); - - if (!strncmp(p, "sepfile", strlen("sepfile"))) - StrnCpy(info->sepfile, v, strlen(v)); - - if (!strncmp(p, "printprocessor", strlen("printprocessor"))) - StrnCpy(info->printprocessor, v, strlen(v)); - - if (!strncmp(p, "datatype", strlen("datatype"))) - StrnCpy(info->datatype, v, strlen(v)); - - if (!strncmp(p, "parameters", strlen("parameters"))) - StrnCpy(info->parameters, v, strlen(v)); - - /* - * The DEVICEMODE fields - */ - - if (!strncmp(p, "formname", strlen("formname"))) - StrnCpy(nt_devmode->formname, v, strlen(v)); - - if (!strncmp(p, "specversion", strlen("specversion"))) - nt_devmode->specversion=atoi(v); - - if (!strncmp(p, "driverversion", strlen("driverversion"))) - nt_devmode->driverversion=atoi(v); - - if (!strncmp(p, "size", strlen("size"))) - nt_devmode->size=atoi(v); - - if (!strncmp(p, "driverextra", strlen("driverextra"))) - nt_devmode->driverextra=atoi(v); - - if (!strncmp(p, "fields", strlen("fields"))) - nt_devmode->fields=atoi(v); - - if (!strncmp(p, "orientation", strlen("orientation"))) - nt_devmode->orientation=atoi(v); - - if (!strncmp(p, "papersize", strlen("papersize"))) - nt_devmode->papersize=atoi(v); - - if (!strncmp(p, "paperlength", strlen("paperlength"))) - nt_devmode->paperlength=atoi(v); - - if (!strncmp(p, "paperwidth", strlen("paperwidth"))) - nt_devmode->paperwidth=atoi(v); - - if (!strncmp(p, "scale", strlen("scale"))) - nt_devmode->scale=atoi(v); - - if (!strncmp(p, "copies", strlen("copies"))) - nt_devmode->copies=atoi(v); - - if (!strncmp(p, "defaultsource", strlen("defaultsource"))) - nt_devmode->defaultsource=atoi(v); - - if (!strncmp(p, "printquality", strlen("printquality"))) - nt_devmode->printquality=atoi(v); - - if (!strncmp(p, "color", strlen("color"))) - nt_devmode->color=atoi(v); - - if (!strncmp(p, "duplex", strlen("duplex"))) - nt_devmode->duplex=atoi(v); - - if (!strncmp(p, "yresolution", strlen("yresolution"))) - nt_devmode->yresolution=atoi(v); - - if (!strncmp(p, "ttoption", strlen("ttoption"))) - nt_devmode->ttoption=atoi(v); - - if (!strncmp(p, "collate", strlen("collate"))) - nt_devmode->collate=atoi(v); - - if (!strncmp(p, "icmmethod", strlen("icmmethod"))) - nt_devmode->icmmethod=atoi(v); - - if (!strncmp(p, "icmintent", strlen("icmintent"))) - nt_devmode->icmintent=atoi(v); - - if (!strncmp(p, "mediatype", strlen("mediatype"))) - nt_devmode->mediatype=atoi(v); - - if (!strncmp(p, "dithertype", strlen("dithertype"))) - nt_devmode->dithertype=atoi(v); - - if (!strncmp(p, "private", strlen("private"))) - { - nt_devmode->private=(uint8 *)malloc(nt_devmode->driverextra*sizeof(uint8)); - strhex_to_str(nt_devmode->private, 2*nt_devmode->driverextra, v); - } - - /* the specific */ - - if (!strncmp(p, "specific", strlen("specific"))) - { - param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM)); - ZERO_STRUCTP(param); - - dissect_and_fill_a_param(param, v); - - dump_a_param(param); - - add_a_specific_param(info, param); - } - - } - fclose(f); - free(line); - - *info_ptr=info; - - return (0); -} - -/**************************************************************************** -debugging function, dump at level 6 the struct in the logs -****************************************************************************/ -static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) -{ - uint32 success; - NT_PRINTER_INFO_LEVEL_2 *info2; - - DEBUG(6,("Dumping printer at level [%d]\n", level)); - - switch (level) - { - case 2: - { - if (printer.info_2 == NULL) - { - DEBUGADD(3,("NULL pointer, memory not alloced ?\n")); - success=5; - } - else - { - info2=printer.info_2; - - DEBUGADD(6,("attributes:[%d]\n", info2->attributes)); - DEBUGADD(6,("priority:[%d]\n", info2->priority)); - DEBUGADD(6,("default_priority:[%d]\n", info2->default_priority)); - DEBUGADD(6,("starttime:[%d]\n", info2->starttime)); - DEBUGADD(6,("untiltime:[%d]\n", info2->untiltime)); - DEBUGADD(6,("status:[%d]\n", info2->status)); - DEBUGADD(6,("cjobs:[%d]\n", info2->cjobs)); - DEBUGADD(6,("averageppm:[%d]\n", info2->averageppm)); - - DEBUGADD(6,("servername:[%s]\n", info2->servername)); - DEBUGADD(6,("printername:[%s]\n", info2->printername)); - DEBUGADD(6,("sharename:[%s]\n", info2->sharename)); - DEBUGADD(6,("portname:[%s]\n", info2->portname)); - DEBUGADD(6,("drivername:[%s]\n", info2->drivername)); - DEBUGADD(6,("comment:[%s]\n", info2->comment)); - DEBUGADD(6,("location:[%s]\n", info2->location)); - DEBUGADD(6,("sepfile:[%s]\n", info2->sepfile)); - DEBUGADD(6,("printprocessor:[%s]\n", info2->printprocessor)); - DEBUGADD(6,("datatype:[%s]\n", info2->datatype)); - DEBUGADD(6,("parameters:[%s]\n", info2->parameters)); - success=0; - } - break; - } - default: - DEBUGADD(1,("Level not implemented\n")); - success=1; - break; - } - - return (success); -} - -/* - * The function below are the high level ones. - * only those ones must be called from the spoolss code. - * JFM. - */ - - -/**************************************************************************** -****************************************************************************/ -uint32 add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) -{ - uint32 success; - - dump_a_printer(printer, level); - - switch (level) - { - case 2: - { - success=add_a_printer_2(printer.info_2); - break; - } - default: - success=1; - break; - } - - return (success); -} - -/**************************************************************************** -****************************************************************************/ -uint32 get_a_printer(NT_PRINTER_INFO_LEVEL *printer, uint32 level, fstring sharename) -{ - uint32 success; - - switch (level) - { - case 2: - { - printer->info_2=NULL; - success=get_a_printer_2(&(printer->info_2), sharename); - break; - } - default: - success=1; - break; - } - - dump_a_printer(*printer, level); - return (success); -} - -/**************************************************************************** -****************************************************************************/ -uint32 free_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) -{ - uint32 success; - DEBUG(4,("freeing a printer at level [%d]\n", level)); - - switch (level) - { - case 2: - { - if (printer.info_2 != NULL) - { - if ((printer.info_2)->devmode != NULL) - { - DEBUG(6,("deleting DEVMODE\n")); - if ((printer.info_2)->devmode->private !=NULL ) - free((printer.info_2)->devmode->private); - free((printer.info_2)->devmode); - } - - if ((printer.info_2)->specific != NULL) - { - NT_PRINTER_PARAM *param; - NT_PRINTER_PARAM *next_param; - - param=(printer.info_2)->specific; - - while ( param != NULL) - { - next_param=param->next; - DEBUG(6,("deleting param [%s]\n", param->value)); - free(param->data); - free(param); - param=next_param; - } - } - - free(printer.info_2); - success=0; - } - else - { - success=4; - } - break; - } - default: - success=1; - break; - } - return (success); -} - -/**************************************************************************** -****************************************************************************/ -uint32 add_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level) -{ - uint32 success; - DEBUG(4,("adding a printer at level [%d]\n", level)); - dump_a_printer_driver(driver, level); - - switch (level) - { - case 3: - { - success=add_a_printer_driver_3(driver.info_3); - break; - } - default: - success=1; - break; - } - - return (success); -} -/**************************************************************************** -****************************************************************************/ -uint32 get_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL *driver, uint32 level, - fstring printername, fstring architecture) -{ - uint32 success; - - switch (level) - { - case 3: - { - success=get_a_printer_driver_3(&(driver->info_3), - printername, - architecture); - break; - } - default: - success=1; - break; - } - - dump_a_printer_driver(*driver, level); - return (success); -} - -/**************************************************************************** -****************************************************************************/ -uint32 free_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level) -{ - uint32 success; - NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3; - char **dependentfiles; - - switch (level) - { - case 3: - { - if (driver.info_3 != NULL) - { - info3=driver.info_3; - dependentfiles=info3->dependentfiles; - - while ( **dependentfiles != '\0' ) - { - free (*dependentfiles); - dependentfiles++; - } - - /* the last one (1 char !) */ - free (*dependentfiles); - - dependentfiles=info3->dependentfiles; - free (dependentfiles); - - free(info3); - success=0; - } - else - { - success=4; - } - break; - } - default: - success=1; - break; - } - return (success); -} - -/**************************************************************************** -****************************************************************************/ -BOOL get_specific_param_by_index(NT_PRINTER_INFO_LEVEL printer, uint32 level, uint32 param_index, - fstring value, uint8 **data, uint32 *type, uint32 *len) -{ - /* right now that's enough ! */ - NT_PRINTER_PARAM *param; - int i=0; - - param=printer.info_2->specific; - - while (param != NULL && i < param_index) - { - param=param->next; - i++; - } - - if (param != NULL) - { - /* exited because it exist */ - *type=param->type; - StrnCpy(value, param->value, sizeof(value)-1); - *data=(uint8 *)malloc(param->data_len*sizeof(uint8)); - memcpy(*data, param->data, param->data_len); - *len=param->data_len; - return (True); - } - return (False); -} - -/**************************************************************************** -****************************************************************************/ -BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level, - fstring value, uint8 **data, uint32 *type, uint32 *len) -{ - /* right now that's enough ! */ - NT_PRINTER_PARAM *param; - - DEBUG(5, ("get_specific_param\n")); - - param=printer.info_2->specific; - - while (param != NULL) - { - if ( !strcmp(value, param->value) - && strlen(value)==strlen(param->value)) - break; - - param=param->next; - } - - DEBUG(6, ("found one param\n")); - if (param != NULL) - { - /* exited because it exist */ - *type=param->type; - - *data=(uint8 *)malloc(param->data_len*sizeof(uint8)); - memcpy(*data, param->data, param->data_len); - *len=param->data_len; - - DEBUG(6, ("exit of get_specific_param:true\n")); - return (True); - } - DEBUG(6, ("exit of get_specific_param:false\n")); - return (False); -} - -/**************************************************************************** -****************************************************************************/ -void init_devicemode(NT_DEVICEMODE *nt_devmode) -{ -/* - * should I init this ones ??? - nt_devmode->devicename -*/ - StrCpy(nt_devmode->formname, "A4"); - - nt_devmode->specversion = 0x0401; - nt_devmode->driverversion = 0x0400; - nt_devmode->size = 0x00DC; - nt_devmode->driverextra = 0x0000; - nt_devmode->fields = FORMNAME | TTOPTION | PRINTQUALITY | - DEFAULTSOURCE | COPIES | SCALE | - PAPERSIZE | ORIENTATION; - nt_devmode->orientation = 1; - nt_devmode->papersize = PAPER_A4; - nt_devmode->paperlength = 0; - nt_devmode->paperwidth = 0; - nt_devmode->scale = 0x64; - nt_devmode->copies = 01; - nt_devmode->defaultsource = BIN_FORMSOURCE; - nt_devmode->printquality = 0x0258; - nt_devmode->color = COLOR_MONOCHROME; - nt_devmode->duplex = DUP_SIMPLEX; - nt_devmode->yresolution = 0; - nt_devmode->ttoption = TT_SUBDEV; - nt_devmode->collate = COLLATE_FALSE; - nt_devmode->icmmethod = 0; - nt_devmode->icmintent = 0; - nt_devmode->mediatype = 0; - nt_devmode->dithertype = 0; - - /* non utilisés par un driver d'imprimante */ - nt_devmode->logpixels = 0; - nt_devmode->bitsperpel = 0; - nt_devmode->pelswidth = 0; - nt_devmode->pelsheight = 0; - nt_devmode->displayflags = 0; - nt_devmode->displayfrequency = 0; - nt_devmode->reserved1 = 0; - nt_devmode->reserved2 = 0; - nt_devmode->panningwidth = 0; - nt_devmode->panningheight = 0; - - nt_devmode->private=NULL; -} - -/* error code: - 0: everything OK - 1: level not implemented - 2: file doesn't exist - 3: can't allocate memory - 4: can't free memory - 5: non existant struct -*/ - -/* - A printer and a printer driver are 2 different things. - NT manages them separatelly, Samba does the same. - Why ? Simply because it's easier and it makes sense ! - - Now explanation: You have 3 printers behind your samba server, - 2 of them are the same make and model (laser A and B). But laser B - has an 3000 sheet feeder and laser A doesn't such an option. - Your third printer is an old dot-matrix model for the accounting :-). - - If the /usr/local/samba/lib directory (default dir), you will have - 5 files to describe all of this. - - 3 files for the printers (1 by printer): - NTprinter_laser A - NTprinter_laser B - NTprinter_accounting - 2 files for the drivers (1 for the laser and 1 for the dot matrix) - NTdriver_printer model X - NTdriver_printer model Y - -jfm: I should use this comment for the text file to explain - same thing for the forms BTW. - Je devrais mettre mes commentaires en francais, ca serait mieux :-) - -*/ - - diff --git a/source3/rpc_client/cli_atsvc.c b/source3/rpc_client/cli_atsvc.c deleted file mode 100644 index 9ba87e6e4a..0000000000 --- a/source3/rpc_client/cli_atsvc.c +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 2.1. - * RPC client routines: scheduler service - * Copyright (C) Matthew Chapman 1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * Copyright (C) Andrew Tridgell 1992-1999. - * - * 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" - -extern int DEBUGLEVEL; - -/**************************************************************************** -add a job to the scheduler -****************************************************************************/ -BOOL at_add_job( - char *srv_name, AT_JOB_INFO *info, char *command, - uint32 *jobid) -{ - prs_struct rbuf; - prs_struct buf; - AT_Q_ADD_JOB q_a; - BOOL p = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_init(srv_name, PIPE_ATSVC, &con)) - { - return False; - } - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api AT_ADD_JOB */ - - DEBUG(4,("Scheduler Add Job\n")); - - /* store the parameters */ - make_at_q_add_job(&q_a, srv_name, info, command); - - /* turn parameters into data stream */ - at_io_q_add_job("", &q_a, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, AT_ADD_JOB, &buf, &rbuf)) - { - AT_R_ADD_JOB r_a; - - at_io_r_add_job("", &r_a, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_a.status != 0) - { - /* report error code */ - DEBUG(0,("AT_R_ADD_JOB: %s\n", get_nt_error_msg(r_a.status))); - p = False; - } - - if (p) - { - *jobid = r_a.jobid; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - cli_connection_unlink(con); - - return p; -} - -/**************************************************************************** -dequeue a job -****************************************************************************/ -BOOL at_del_job( char *srv_name, uint32 min_jobid, uint32 max_jobid) -{ - prs_struct rbuf; - prs_struct buf; - AT_Q_DEL_JOB q_d; - BOOL p = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_init(srv_name, PIPE_ATSVC, &con)) - { - return False; - } - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api AT_DEL_JOB */ - - DEBUG(4,("Scheduler Delete Job\n")); - - /* store the parameters */ - make_at_q_del_job(&q_d, srv_name, min_jobid, max_jobid); - - /* turn parameters into data stream */ - at_io_q_del_job("", &q_d, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, AT_DEL_JOB, &buf, &rbuf)) - { - AT_R_DEL_JOB r_d; - - at_io_r_del_job("", &r_d, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_d.status != 0) - { - /* report error code */ - DEBUG(0,("AT_R_DEL_JOB: %s\n", get_nt_error_msg(r_d.status))); - p = False; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - cli_connection_unlink(con); - - return p; -} - -/**************************************************************************** -enumerate scheduled jobs -****************************************************************************/ -BOOL at_enum_jobs( char *srv_name, uint32 *num_jobs, - AT_ENUM_INFO *jobs, char ***commands) -{ - prs_struct rbuf; - prs_struct buf; - AT_Q_ENUM_JOBS q_e; - BOOL p = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_init(srv_name, PIPE_ATSVC, &con)) - { - return False; - } - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api AT_DEL_JOB */ - - DEBUG(4,("Scheduler Enumerate Jobs\n")); - - /* store the parameters */ - make_at_q_enum_jobs(&q_e, srv_name); - - /* turn parameters into data stream */ - at_io_q_enum_jobs("", &q_e, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, AT_ENUM_JOBS, &buf, &rbuf)) - { - AT_R_ENUM_JOBS r_e; - - at_io_r_enum_jobs("", &r_e, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_e.status != 0) - { - /* report error code */ - DEBUG(0,("AT_R_ENUM_JOBS: %s\n", get_nt_error_msg(r_e.status))); - p = False; - } - - if (p) - { - int i; - - *num_jobs = 0; - memcpy(jobs, &r_e.info, r_e.num_entries * sizeof(AT_ENUM_INFO)); - - for (i = 0; i < r_e.num_entries; i++) - { - fstring cmd; - unistr2_to_ascii(cmd, &r_e.command[i], sizeof(cmd)); - add_chars_to_array(num_jobs, commands, cmd); - } - if ((*num_jobs) != r_e.num_entries) - { - p = False; - } - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - cli_connection_unlink(con); - - return p; -} - -/**************************************************************************** -query job information -****************************************************************************/ -BOOL at_query_job(char *srv_name, - uint32 jobid, AT_JOB_INFO *job, fstring command) -{ - prs_struct rbuf; - prs_struct buf; - AT_Q_QUERY_JOB q_q; - BOOL p = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_init(srv_name, PIPE_ATSVC, &con)) - { - return False; - } - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api AT_QUERY_JOB */ - - DEBUG(4,("Scheduler Query Job\n")); - - /* store the parameters */ - make_at_q_query_job(&q_q, srv_name, jobid); - - /* turn parameters into data stream */ - at_io_q_query_job("", &q_q, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, AT_QUERY_JOB, &buf, &rbuf)) - { - AT_R_QUERY_JOB r_q; - - at_io_r_query_job("", &r_q, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_q.status != 0) - { - /* report error code */ - DEBUG(0,("AT_R_QUERY_JOB: %s\n", get_nt_error_msg(r_q.status))); - p = False; - } - - if (p) - { - memcpy(job, &r_q.info, sizeof(AT_JOB_INFO)); - unistr2_to_ascii(command, &r_q.command, - sizeof(fstring)-1); - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - cli_connection_unlink(con); - - return p; -} diff --git a/source3/rpc_client/cli_brs.c b/source3/rpc_client/cli_brs.c deleted file mode 100644 index f4e055f394..0000000000 --- a/source3/rpc_client/cli_brs.c +++ /dev/null @@ -1,97 +0,0 @@ - -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * - * 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. - */ - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" - -extern int DEBUGLEVEL; - -/**************************************************************************** -do a BRS Query -****************************************************************************/ -BOOL brs_query_info( const char *srv_name, uint32 switch_value, - void *id) -{ - prs_struct rbuf; - prs_struct buf; - BRS_Q_QUERY_INFO q_o; - BOOL valid_info = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_init(srv_name, PIPE_BROWSER, &con)) - { - return False; - } - - if (id == NULL) return False; - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api BRS_QUERY_INFO */ - - DEBUG(4,("BRS Query Info\n")); - - /* store the parameters */ - make_brs_q_query_info(&q_o, srv_name, switch_value); - - /* turn parameters into data stream */ - brs_io_q_query_info("", &q_o, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, BRS_QUERY_INFO, &buf, &rbuf)) - { - BRS_R_QUERY_INFO r_o; - BOOL p; - - r_o.info.id = id; - - brs_io_r_query_info("", &r_o, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_o.status != 0) - { - /* report error code */ - DEBUG(0,("BRS_R_QUERY_INFO: %s\n", get_nt_error_msg(r_o.status))); - p = False; - } - - if (p) - { - valid_info = True; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - cli_connection_unlink(con); - - return valid_info; -} - diff --git a/source3/rpc_client/cli_connect.c b/source3/rpc_client/cli_connect.c deleted file mode 100644 index f935b53044..0000000000 --- a/source3/rpc_client/cli_connect.c +++ /dev/null @@ -1,427 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB client generic functions - Copyright (C) Andrew Tridgell 1994-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - -#define NO_SYSLOG - -#include "includes.h" - -struct ntuser_creds *usr_creds = NULL; - -extern int DEBUGLEVEL; -extern pstring scope; -extern pstring global_myname; - -struct cli_connection -{ - uint32 num_connections; - char *srv_name; - char *pipe_name; - struct ntuser_creds usr_creds; - struct cli_state *cli; - uint16 fnum; -}; - -static struct cli_connection **con_list = NULL; -uint32 num_cons = 0; - -void init_connections(void) -{ - con_list = NULL; - num_cons = 0; - - init_cli_use(); -} - -static void free_con_array(uint32 num_entries, struct cli_connection **entries) -{ - void(*fn)(void*) = (void(*)(void*))&cli_connection_free; - free_void_array(num_entries, (void**)entries, *fn); -} - -static struct cli_connection* add_con_to_array(uint32 *len, - struct cli_connection ***array, - struct cli_connection *con) -{ - return (struct cli_connection*)add_item_to_array(len, - (void***)array, (void*)con); - -} -void free_connections(void) -{ - free_con_array(num_cons, con_list); - free_cli_use(); - - init_connections(); -} - -static struct cli_connection *cli_con_get(const char* srv_name, - const char* pipe_name, BOOL reuse) -{ - struct cli_connection *con = NULL; - - con = (struct cli_connection*)malloc(sizeof(*con)); - - if (con == NULL) - { - return NULL; - } - - memset(con, 0, sizeof(*con)); - - if (srv_name != NULL) - { - con->srv_name = strdup(srv_name); - } - if (pipe_name != NULL) - { - con->pipe_name = strdup(pipe_name); - } - - con->cli = cli_net_use_add(srv_name, usr_creds, True, reuse); - - if (con->cli == NULL) - { - cli_connection_free(con); - return NULL; - } - add_con_to_array(&num_cons, &con_list, con); - return con; -} - -/**************************************************************************** -terminate client connection -****************************************************************************/ -void cli_connection_free(struct cli_connection *con) -{ - BOOL closed; - int i; - - if (con->cli != NULL) - { - cli_nt_session_close(con->cli, con->fnum); - cli_net_use_del(con->srv_name, &con->usr_creds, False, &closed); - } - - if (closed) - { - for (i = 0; i < num_cons; i++) - { - if (con_list[i] != NULL && - con != con_list[i] && - con_list[i]->cli == con->cli) - { - /* WHOOPS! fnum already open: too bad!!! */ - con_list[i]->cli = NULL; - con_list[i]->fnum = 0xffff; - } - } - } - - con->cli = NULL; - - if (con->srv_name != NULL) - { - free(con->srv_name); - con->srv_name = NULL; - } - if (con->pipe_name != NULL) - { - free(con->pipe_name); - con->pipe_name = NULL; - } - - memset(&con->usr_creds, 0, sizeof(con->usr_creds)); - - for (i = 0; i < num_cons; i++) - { - if (con == con_list[i]) - { - con_list[i] = NULL; - } - } - - free(con); -} - -/**************************************************************************** -terminate client state -****************************************************************************/ -void cli_connection_unlink(struct cli_connection *con) -{ - if (con != NULL) - { - cli_connection_free(con); - } - return; -} - -/**************************************************************************** -init client state -****************************************************************************/ -BOOL cli_connection_init(const char* srv_name, const char* pipe_name, - struct cli_connection **con) -{ - BOOL res = True; - BOOL reuse = False; - - /* - * allocate - */ - - *con = cli_con_get(srv_name, pipe_name, reuse); - - if ((*con) == NULL) - { - return False; - } - - res = res ? cli_nt_session_open((*con)->cli, pipe_name, - &(*con)->fnum) : False; - - return res; -} - -/**************************************************************************** -obtain client state -****************************************************************************/ -BOOL cli_connection_getsrv(const char* srv_name, const char* pipe_name, - struct cli_connection **con) -{ - int i; - if (con_list == NULL || num_cons == 0) - { - return False; - } - - for (i = 0; i < num_cons; i++) - { - if (con_list[i] != NULL && - strequal(con_list[i]->srv_name , srv_name ) && - strequal(con_list[i]->pipe_name, pipe_name)) - { - (*con) = con_list[i]; - return True; - } - } - return False; -} - -/**************************************************************************** -obtain client state -****************************************************************************/ -BOOL cli_connection_get(const POLICY_HND *pol, struct cli_connection **con) -{ - return get_policy_con(pol, con); -} - -/**************************************************************************** -link a child policy handle to a parent one -****************************************************************************/ -BOOL cli_pol_link(POLICY_HND *to, const POLICY_HND *from) -{ - struct cli_connection *con = NULL; - - if (!cli_connection_get(from, &con)) - { - return False; - } - - return register_policy_hnd(to) && set_policy_con(to, con, NULL); -} - -/**************************************************************************** -get a user session key associated with a connection associated with a -policy handle. -****************************************************************************/ -BOOL cli_get_con_usr_sesskey(struct cli_connection *con, uchar usr_sess_key[16]) -{ - if (con == NULL) - { - return False; - } - memcpy(usr_sess_key, con->cli->usr.pwd.sess_key, 16); - - return True; -} - -/**************************************************************************** -get a user session key associated with a connection associated with a -policy handle. -****************************************************************************/ -BOOL cli_get_con_sesskey(struct cli_connection *con, uchar sess_key[16]) -{ - if (con == NULL) - { - return False; - } - memcpy(sess_key, con->cli->sess_key, sizeof(con->cli->sess_key)); - - return True; -} - -/**************************************************************************** -get a user session key associated with a connection associated with a -policy handle. -****************************************************************************/ -BOOL cli_con_get_srvname(struct cli_connection *con, char *srv_name) -{ - if (con == NULL) - { - return False; - } - - if (strnequal("\\\\", con->cli->desthost, 2)) - { - fstrcpy(srv_name, con->cli->desthost); - } - else - { - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, con->cli->desthost); - } - - return True; -} - -/**************************************************************************** -get a user session key associated with a connection associated with a -policy handle. -****************************************************************************/ -BOOL cli_get_usr_sesskey(const POLICY_HND *pol, uchar usr_sess_key[16]) -{ - struct cli_connection *con = NULL; - - if (!cli_connection_get(pol, &con)) - { - return False; - } - - return cli_get_con_usr_sesskey(con, usr_sess_key); -} - -/**************************************************************************** -get a user session key associated with a connection associated with a -policy handle. -****************************************************************************/ -BOOL cli_get_sesskey(const POLICY_HND *pol, uchar sess_key[16]) -{ - struct cli_connection *con = NULL; - - if (!cli_connection_get(pol, &con)) - { - return False; - } - - return cli_get_con_sesskey(con, sess_key); -} - -/**************************************************************************** -get a user session key associated with a connection associated with a -policy handle. -****************************************************************************/ -BOOL cli_get_sesskey_srv(const char* srv_name, uchar sess_key[16]) -{ - struct cli_connection *con = NULL; - - if (!cli_connection_getsrv(srv_name, PIPE_NETLOGON, &con)) - { - return False; - } - - return cli_get_con_sesskey(con, sess_key); -} - -/**************************************************************************** -get a user session key associated with a connection associated with a -policy handle. -****************************************************************************/ -void cli_con_gen_next_creds(struct cli_connection *con, - DOM_CRED *new_clnt_cred) -{ - gen_next_creds(con->cli, new_clnt_cred); -} - -/**************************************************************************** -get a user session key associated with a connection associated with a -policy handle. -****************************************************************************/ -void cli_con_get_cli_cred(struct cli_connection *con, - DOM_CRED *clnt_cred) -{ - memcpy(clnt_cred, &con->cli->clnt_cred, sizeof(*clnt_cred)); -} - -/**************************************************************************** -get a user session key associated with a connection associated with a -policy handle. -****************************************************************************/ -BOOL cli_con_deal_with_creds(struct cli_connection *con, - DOM_CRED *rcv_srv_cred) -{ - return clnt_deal_with_creds(con->cli->sess_key, &con->cli->clnt_cred, - rcv_srv_cred); -} - -/**************************************************************************** -get a user session key associated with a connection associated with a -policy handle. -****************************************************************************/ -BOOL cli_con_set_creds(const char* srv_name, const uchar sess_key[16], - DOM_CRED *cred) -{ - struct cli_connection *con = NULL; - - if (!cli_connection_getsrv(srv_name, PIPE_NETLOGON, &con)) - { - return False; - } - - memcpy(con->cli->sess_key, sess_key, 16); - memcpy(&con->cli->clnt_cred, cred, sizeof(*cred)); - - return True; -} - -/**************************************************************************** - send a request on an rpc pipe. - ****************************************************************************/ -BOOL rpc_hnd_pipe_req(const POLICY_HND *hnd, uint8 op_num, - prs_struct *data, prs_struct *rdata) -{ - struct cli_connection *con = NULL; - - if (!cli_connection_get(hnd, &con)) - { - return False; - } - - return rpc_con_pipe_req(con, op_num, data, rdata); -} - -/**************************************************************************** - send a request on an rpc pipe. - ****************************************************************************/ -BOOL rpc_con_pipe_req(struct cli_connection *con, uint8 op_num, - prs_struct *data, prs_struct *rdata) -{ - return rpc_api_pipe_req(con->cli, con->fnum, op_num, data, rdata); -} diff --git a/source3/rpc_client/cli_eventlog.c b/source3/rpc_client/cli_eventlog.c deleted file mode 100644 index 85ba302294..0000000000 --- a/source3/rpc_client/cli_eventlog.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 2.1. - * RPC client routines: scheduler service - * Copyright (C) Jean Francois Micouleau 1998-1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * Copyright (C) Andrew Tridgell 1992-1999. - * - * 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" - -extern int DEBUGLEVEL; - -/**************************************************************************** -****************************************************************************/ -BOOL event_open(const char* srv_name, const char *log, POLICY_HND *hnd) -{ - prs_struct rbuf; - prs_struct buf; - EVENTLOG_Q_OPEN q; - BOOL p = False; - BOOL valid_pol = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_init(srv_name, PIPE_EVENTLOG, &con)) - { - return False; - } - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* store the parameters */ - make_eventlog_q_open(&q, log, NULL); - - /* turn parameters into data stream */ - eventlog_io_q_open("", &q, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, EVENTLOG_OPEN, &buf, &rbuf)) - { - EVENTLOG_R_OPEN r; - - eventlog_io_r_open("", &r, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r.status != 0) - { - /* report error code */ - DEBUG(0,("event_open: %s\n", get_nt_error_msg(r.status))); - p = False; - } - - if (p) - { - /*copy handle */ - memcpy(hnd->data, r.pol.data, sizeof(hnd->data)); - valid_pol = register_policy_hnd(hnd) && - set_policy_con(hnd, con, - cli_connection_unlink); - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return p; -} - -/**************************************************************************** -****************************************************************************/ -BOOL event_close( POLICY_HND *hnd) -{ - prs_struct rbuf; - prs_struct buf; - EVENTLOG_Q_CLOSE q; - BOOL p = False; - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* store the parameters */ - make_eventlog_q_close(&q, hnd); - - /* turn parameters into data stream */ - eventlog_io_q_close("", &q, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_hnd_pipe_req(hnd, EVENTLOG_CLOSE, &buf, &rbuf)) - { - EVENTLOG_R_CLOSE r; - - eventlog_io_r_close("", &r, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r.status != 0) - { - /* report error code */ - DEBUG(0,("event_close: %s\n", get_nt_error_msg(r.status))); - p = False; - } - - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - close_policy_hnd(hnd); - - return p; -} - -/**************************************************************************** -****************************************************************************/ -BOOL event_numofeventlogrec( POLICY_HND *hnd, uint32 *number) -{ - prs_struct rbuf; - prs_struct buf; - EVENTLOG_Q_NUMOFEVENTLOGREC q; - BOOL p = False; - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* store the parameters */ - make_eventlog_q_numofeventlogrec(&q, hnd); - - /* turn parameters into data stream */ - eventlog_io_q_numofeventlogrec("", &q, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_hnd_pipe_req(hnd, EVENTLOG_NUMOFEVENTLOGRECORDS, &buf, &rbuf)) - { - EVENTLOG_R_NUMOFEVENTLOGREC r; - - eventlog_io_r_numofeventlogrec("", &r, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r.status != 0) - { - /* report error code */ - DEBUG(0,("event_close: %s\n", get_nt_error_msg(r.status))); - p = False; - } - - if (p) - { - *number=r.number; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return p; -} - -/**************************************************************************** -****************************************************************************/ -BOOL event_readeventlog(POLICY_HND *hnd, - uint32 number, uint32 flags, uint32 offset, - uint32 *number_of_bytes, EVENTLOGRECORD *ev) -{ - prs_struct rbuf; - prs_struct buf; - EVENTLOG_Q_READEVENTLOG q; - EVENTLOG_R_READEVENTLOG r; - BOOL p = False; - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* store the parameters */ - make_eventlog_q_readeventlog(&q, hnd, flags, offset, *number_of_bytes); - - /* turn parameters into data stream */ - eventlog_io_q_readeventlog("", &q, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_hnd_pipe_req(hnd, EVENTLOG_READEVENTLOG, &buf, &rbuf)) - { - r.event=ev; - eventlog_io_r_readeventlog("", &r, &rbuf, 0); - p = rbuf.offset != 0; - - if (p) - { - *number_of_bytes=r.real_size; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return p; -} - diff --git a/source3/rpc_client/cli_netlogon_sync.c b/source3/rpc_client/cli_netlogon_sync.c deleted file mode 100644 index a56e37a8ed..0000000000 --- a/source3/rpc_client/cli_netlogon_sync.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * Copyright (C) Matthew Chapman 1999, - * - * 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. - */ - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" - -extern int DEBUGLEVEL; -extern pstring global_myname; - -BOOL synchronise_passdb(void) -{ - SAM_DELTA_HDR hdr_deltas[MAX_SAM_DELTAS]; - SAM_DELTA_CTR deltas[MAX_SAM_DELTAS]; - uint32 num; - - SAM_ACCOUNT_INFO *acc; - struct smb_passwd pwd; - fstring nt_name; - unsigned char smb_passwd[16]; - unsigned char smb_nt_passwd[16]; - uchar trust_passwd[16]; - fstring trust_acct; - - char *mode; - BOOL success; - BOOL ret; - int i; - - fstrcpy(trust_acct, global_myname); - fstrcat(trust_acct, "$"); - - if (!trust_get_passwd(trust_passwd, lp_workgroup(), global_myname)) - { - return False; - } - - ret = net_sam_sync(lp_passwordserver(), global_myname, trust_acct, - trust_passwd, - hdr_deltas, deltas, &num); - - if (ret) - { - for (i = 0; i < num; i++) - { - /* Currently only interested in accounts */ - if (hdr_deltas[i].type != 5) - { - continue; - } - - acc = &deltas[i].account_info; - pwdb_init_smb(&pwd); - - pwd.user_rid = acc->user_rid; - unistr2_to_ascii(nt_name, &(acc->uni_acct_name), sizeof(fstring)-1); - pwd.nt_name = nt_name; - pwd.acct_ctrl = acc->acb_info; - pwd.pass_last_set_time = nt_time_to_unix(&(acc->pwd_last_set_time)); - - sam_pwd_hash(acc->user_rid, smb_passwd, acc->pass.buf_lm_pwd, 0); - sam_pwd_hash(acc->user_rid, smb_nt_passwd, acc->pass.buf_nt_pwd, 0); - pwd.smb_passwd = smb_passwd; - pwd.smb_nt_passwd = smb_nt_passwd; - - mode = "modify"; - success = mod_smbpwd_entry(&pwd, True); - - if (!success) - { - mode = "add"; - success = add_smbpwd_entry(&pwd); - } - - DEBUG(0, ("Attempted to %s account for %s: %s\n", mode, - nt_name, success ? "OK" : "FAILED")); - } - } - - return ret; -} diff --git a/source3/rpc_client/cli_spoolss.c b/source3/rpc_client/cli_spoolss.c deleted file mode 100644 index 7ddbb9dbe4..0000000000 --- a/source3/rpc_client/cli_spoolss.c +++ /dev/null @@ -1,329 +0,0 @@ - -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * 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. - */ - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" - -extern int DEBUGLEVEL; - - -/**************************************************************************** -do a SPOOLSS Enum Printers -****************************************************************************/ -BOOL spoolss_enum_printers(uint32 flags, const char *srv_name, - uint32 level, - uint32 *count, - void ***printers) -{ - prs_struct rbuf; - prs_struct buf; - SPOOL_Q_ENUMPRINTERS q_o; - BOOL valid_pol = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con)) - { - return False; - } - - if (count == NULL || printers == NULL) return False; - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */ - - DEBUG(5,("SPOOLSS Enum Printers (Server: %s level: %d)\n", - srv_name, level)); - - make_spoolss_q_enumprinters(&q_o, flags, srv_name, level, 0x200); - - /* turn parameters into data stream */ - spoolss_io_q_enumprinters("", &q_o, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, SPOOLSS_ENUMPRINTERS, &buf, &rbuf)) - { - SPOOL_R_ENUMPRINTERS r_o; - BOOL p; - - ZERO_STRUCT(r_o); - - r_o.level = level; /* i can't believe you have to this */ - - spoolss_io_r_enumprinters("", &r_o, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_o.status != 0) - { - /* report error code */ - DEBUG(5,("SPOOLSS_ENUM_PRINTERS: %s\n", get_nt_error_msg(r_o.status))); - p = False; - } - - if (p) - { - /* ok, at last: we're happy. return the policy handle */ - (*count) = r_o.returned; - (*printers) = r_o.printer.info; - valid_pol = True; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - cli_connection_unlink(con); - - return valid_pol; -} - -/**************************************************************************** -do a SPOOLSS Enum Jobs -****************************************************************************/ -uint32 spoolss_enum_jobs( const POLICY_HND *hnd, - uint32 firstjob, - uint32 numofjobs, - uint32 level, - uint32 *buf_size, - uint32 *count, - void ***jobs) -{ - prs_struct rbuf; - prs_struct buf; - SPOOL_Q_ENUMJOBS q_o; - uint32 status = 0x0; - - if (hnd == NULL || count == NULL || jobs == NULL) - { - return NT_STATUS_INVALID_PARAMETER; - } - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */ - - DEBUG(5,("SPOOLSS Enum Jobs level: %d)\n", level)); - - make_spoolss_q_enumjobs(&q_o, hnd, - firstjob, numofjobs, - level, *buf_size); - - /* turn parameters into data stream */ - spoolss_io_q_enumjobs("", &q_o, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_hnd_pipe_req(hnd, SPOOLSS_ENUMJOBS, &buf, &rbuf)) - { - SPOOL_R_ENUMJOBS r_o; - BOOL p; - - ZERO_STRUCT(r_o); - - r_o.level = level; /* i can't believe you have to this */ - - spoolss_io_r_enumjobs("", &r_o, &rbuf, 0); - p = rbuf.offset != 0; - - status = r_o.status; - - if (p && r_o.status != 0) - { - /* report error code */ - DEBUG(5,("SPOOLSS_ENUM_JOBS: %s\n", get_nt_error_msg(r_o.status))); - p = status = ERROR_INSUFFICIENT_BUFFER; - } - - if (p) - { - /* ok, at last: we're happy. return the policy handle */ - (*count) = r_o.numofjobs; - (*jobs) = r_o.job.info; - (*buf_size) = r_o.offered; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return status; -} - -/**************************************************************************** -do a SPOOLSS Open Printer Ex -****************************************************************************/ -BOOL spoolss_open_printer_ex( const char *printername, - uint32 cbbuf, uint32 devmod, uint32 des_access, - const char *station, const char *username, - POLICY_HND *hnd) -{ - prs_struct rbuf; - prs_struct buf; - SPOOL_Q_OPEN_PRINTER_EX q_o; - BOOL valid_pol = False; - fstring srv_name; - char *s; - - struct cli_connection *con = NULL; - - memset(srv_name, 0, sizeof(srv_name)); - fstrcpy(srv_name, printername); - - s = strchr(&srv_name[2], '\\'); - - if (s != NULL) - { - *s = 0; - } - - if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con)) - { - return False; - } - - if (hnd == NULL) return False; - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api SPOOLSS_OPENPRINTEREX */ - - DEBUG(5,("SPOOLSS Open Printer Ex\n")); - - make_spoolss_q_open_printer_ex(&q_o, printername, - cbbuf, devmod, des_access, - station, username); - - /* turn parameters into data stream */ - spoolss_io_q_open_printer_ex("", &q_o, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, SPOOLSS_OPENPRINTEREX, &buf, &rbuf)) - { - SPOOL_R_OPEN_PRINTER_EX r_o; - BOOL p; - - spoolss_io_r_open_printer_ex("", &r_o, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_o.status != 0) - { - /* report error code */ - DEBUG(5,("SPOOLSS_OPENPRINTEREX: %s\n", get_nt_error_msg(r_o.status))); - p = False; - } - - if (p) - { - /* ok, at last: we're happy. return the policy handle */ - memcpy(hnd, r_o.handle.data, sizeof(hnd->data)); - - valid_pol = register_policy_hnd(hnd) && - set_policy_con(hnd, con, - cli_connection_unlink); - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return valid_pol; -} - -/**************************************************************************** -do a SPOOL Close -****************************************************************************/ -BOOL spoolss_closeprinter(POLICY_HND *hnd) -{ - prs_struct rbuf; - prs_struct buf; - SPOOL_Q_CLOSEPRINTER q_c; - BOOL valid_close = False; - - if (hnd == NULL) return False; - - /* create and send a MSRPC command with api SPOOLSS_CLOSEPRINTER */ - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - DEBUG(4,("SPOOL Close Printer\n")); - - /* store the parameters */ - make_spoolss_q_closeprinter(&q_c, hnd); - - /* turn parameters into data stream */ - spoolss_io_q_closeprinter("", &q_c, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_hnd_pipe_req(hnd, SPOOLSS_CLOSEPRINTER, &buf, &rbuf)) - { - SPOOL_R_CLOSEPRINTER r_c; - BOOL p; - - spoolss_io_r_closeprinter("", &r_c, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_c.status != 0) - { - /* report error code */ - DEBUG(0,("SPOOL_CLOSEPRINTER: %s\n", get_nt_error_msg(r_c.status))); - p = False; - } - - if (p) - { - /* check that the returned policy handle is all zeros */ - uint32 i; - valid_close = True; - - for (i = 0; i < sizeof(r_c.handle.data); i++) - { - if (r_c.handle.data[i] != 0) - { - valid_close = False; - break; - } - } - if (!valid_close) - { - DEBUG(0,("SPOOL_CLOSEPRINTER: non-zero handle returned\n")); - } - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - close_policy_hnd(hnd); - - return valid_close; -} - diff --git a/source3/rpc_client/cli_svcctl.c b/source3/rpc_client/cli_svcctl.c deleted file mode 100644 index b284b2661e..0000000000 --- a/source3/rpc_client/cli_svcctl.c +++ /dev/null @@ -1,604 +0,0 @@ - -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1998, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1998, - * Copyright (C) Paul Ashton 1997-1998. - * - * 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. - */ - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" - -extern int DEBUGLEVEL; - -/**************************************************************************** -do a SVC Open Policy -****************************************************************************/ -BOOL svc_open_sc_man( const char *srv_name, char *db_name, - uint32 des_access, - POLICY_HND *hnd) -{ - prs_struct rbuf; - prs_struct buf; - SVC_Q_OPEN_SC_MAN q_o; - BOOL valid_pol = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_init(srv_name, PIPE_SVCCTL, &con)) - { - return False; - } - - if (hnd == NULL) return False; - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api SVC_OPEN_SC_MAN */ - - DEBUG(4,("SVC Open SC_MAN\n")); - - make_svc_q_open_sc_man(&q_o, srv_name, db_name, des_access); - - /* turn parameters into data stream */ - svc_io_q_open_sc_man("", &q_o, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, SVC_OPEN_SC_MAN, &buf, &rbuf)) - { - SVC_R_OPEN_SC_MAN r_o; - BOOL p; - - ZERO_STRUCT(r_o); - - svc_io_r_open_sc_man("", &r_o, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_o.status != 0) - { - /* report error code */ - DEBUG(1,("SVC_OPEN_SC_MAN: %s\n", get_nt_error_msg(r_o.status))); - p = False; - } - - if (p) - { - /* ok, at last: we're happy. return the policy handle */ - memcpy(hnd, r_o.pol.data, sizeof(hnd->data)); - valid_pol = True; - valid_pol = register_policy_hnd(hnd) && - set_policy_con(hnd, con, - cli_connection_unlink); - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return valid_pol; -} - - -/**************************************************************************** -do a SVC Open Service -****************************************************************************/ -BOOL svc_open_service( POLICY_HND *scm_hnd, - const char *srv_name, - uint32 des_access, - POLICY_HND *hnd) -{ - prs_struct rbuf; - prs_struct buf; - SVC_Q_OPEN_SERVICE q_o; - BOOL valid_pol = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_get(scm_hnd, &con)) - { - return False; - } - - if (hnd == NULL || scm_hnd == NULL) return False; - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api SVC_OPEN_SERVICE */ - - DEBUG(4,("SVC Open Service\n")); - - make_svc_q_open_service(&q_o, scm_hnd, srv_name, des_access); - - /* turn parameters into data stream */ - svc_io_q_open_service("", &q_o, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, SVC_OPEN_SERVICE, &buf, &rbuf)) - { - SVC_R_OPEN_SERVICE r_o; - BOOL p; - - ZERO_STRUCT(r_o); - - svc_io_r_open_service("", &r_o, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_o.status != 0) - { - /* report error code */ - DEBUG(1,("SVC_OPEN_SC_MAN: %s\n", get_nt_error_msg(r_o.status))); - p = False; - } - - if (p) - { - /* ok, at last: we're happy. return the policy handle */ - memcpy(hnd, r_o.pol.data, sizeof(hnd->data)); - valid_pol = register_policy_hnd(hnd) && - set_policy_con(hnd, con, NULL); - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return valid_pol; -} - - -/**************************************************************************** -do a SVC Enumerate Services -****************************************************************************/ -BOOL svc_enum_svcs( POLICY_HND *hnd, - uint32 services_type, uint32 services_state, - uint32 *buf_size, uint32 *resume_hnd, - uint32 *dos_error, - ENUM_SRVC_STATUS **svcs, uint32 *num_svcs) -{ - prs_struct rbuf; - prs_struct buf; - SVC_Q_ENUM_SVCS_STATUS q_o; - BOOL valid_pol = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_get(hnd, &con)) - { - return False; - } - - if (hnd == NULL || buf_size == NULL || dos_error == NULL || num_svcs == NULL) - { - return False; - } - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - /* create and send a MSRPC command with api SVC_ENUM_SVCS_STATUS */ - - DEBUG(4,("SVC Enum Services Status\n")); - - make_svc_q_enum_svcs_status(&q_o, hnd, - services_type, services_state, - *buf_size, *resume_hnd); - - /* turn parameters into data stream */ - svc_io_q_enum_svcs_status("", &q_o, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, SVC_ENUM_SVCS_STATUS, &buf, &rbuf)) - { - SVC_R_ENUM_SVCS_STATUS r_o; - BOOL p; - - ZERO_STRUCT(r_o); - - svc_io_r_enum_svcs_status("", &r_o, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_o.dos_status != 0) - { - fstring errmsg; - - if (r_o.dos_status != ERRmoredata) - { - smb_safe_err_msg(ERRDOS, r_o.dos_status, - errmsg, sizeof(errmsg)); - /* report error code */ - DEBUG(1,("SVC_ENUM_SVCS_STATUS: %s\n", errmsg)); - } - p = r_o.dos_status == ERRmoredata; - } - - if (p) - { - (*svcs) = r_o.svcs; - (*num_svcs) = r_o.num_svcs; - (*resume_hnd) = get_enum_hnd(&r_o.resume_hnd); - (*buf_size) = r_o.more_buf_size; - (*dos_error) = r_o.dos_status; - valid_pol = True; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return valid_pol; -} - - -/**************************************************************************** -do a SVC Stop Service -****************************************************************************/ -BOOL svc_stop_service( POLICY_HND *hnd, - uint32 unknown) -{ - prs_struct rbuf; - prs_struct buf; - SVC_Q_STOP_SERVICE q_c; - BOOL valid_cfg = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_get(hnd, &con)) - { - return False; - } - - if (hnd == NULL) return False; - - /* create and send a MSRPC command with api SVC_STOP_SERVICE */ - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - DEBUG(4,("SVC Stop Service\n")); - - /* store the parameters */ - make_svc_q_stop_service(&q_c, hnd, unknown); - - /* turn parameters into data stream */ - svc_io_q_stop_service("", &q_c, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, SVC_STOP_SERVICE, &buf, &rbuf)) - { - SVC_R_STOP_SERVICE r_c; - BOOL p; - - ZERO_STRUCT (r_c); - - svc_io_r_stop_service("", &r_c, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_c.status != 0) - { - /* report error code */ - DEBUG(1,("SVC_START_SERVICE: %s\n", get_nt_error_msg(r_c.status))); - p = False; - } - - if (p) - { - valid_cfg = True; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return valid_cfg; -} - - -/**************************************************************************** -do a SVC Start Service -****************************************************************************/ -BOOL svc_start_service( POLICY_HND *hnd, - uint32 argc, - char **argv) -{ - prs_struct rbuf; - prs_struct buf; - SVC_Q_START_SERVICE q_c; - BOOL valid_cfg = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_get(hnd, &con)) - { - return False; - } - - if (hnd == NULL) return False; - - /* create and send a MSRPC command with api SVC_START_SERVICE */ - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - DEBUG(4,("SVC Start Service\n")); - - /* store the parameters */ - make_svc_q_start_service(&q_c, hnd, argc, argv); - - /* turn parameters into data stream */ - svc_io_q_start_service("", &q_c, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, SVC_START_SERVICE, &buf, &rbuf)) - { - SVC_R_START_SERVICE r_c; - BOOL p; - - ZERO_STRUCT (r_c); - - svc_io_r_start_service("", &r_c, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_c.status != 0) - { - /* report error code */ - DEBUG(1,("SVC_START_SERVICE: %s\n", get_nt_error_msg(r_c.status))); - p = False; - } - - if (p) - { - valid_cfg = True; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return valid_cfg; -} - - -/**************************************************************************** -do a SVC Query Service Config -****************************************************************************/ -BOOL svc_query_svc_cfg( POLICY_HND *hnd, - QUERY_SERVICE_CONFIG *cfg, - uint32 *buf_size) -{ - prs_struct rbuf; - prs_struct buf; - SVC_Q_QUERY_SVC_CONFIG q_c; - BOOL valid_cfg = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_get(hnd, &con)) - { - return False; - } - - if (hnd == NULL || buf_size == NULL) return False; - - /* create and send a MSRPC command with api SVC_QUERY_SVC_CONFIG */ - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - DEBUG(4,("SVC Query Service Config\n")); - - /* store the parameters */ - make_svc_q_query_svc_config(&q_c, hnd, *buf_size); - - /* turn parameters into data stream */ - svc_io_q_query_svc_config("", &q_c, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, SVC_QUERY_SVC_CONFIG, &buf, &rbuf)) - { - SVC_R_QUERY_SVC_CONFIG r_c; - BOOL p; - - ZERO_STRUCT (r_c); - ZERO_STRUCTP(cfg); - - r_c.cfg = cfg; - - svc_io_r_query_svc_config("", &r_c, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_c.status != 0) - { - /* report error code */ - DEBUG(1,("SVC_QUERY_SVC_CONFIG: %s\n", get_nt_error_msg(r_c.status))); - p = False; - } - - if (p) - { - valid_cfg = r_c.buf_size != 0; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return valid_cfg; -} - - -/**************************************************************************** -do a SVC Close -****************************************************************************/ -BOOL svc_close(POLICY_HND *hnd) -{ - prs_struct rbuf; - prs_struct buf; - SVC_Q_CLOSE q_c; - BOOL valid_close = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_get(hnd, &con)) - { - return False; - } - - if (hnd == NULL) return False; - - /* create and send a MSRPC command with api SVC_CLOSE */ - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - DEBUG(4,("SVC Close\n")); - - /* store the parameters */ - make_svc_q_close(&q_c, hnd); - - /* turn parameters into data stream */ - svc_io_q_close("", &q_c, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, SVC_CLOSE, &buf, &rbuf)) - { - SVC_R_CLOSE r_c; - BOOL p; - - ZERO_STRUCT(r_c); - - svc_io_r_close("", &r_c, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_c.status != 0) - { - /* report error code */ - DEBUG(1,("SVC_CLOSE: %s\n", get_nt_error_msg(r_c.status))); - p = False; - } - - if (p) - { - /* check that the returned policy handle is all zeros */ - uint32 i; - valid_close = True; - - for (i = 0; i < sizeof(r_c.pol.data); i++) - { - if (r_c.pol.data[i] != 0) - { - valid_close = False; - break; - } - } - if (!valid_close) - { - DEBUG(1,("SVC_CLOSE: non-zero handle returned\n")); - } - } - } - - close_policy_hnd(hnd); - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return valid_close; -} - -/**************************************************************************** -do a SVC Change Service Config -****************************************************************************/ -BOOL svc_change_svc_cfg( POLICY_HND *hnd, - uint32 service_type, uint32 start_type, - uint32 unknown_0, - uint32 error_control, - char* bin_path_name, char* load_order_grp, - uint32 tag_id, - char* dependencies, char* service_start_name, - char* password, - char* disp_name) -{ - prs_struct rbuf; - prs_struct buf; - SVC_Q_CHANGE_SVC_CONFIG q_c; - BOOL valid_cfg = False; - - struct cli_connection *con = NULL; - - if (!cli_connection_get(hnd, &con)) - { - return False; - } - - if (hnd == NULL) return False; - - /* create and send a MSRPC command with api SVC_CHANGE_SVC_CONFIG */ - - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); - - DEBUG(4,("SVC Change Service Config\n")); - - /* store the parameters */ - make_svc_q_change_svc_config(&q_c, hnd, - service_type, start_type, - unknown_0, error_control, - bin_path_name, load_order_grp, - tag_id, - dependencies, service_start_name, - password, disp_name); - - /* turn parameters into data stream */ - svc_io_q_change_svc_config("", &q_c, &buf, 0); - - /* send the data on \PIPE\ */ - if (rpc_con_pipe_req(con, SVC_CHANGE_SVC_CONFIG, &buf, &rbuf)) - { - SVC_R_CHANGE_SVC_CONFIG r_c; - BOOL p; - - ZERO_STRUCT (r_c); - - svc_io_r_change_svc_config("", &r_c, &rbuf, 0); - p = rbuf.offset != 0; - - if (p && r_c.status != 0) - { - /* report error code */ - DEBUG(1,("SVC_CHANGE_SVC_CONFIG: %s\n", get_nt_error_msg(r_c.status))); - p = False; - } - - if (p) - { - valid_cfg = True; - } - } - - prs_mem_free(&rbuf); - prs_mem_free(&buf ); - - return valid_cfg; -} diff --git a/source3/rpc_client/cli_use.c b/source3/rpc_client/cli_use.c deleted file mode 100644 index 96122c307d..0000000000 --- a/source3/rpc_client/cli_use.c +++ /dev/null @@ -1,418 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - SMB client generic functions - Copyright (C) Andrew Tridgell 1994-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - -#define NO_SYSLOG - -#include "includes.h" -#include "trans2.h" - -extern int DEBUGLEVEL; -extern pstring scope; -extern pstring global_myname; - -struct cli_use -{ - struct cli_state *cli; - uint32 num_users; -}; - -static struct cli_use **clis = NULL; -uint32 num_clis = 0; - -/**************************************************************************** -terminate client connection -****************************************************************************/ -static void cli_use_free(struct cli_use *cli) -{ - if (cli->cli != NULL) - { - if (cli->cli->initialised) - { - cli_ulogoff(cli->cli); - cli_shutdown(cli->cli); - } - free(cli->cli); - } - - free(cli); -} - -/**************************************************************************** -free a client array -****************************************************************************/ -static void free_cli_array(uint32 num_entries, struct cli_use **entries) -{ - void(*fn)(void*) = (void(*)(void*))&cli_use_free; - free_void_array(num_entries, (void**)entries, *fn); -} - -/**************************************************************************** -add a client state to the array -****************************************************************************/ -static struct cli_use* add_cli_to_array(uint32 *len, - struct cli_use ***array, - struct cli_use *cli) -{ - int i; - for (i = 0; i < num_clis; i++) - { - if (clis[i] == NULL) - { - clis[i] = cli; - return cli; - } - } - - return (struct cli_use*)add_item_to_array(len, - (void***)array, (void*)cli); - -} - -/**************************************************************************** -initiate client array -****************************************************************************/ -void init_cli_use(void) -{ - clis = NULL; - num_clis = 0; -} - -/**************************************************************************** -terminate client array -****************************************************************************/ -void free_cli_use(void) -{ - free_cli_array(num_clis, clis); - init_cli_use(); -} - -/**************************************************************************** -find client state. server name, user name, domain name and password must all -match. -****************************************************************************/ -static struct cli_use *cli_find(const char* srv_name, - const struct ntuser_creds *usr_creds, - BOOL reuse) -{ - int i; - const char *sv_name = srv_name; - struct ntuser_creds null_usr; - - copy_nt_creds(&null_usr, usr_creds); - usr_creds = &null_usr; - - if (strnequal("\\\\", sv_name, 2)) - { - sv_name = &sv_name[2]; - } - - DEBUG(10,("cli_find: %s %s %s\n", - srv_name, - usr_creds->user_name, - usr_creds->domain)); - - for (i = 0; i < num_clis; i++) - { - char *cli_name = NULL; - struct cli_use *c = clis[i]; - - if (c == NULL) continue; - - cli_name = c->cli->desthost; - - DEBUG(10,("cli_find[%d]: %s %s %s\n", - i, cli_name, - c->cli->usr.user_name, - c->cli->usr.domain)); - - if (strnequal("\\\\", cli_name, 2)) - { - cli_name = &cli_name[2]; - } - - if (!strequal(cli_name, sv_name)) - { - continue; - } - if (!strequal(usr_creds->user_name, c->cli->usr.user_name)) - { - continue; - } - if (!reuse && - !pwd_compare(&usr_creds->pwd, &c->cli->usr.pwd)) - { - DEBUG(100,("password doesn't match\n")); - continue; - } - if (usr_creds->domain[0] == 0) - { - return c; - } - if (strequal(usr_creds->domain, c->cli->usr.domain)) - { - return c; - } - } - - return NULL; -} - -/**************************************************************************** -create a new client state from user credentials -****************************************************************************/ -static struct cli_use *cli_use_get(const char* srv_name, - const struct ntuser_creds *usr_creds) -{ - struct cli_use *cli = (struct cli_use*)malloc(sizeof(*cli)); - - if (cli == NULL) - { - return NULL; - } - - memset(cli, 0, sizeof(*cli)); - - cli->cli = cli_initialise(NULL); - - if (cli->cli == NULL) - { - return NULL; - } - - cli_init_creds(cli->cli, usr_creds); - - return cli; -} - -/**************************************************************************** -init client state -****************************************************************************/ -struct cli_state *cli_net_use_add(const char* srv_name, - const struct ntuser_creds *usr_creds, - BOOL redir, - BOOL reuse) -{ - struct nmb_name calling; - struct nmb_name called; - struct in_addr *dest_ip = NULL; - fstring dest_host; - struct in_addr ip; - - struct cli_use *cli = cli_find(srv_name, usr_creds, reuse); - - if (cli != NULL) - { - cli->num_users++; - return cli->cli; - } - - /* reuse an existing connection requested, and one was not found */ - if (usr_creds != NULL && reuse && !redir) - { - return False; - } - - /* - * allocate - */ - - cli = cli_use_get(srv_name, usr_creds); - cli->cli->redirect = redir; - - if (resolve_srv_name(srv_name, dest_host, &ip)) - { - dest_ip = &ip; - } - else - { - cli_use_free(cli); - return NULL; - } - - make_nmb_name(&called , dns_to_netbios_name(dest_host ), 32, scope); - make_nmb_name(&calling, dns_to_netbios_name(global_myname), 0, scope); - - /* - * connect - */ - - if (!cli_establish_connection(cli->cli, - dest_host, dest_ip, - &calling, &called, - "IPC$", "IPC", - False, True)) - { - DEBUG(0,("cli_net_use_add: connection failed\n")); - cli->cli = NULL; - cli_use_free(cli); - return NULL; - } - - cli->cli->ntlmssp_cli_flgs = 0x0; - - add_cli_to_array(&num_clis, &clis, cli); - cli->num_users++; - - return cli->cli; -} - -/**************************************************************************** -delete a client state -****************************************************************************/ -BOOL cli_net_use_del(const char* srv_name, - const struct ntuser_creds *usr_creds, - BOOL force_close, - BOOL *connection_closed) -{ - int i; - const char *sv_name = srv_name; - - DEBUG(10,("cli_net_use_del: %s. force close: %s\n", - srv_name, BOOLSTR(force_close))); - - if (strnequal("\\\\", sv_name, 2)) - { - sv_name = &sv_name[2]; - } - - if (connection_closed != NULL) - { - *connection_closed = False; - } - - for (i = 0; i < num_clis; i++) - { - char *cli_name = NULL; - - if (clis[i] == NULL) continue; - if (clis[i]->cli == NULL) continue; - - cli_name = clis[i]->cli->desthost; - if (strnequal("\\\\", cli_name, 2)) - { - cli_name = &cli_name[2]; - } - - if (!strequal(cli_name, sv_name)) continue; - - if (strequal(usr_creds->user_name, - clis[i]->cli->usr.user_name) && - strequal(usr_creds->domain, - clis[i]->cli->usr.domain)) - { - /* decrement number of users */ - clis[i]->num_users--; - - DEBUG(10,("idx: %i num_users now: %d\n", - i, clis[i]->num_users)); - - if (force_close || clis[i]->num_users == 0) - { - cli_use_free(clis[i]); - clis[i] = NULL; - if (connection_closed != NULL) - { - *connection_closed = True; - } - } - return True; - } - } - - return False; -} - -/**************************************************************************** -enumerate client states -****************************************************************************/ -void cli_net_use_enum(uint32 *num_cons, struct use_info ***use) -{ - int i; - - *num_cons = 0; - *use = NULL; - - for (i = 0; i < num_clis; i++) - { - struct use_info item; - - ZERO_STRUCT(item); - - if (clis[i] == NULL) continue; - - item.connected = clis[i]->cli != NULL ? True : False; - - if (item.connected) - { - item.srv_name = clis[i]->cli->desthost; - item.user_name = clis[i]->cli->usr.user_name; - item.domain = clis[i]->cli->usr.domain; - } - - add_use_info_to_array(num_cons, use, &item); - } -} - - -/**************************************************************************** -wait for keyboard activity, swallowing network packets on all client states. -****************************************************************************/ -void cli_use_wait_keyboard(void) -{ - fd_set fds; - struct timeval timeout; - - while (1) - { - int i; - int maxfd = fileno(stdin); - FD_ZERO(&fds); - FD_SET(fileno(stdin),&fds); - for (i = 0; i < num_clis; i++) - { - if (clis[i] != NULL && clis[i]->cli != NULL) - { - int fd = clis[i]->cli->fd; - FD_SET(fd,&fds); - maxfd = MAX(fd, maxfd); - } - } - - timeout.tv_sec = 20; - timeout.tv_usec = 0; - sys_select(maxfd+1,NULL, &fds,&timeout); - - if (FD_ISSET(fileno(stdin),&fds)) - return; - - /* We deliberately use receive_smb instead of - client_receive_smb as we want to receive - session keepalives and then drop them here. - */ - for (i = 0; i < num_clis; i++) - { - int fd = clis[i]->cli->fd; - if (FD_ISSET(fd,&fds)) - receive_smb(fd,clis[i]->cli->inbuf,0); - } - } -} diff --git a/source3/rpc_client/msrpc_lsarpc.c b/source3/rpc_client/msrpc_lsarpc.c deleted file mode 100644 index 83ecc94197..0000000000 --- a/source3/rpc_client/msrpc_lsarpc.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - NT Domain Authentication SMB / MSRPC client - Copyright (C) Andrew Tridgell 1994-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" -#include "nterr.h" - -extern int DEBUGLEVEL; - -#define DEBUG_TESTING - -/**************************************************************************** -nt lsa query secret -****************************************************************************/ -BOOL msrpc_lsa_query_secret(const char* srv_name, - const char* secret_name, - STRING2 *secret, - NTTIME *last_update) -{ - BOOL res = True; - BOOL res1; - BOOL res2; - - POLICY_HND pol_sec; - POLICY_HND lsa_pol; - - /* lookup domain controller; receive a policy handle */ - res = res ? lsa_open_policy2( srv_name, - &lsa_pol, False) : False; - - /* lookup domain controller; receive a policy handle */ - res1 = res ? lsa_open_secret( &lsa_pol, - secret_name, 0x02000000, &pol_sec) : False; - - res2 = res1 ? lsa_query_secret(&pol_sec, secret, last_update) : False; - - res1 = res1 ? lsa_close(&pol_sec) : False; - - res = res ? lsa_close(&lsa_pol) : False; - - return res2; -} diff --git a/source3/rpc_client/msrpc_samr.c b/source3/rpc_client/msrpc_samr.c deleted file mode 100644 index 621b218ad6..0000000000 --- a/source3/rpc_client/msrpc_samr.c +++ /dev/null @@ -1,1593 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - NT Domain Authentication SMB / MSRPC client - Copyright (C) Andrew Tridgell 1994-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" -#include "nterr.h" - -extern int DEBUGLEVEL; - -#define DEBUG_TESTING - -BOOL req_user_info( const POLICY_HND *pol_dom, - const char *domain, - const DOM_SID *sid, - uint32 user_rid, - USER_INFO_FN(usr_inf)) -{ - SAM_USER_INFO_21 usr; - /* send user info query, level 0x15 */ - if (get_samr_query_userinfo( - pol_dom, - 0x15, user_rid, &usr)) - { - if (usr_inf != NULL) - { - usr_inf(domain, sid, user_rid, &usr); - } - return True; - } - return False; -} - -/**************************************************************************** -SAM Query User Groups. -****************************************************************************/ -uint32 sam_query_usergroups( - const POLICY_HND *pol_dom, - const char *domain, - const DOM_SID *sid, - uint32 user_rid, - const char *user_name, - uint32 *num_groups, - DOM_GID **gid, - char ***name, - uint32 **type, - USER_MEM_FN(usr_mem)) -{ - uint32 num_names = 0; - (*gid) = NULL; - /* send user group query */ - if (get_samr_query_usergroups( - pol_dom, - user_rid, num_groups, gid) && - gid != NULL) - { - uint32 i; - uint32 *rid_mem; - - rid_mem = (uint32*)malloc((*num_groups) * sizeof(rid_mem[0])); - - if (rid_mem == NULL) - { - free(*gid); - (*gid) = NULL; - return 0; - } - - for (i = 0; i < (*num_groups); i++) - { - rid_mem[i] = (*gid)[i].g_rid; - } - - if (samr_query_lookup_rids( - pol_dom, 0x3e8, - (*num_groups), rid_mem, - &num_names, name, type)) - { - usr_mem(domain, sid, - user_rid, user_name, - num_names, rid_mem, *name, *type); - } - } - - return num_names; -} - -static uint32 req_group_info( - const POLICY_HND *pol_dom, - const char *domain, const DOM_SID *sid, - uint32 user_rid, const char *user_name, - USER_MEM_FN(usr_mem)) -{ - uint32 num_groups; - uint32 num_names; - DOM_GID *gid = NULL; - char **name = NULL; - uint32 *type = NULL; - - num_names = sam_query_usergroups( pol_dom, - domain, sid, - user_rid, user_name, - &num_groups, &gid, - &name, &type, usr_mem); - - free_char_array(num_names, name); - if (type != NULL) - { - free(type); - } - - if (gid != NULL) - { - free(gid); - } - - return num_names; -} - -static void req_alias_info( - const POLICY_HND *pol_dom, - const char *domain, - const DOM_SID *sid1, uint32 user_rid, - const char *user_name, - USER_MEM_FN(usr_mem)) -{ - uint32 num_aliases; - uint32 *rid_mem = NULL; - uint32 *ptr_sid; - DOM_SID2 *als_sid; - - if (pol_dom == NULL) - { - return; - } - - ptr_sid = (uint32*) malloc(sizeof(ptr_sid[0]) * 1); - als_sid = (DOM_SID2*)malloc(sizeof(als_sid[0]) * 1); - - sid_copy(&als_sid[0].sid, sid1); - sid_append_rid(&als_sid[0].sid, user_rid); - als_sid[0].num_auths = als_sid[0].sid.num_auths; - - ptr_sid[0] = 1; - - /* send user alias query */ - if (samr_query_useraliases( - pol_dom, - ptr_sid, als_sid, &num_aliases, &rid_mem)) - { - uint32 num_names; - char **name = NULL; - uint32 *type = NULL; - - uint32 *rid_copy = (uint32*)malloc(num_aliases * sizeof(*rid_copy)); - - if (rid_copy != NULL) - { - uint32 i; - for (i = 0; i < num_aliases; i++) - { - rid_copy[i] = rid_mem[i]; - } - if (samr_query_lookup_rids( - pol_dom, 0x3e8, - num_aliases, rid_copy, - &num_names, &name, &type)) - { - usr_mem(domain, sid1, - user_rid, user_name, - num_names, rid_mem, name, type); - } - } - - free_char_array(num_names, name); - if (type != NULL) - { - free(type); - } - } - - if (rid_mem != NULL) - { - free(rid_mem); - rid_mem = NULL; - } - - if (ptr_sid != NULL) - { - free(ptr_sid); - ptr_sid = NULL; - } - if (als_sid != NULL) - { - free(als_sid); - als_sid = NULL; - } -} - -/**************************************************************************** -experimental SAM user display info. -****************************************************************************/ -void msrpc_sam_user( const POLICY_HND *pol_dom, const POLICY_HND *pol_blt, - const char* domain, - const DOM_SID *sid1, - const DOM_SID *blt_sid1, - uint32 user_rid, - char *user_name, - USER_FN(usr_fn), - USER_INFO_FN(usr_inf_fn), - USER_MEM_FN(usr_grp_fn), - USER_MEM_FN(usr_als_fn)) -{ - if (usr_fn != NULL) - { - usr_fn(domain, sid1, user_rid, user_name); - } - - if (usr_inf_fn != NULL) - { - req_user_info(pol_dom, - domain, sid1, - user_rid, - usr_inf_fn); - } - - if (usr_grp_fn != NULL) - { - req_group_info(pol_dom, - domain, sid1, - user_rid, user_name, - usr_grp_fn); - } - - if (usr_als_fn != NULL) - { - req_alias_info(pol_dom, - domain, sid1, - user_rid, user_name, - usr_als_fn); - req_alias_info(pol_blt, - domain, blt_sid1, - user_rid, user_name, - usr_als_fn); - } -} - -/**************************************************************************** -experimental SAM user query. -****************************************************************************/ -BOOL msrpc_sam_query_user( const char* srv_name, - const char* domain, - const DOM_SID *sid, - char *user_name, - USER_FN(usr_fn), - USER_INFO_FN(usr_inf_fn), - USER_MEM_FN(usr_grp_fn), - USER_MEM_FN(usr_als_fn)) -{ - BOOL res = True; - BOOL res1 = True; - - char *names[1]; - uint32 num_rids; - uint32 rid[MAX_LOOKUP_SIDS]; - uint32 type[MAX_LOOKUP_SIDS]; - POLICY_HND sam_pol; - POLICY_HND pol_dom; - - /* establish a connection. */ - res = res ? samr_connect( srv_name, 0x02000000, &sam_pol) : False; - - /* connect to the domain */ - res = res ? samr_open_domain( &sam_pol, 0x304, sid, &pol_dom) : False; - - /* look up user rid */ - names[0] = user_name; - res1 = res ? samr_query_lookup_names( &pol_dom, 0x3e8, - 1, names, - &num_rids, rid, type) : False; - - /* send user info query */ - if (res1 && num_rids == 1) - { - msrpc_sam_user( &pol_dom, NULL, - domain, - sid, NULL, - rid[0], - names[0], - usr_fn, usr_inf_fn, - usr_grp_fn, usr_als_fn); - } - else - { - res1 = False; - } - - res = res ? samr_close( &sam_pol) : False; - res = res ? samr_close( &pol_dom) : False; - - return res1; -} - -/**************************************************************************** -experimental SAM users enum. -****************************************************************************/ -int msrpc_sam_enum_users( const char* srv_name, - const char* domain, - const DOM_SID *sid1, - struct acct_info **sam, - uint32 *num_sam_entries, - USER_FN(usr_fn), - USER_INFO_FN(usr_inf_fn), - USER_MEM_FN(usr_grp_fn), - USER_MEM_FN(usr_als_fn)) -{ - DOM_SID sid_1_5_20; - uint32 user_idx; - BOOL res = True; - BOOL res1 = True; - BOOL res2 = True; - uint32 start_idx = 0x0; - uint16 unk_0 = 0x0; - uint16 acb_mask = 0; - uint16 unk_1 = 0x0; - uint32 ace_perms = 0x304; /* access control permissions */ - uint32 status; - POLICY_HND sam_pol; - POLICY_HND pol_dom; - POLICY_HND pol_blt; - - (*sam) = NULL; - (*num_sam_entries) = 0; - - string_to_sid(&sid_1_5_20, "S-1-5-32"); - - DEBUG(5,("Number of entries:%d unk_0:%04x acb_mask:%04x unk_1:%04x\n", - start_idx, unk_0, acb_mask, unk_1)); - - /* establish a connection. */ - res = res ? samr_connect( srv_name, 0x02000000, - &sam_pol) : False; - - /* connect to the domain */ - res1 = res ? samr_open_domain( &sam_pol, ace_perms, sid1, - &pol_dom) : False; - - /* connect to the S-1-5-20 domain */ - res2 = res ? samr_open_domain( &sam_pol, ace_perms, &sid_1_5_20, - &pol_blt) : False; - - if (res1) - { - /* read some users */ - do - { - status = samr_enum_dom_users( - &pol_dom, - &start_idx, acb_mask, unk_1, 0x100000, - sam, num_sam_entries); - - } while (status == STATUS_MORE_ENTRIES); - -#if 0 - if ((*num_sam_entries) == 0) - { - report(out_hnd, "No users\n"); - } -#endif - - /* query all the users */ - for (user_idx = 0; res && user_idx < - (*num_sam_entries); user_idx++) - { - uint32 user_rid = (*sam)[user_idx].rid; - char *user_name = (*sam)[user_idx].acct_name; - - msrpc_sam_user( &pol_dom, &pol_blt, - domain, - sid1, &sid_1_5_20, - user_rid, user_name, - usr_fn, usr_inf_fn, - usr_grp_fn, usr_als_fn); - } - } - - res2 = res2 ? samr_close( &pol_blt) : False; - res1 = res1 ? samr_close( &pol_dom) : False; - res = res ? samr_close( &sam_pol) : False; - - if (res) - { - DEBUG(5,("msrpc_sam_enum_users: succeeded\n")); - } - else - { - DEBUG(5,("msrpc_sam_enum_users: failed\n")); - } - - return (*num_sam_entries); -} - - -/**************************************************************************** -experimental SAM domain info query. -****************************************************************************/ -BOOL sam_query_dominfo(const char* srv_name, - const DOM_SID *sid1, - uint32 switch_value, SAM_UNK_CTR *ctr) -{ - BOOL res = True; - BOOL res1 = True; - BOOL res2 = True; - uint32 ace_perms = 0x02000000; /* absolutely no idea. */ - POLICY_HND sam_pol; - POLICY_HND pol_dom; - - /* establish a connection. */ - res = res ? samr_connect( - srv_name, 0x02000000, - &sam_pol) : False; - - /* connect to the domain */ - res1 = res ? samr_open_domain( &sam_pol, ace_perms, sid1, - &pol_dom) : False; - - /* send a samr 0x8 command */ - res2 = res ? samr_query_dom_info( - &pol_dom, switch_value, ctr) : False; - - res1 = res1 ? samr_close( &sam_pol) : False; - - res = res ? samr_close( &pol_dom) : False; - - if (res2) - { - DEBUG(5,("sam_query_dominfo: succeeded\n")); - } - else - { - DEBUG(5,("sam_query_dominfo: failed\n")); - } - - return res2; -} - - -BOOL query_aliasinfo( - const POLICY_HND *pol_dom, - const char *domain, - const DOM_SID *sid, - uint32 alias_rid, - ALIAS_INFO_FN(grp_inf)) -{ - ALIAS_INFO_CTR ctr; - - /* send alias info query */ - if (get_samr_query_aliasinfo( - pol_dom, - 3, /* info level */ - alias_rid, &ctr)) - { - if (grp_inf != NULL) - { - grp_inf(domain, sid, alias_rid, &ctr); - } - return True; - } - return False; -} - -BOOL sam_query_aliasmem(const char *srv_name, - const POLICY_HND *pol_dom, - uint32 alias_rid, - uint32 *num_names, - DOM_SID ***sids, - char ***name, - uint8 **type) -{ - BOOL res3 = True; - BOOL res4 = True; - DOM_SID2 sid_mem[MAX_LOOKUP_SIDS]; - uint32 num_aliases = 0; - - *sids = NULL; - *num_names = 0; - *name = NULL; - *type = NULL; - - /* get alias members */ - res3 = get_samr_query_aliasmem( - pol_dom, - alias_rid, &num_aliases, sid_mem); - - if (res3 && num_aliases != 0) - { - POLICY_HND lsa_pol; - - uint32 i; - uint32 numsids = 0; - - for (i = 0; i < num_aliases; i++) - { - add_sid_to_array(&numsids, sids, &sid_mem[i].sid); - } - - /* lookup domain controller; receive a policy handle */ - res3 = res3 ? lsa_open_policy( srv_name, - &lsa_pol, True) : False; - - /* send lsa lookup sids call */ - res4 = res3 ? lsa_lookup_sids( &lsa_pol, - num_aliases, *sids, - name, type, num_names) : False; - - res3 = res3 ? lsa_close(&lsa_pol) : False; - } - - if (!res4) - { - free_char_array(*num_names, *name); - if ((*type) != NULL) - { - free(*type); - } - if ((*sids) != NULL) - { - free_sid_array(num_aliases, *sids); - } - *num_names = 0; - *name = NULL; - *type = NULL; - *sids = NULL; - } - - return res4; -} - -BOOL req_aliasmem_info(const char* srv_name, - const POLICY_HND *pol_dom, - const char *domain, - const DOM_SID *sid, - uint32 alias_rid, - const char *alias_name, - ALIAS_MEM_FN(als_mem)) -{ - uint32 num_names = 0; - char **name = NULL; - uint8 *type = NULL; - DOM_SID **sids = NULL; - - if (sam_query_aliasmem( srv_name, pol_dom, alias_rid, - &num_names, &sids, - &name, &type)) - { - als_mem(domain, sid, - alias_rid, alias_name, - num_names, sids, name, type); - - free_char_array(num_names, name); - if (type != NULL) - { - free(type); - } - if (sids != NULL) - { - free_sid_array(num_names, sids); - } - return True; - } - return False; -} - -BOOL sam_query_groupmem( - const POLICY_HND *pol_dom, - uint32 group_rid, - uint32 *num_names, - uint32 **rid_mem, - char ***name, - uint32 **type) -{ - uint32 num_mem; - uint32 *attr_mem = NULL; - BOOL res3; - - *rid_mem = NULL; - *num_names = 0; - *name = NULL; - *type = NULL; - - /* get group members */ - res3 = get_samr_query_groupmem( - pol_dom, - group_rid, &num_mem, rid_mem, &attr_mem); - - if (res3 && num_mem != 0) - { - uint32 *rid_copy = (uint32*)malloc(num_mem * - sizeof(rid_copy[0])); - - if (rid_copy != NULL) - { - uint32 i; - for (i = 0; i < num_mem; i++) - { - rid_copy[i] = (*rid_mem)[i]; - } - /* resolve names */ - res3 = samr_query_lookup_rids( - pol_dom, 1000, - num_mem, rid_copy, num_names, name, type); - } - } - else - { - if (attr_mem != NULL) - { - free(attr_mem); - } - if ((*rid_mem) != NULL) - { - free(*rid_mem); - } - attr_mem = NULL; - *rid_mem = NULL; - } - - if (!res3) - { - free_char_array(*num_names, *name); - if ((*type) != NULL) - { - free(*type); - } - *num_names = 0; - *name = NULL; - *type = NULL; - } - - if (attr_mem != NULL) - { - free(attr_mem); - } - - return res3; -} - -BOOL query_groupinfo( const POLICY_HND *pol_dom, - const char *domain, - const DOM_SID *sid, - uint32 group_rid, - GROUP_INFO_FN(grp_inf)) -{ - GROUP_INFO_CTR ctr; - - /* send group info query */ - if (get_samr_query_groupinfo( - pol_dom, - 1, /* info level */ - group_rid, &ctr)) - { - if (grp_inf != NULL) - { - grp_inf(domain, sid, group_rid, &ctr); - } - return True; - } - return False; -} - -BOOL req_groupmem_info( const POLICY_HND *pol_dom, - const char *domain, - const DOM_SID *sid, - uint32 group_rid, - const char *group_name, - GROUP_MEM_FN(grp_mem)) -{ - uint32 num_names = 0; - char **name = NULL; - uint32 *type = NULL; - uint32 *rid_mem = NULL; - - if (sam_query_groupmem(pol_dom, group_rid, - &num_names, &rid_mem, &name, &type)) - { - grp_mem(domain, sid, - group_rid, group_name, - num_names, rid_mem, name, type); - - free_char_array(num_names, name); - if (type != NULL) - { - free(type); - } - if (rid_mem != NULL) - { - free(rid_mem); - } - return True; - } - return False; -} - -/**************************************************************************** -SAM Domains query. - DOMAIN_INFO_FN(dom_inf_fn), - DOMAIN_MEM_FN(dom_mem_fn)) -****************************************************************************/ -uint32 msrpc_sam_enum_domains( const char* srv_name, - struct acct_info **sam, - uint32 *num_sam_entries, - DOMAIN_FN(dom_fn), - DOMAIN_INFO_FN(dom_inf_fn)) -{ - BOOL res = True; - uint32 ace_perms = 0x02000000; /* access control permissions. */ - POLICY_HND sam_pol; - uint32 status; - - /* establish a connection. */ - res = res ? samr_connect( srv_name, ace_perms, - &sam_pol) : False; - - (*sam) = NULL; - (*num_sam_entries) = 0; - - if (res) - { - uint32 domain_idx; - uint32 start_idx = 0; - /* read some domains */ - do - { - status = samr_enum_domains( &sam_pol, - &start_idx, 0x10000, - sam, num_sam_entries); - - } while (status == STATUS_MORE_ENTRIES); - -#if 0 - if ((*num_sam_entries) == 0) - { - report(out_hnd, "No domains\n"); - } -#endif - - for (domain_idx = 0; domain_idx < (*num_sam_entries); domain_idx++) - { - char *domain_name = (*sam)[domain_idx].acct_name; - - if (dom_fn != NULL) - { - dom_fn(domain_name); - } - - if (dom_inf_fn != NULL) - { - uint32 switch_value = 2; - SAM_UNK_CTR ctr; - DOM_SID dom_sid; - /* connect to the domain */ - if (samr_query_lookup_domain( &sam_pol, - domain_name, - &dom_sid) && - sam_query_dominfo(srv_name, &dom_sid, - switch_value, &ctr)) - { - dom_inf_fn(domain_name, &dom_sid, - switch_value, &ctr); - } - } - } - } - - res = res ? samr_close(&sam_pol) : False; - - if (res) - { - DEBUG(5,("msrpc_sam_enum_domains: succeeded\n")); - } - else - { - DEBUG(5,("msrpc_sam_enum_domains: failed\n")); - } - return (*num_sam_entries); -} - -/**************************************************************************** -SAM groups query. -****************************************************************************/ -uint32 msrpc_sam_enum_groups( const char* srv_name, - const char* domain, - const DOM_SID *sid1, - struct acct_info **sam, - uint32 *num_sam_entries, - GROUP_FN(grp_fn), - GROUP_INFO_FN(grp_inf_fn), - GROUP_MEM_FN(grp_mem_fn)) -{ - BOOL res = True; - uint32 ace_perms = 0x02000000; /* access control permissions. */ - POLICY_HND sam_pol; - POLICY_HND pol_dom; - uint32 status; - - /* establish a connection. */ - res = res ? samr_connect( srv_name, 0x02000000, - &sam_pol) : False; - - /* connect to the domain */ - res = res ? samr_open_domain( &sam_pol, ace_perms, sid1, - &pol_dom) : False; - - (*sam) = NULL; - (*num_sam_entries) = 0; - - if (res) - { - uint32 group_idx; - uint32 start_idx = 0; - /* read some groups */ - do - { - status = samr_enum_dom_groups( - &pol_dom, - &start_idx, 0x100000, - sam, num_sam_entries); - - } while (status == STATUS_MORE_ENTRIES); - -#if 0 - if ((*num_sam_entries) == 0) - { - report(out_hnd, "No groups\n"); - } -#endif - - for (group_idx = 0; group_idx < (*num_sam_entries); group_idx++) - { - uint32 group_rid = (*sam)[group_idx].rid; - char *group_name = (*sam)[group_idx].acct_name; - - if (grp_fn != NULL) - { - grp_fn(domain, sid1, group_rid, group_name); - } - - if (grp_inf_fn != NULL) - { - query_groupinfo(&pol_dom, - domain, sid1, - group_rid, - grp_inf_fn); - } - if (grp_mem_fn != NULL) - { - req_groupmem_info(&pol_dom, - domain, sid1, - group_rid, group_name, - grp_mem_fn); - } - } - } - - res = res ? samr_close(&pol_dom) : False; - res = res ? samr_close(&sam_pol) : False; - - if (res) - { - DEBUG(5,("msrpc_sam_enum_groups: succeeded\n")); - } - else - { - DEBUG(5,("msrpc_sam_enum_groups: failed\n")); - } - return (*num_sam_entries); -} - -/**************************************************************************** -SAM aliases query. -****************************************************************************/ -uint32 msrpc_sam_enum_aliases( const char* srv_name, - const char* domain, - const DOM_SID *sid1, - struct acct_info **sam, - uint32 *num_sam_entries, - ALIAS_FN(als_fn), - ALIAS_INFO_FN(als_inf_fn), - ALIAS_MEM_FN(als_mem_fn)) -{ - BOOL res = True; - uint32 ace_perms = 0x02000000; /* access control permissions */ - POLICY_HND sam_pol; - POLICY_HND pol_dom; - uint32 status = 0x0; - - /* establish a connection. */ - res = res ? samr_connect( srv_name, 0x02000000, - &sam_pol) : False; - - /* connect to the domain */ - res = res ? samr_open_domain( - &sam_pol, ace_perms, sid1, - &pol_dom) : False; - - (*sam) = NULL; - (*num_sam_entries) = 0; - - if (res) - { - uint32 alias_idx; - uint32 start_idx = 0; - /* read some groups */ - do - { - status = samr_enum_dom_aliases( - &pol_dom, - &start_idx, 0x100000, - sam, num_sam_entries); - - } while (status == STATUS_MORE_ENTRIES); - -#if 0 - if ((*num_sam_entries) == 0) - { - report(out_hnd, "No aliases\n"); - } -#endif - - for (alias_idx = 0; alias_idx < (*num_sam_entries); alias_idx++) - { - uint32 alias_rid = (*sam)[alias_idx].rid; - char *alias_name = (*sam)[alias_idx].acct_name; - - if (als_fn != NULL) - { - als_fn(domain, sid1, alias_rid, alias_name); - } - - if (als_inf_fn != NULL) - { - query_aliasinfo(&pol_dom, - domain, sid1, - alias_rid, - als_inf_fn); - } - if (als_mem_fn != NULL) - { - req_aliasmem_info(srv_name, &pol_dom, - domain, sid1, - alias_rid, alias_name, - als_mem_fn); - } - } - } - - res = res ? samr_close(&sam_pol) : False; - res = res ? samr_close(&pol_dom) : False; - - if (res) - { - DEBUG(5,("msrpc_sam_enum_aliases: succeeded\n")); - } - else - { - DEBUG(5,("msrpc_sam_enum_aliases: failed\n")); - } - - return (*num_sam_entries); -} - -/**************************************************************************** -do a SAMR create domain user -****************************************************************************/ -BOOL create_samr_domain_user( POLICY_HND *pol_dom, - char *acct_name, uint16 acb_info, - const char* password, int plen, - uint32 *rid) -{ - POLICY_HND pol_open_user; - BOOL ret = True; - BOOL res1 = True; - char pwbuf[516]; - SAM_USER_INFO_24 *p24; - SAM_USER_INFO_16 *p16; - SAM_USER_INFO_16 usr16; - - if (pol_dom == NULL || acct_name == NULL) return False; - - /* send create user */ - ret = samr_create_dom_user( pol_dom, - acct_name, acb_info, 0xe005000b, - &pol_open_user, rid); - - if (ret == 0x0) - { - samr_close(&pol_open_user); - } - - if (ret != 0 && ret != (NT_STATUS_USER_EXISTS | 0xC0000000)) - { - return False; - } - - if (ret == (NT_STATUS_USER_EXISTS | 0xC0000000)) - { - uint32 num_rids; - char *names[1]; - uint32 type[1]; - - names[0] = acct_name; - res1 = samr_query_lookup_names( pol_dom, 0x3e8, - 1, names, - &num_rids, rid, type); - if (res1 == False || type[0] != SID_NAME_USER) - { - return False; - } - } - - DEBUG(5,("create_samr_domain_user: name: %s rid 0x%x\n", - acct_name, *rid)); - - if (IS_BITS_SET_SOME(acb_info, ACB_NORMAL | ACB_DOMTRUST) && - password == NULL) - { - return True; - } - - encode_pw_buffer(pwbuf, password, plen, False); - - p24 = (SAM_USER_INFO_24*)malloc(sizeof(SAM_USER_INFO_24)); - if (p24 == NULL) - { - return False; - } - - make_sam_user_info24(p24, pwbuf, plen); - - res1 = set_samr_set_userinfo( pol_dom, 0x18, *rid, (void*)p24); - - if (res1 == False) - { - return False; - } - - /* send set user info */ - res1 = get_samr_query_userinfo( pol_dom, 0x10, *rid, (void*)&usr16); - - if (res1 == False) - { - return False; - } - - if (usr16.acb_info != acb_info) - { - p16 = (SAM_USER_INFO_16 *) malloc(sizeof(SAM_USER_INFO_16)); - if (p16 == NULL) - { - return False; - } - p16->acb_info = usr16.acb_info; - - res1 = set_samr_set_userinfo2( pol_dom, 0x10, *rid, (void*)p16); - } - - return res1; -} - -/**************************************************************************** -do a SAMR create domain alias -****************************************************************************/ -BOOL create_samr_domain_alias( POLICY_HND *pol_open_domain, - const char *acct_name, const char *acct_desc, - uint32 *rid) -{ - POLICY_HND pol_open_alias; - ALIAS_INFO_CTR ctr; - BOOL ret = True; - - if (pol_open_domain == NULL || acct_name == NULL || acct_desc == NULL) return False; - - /* send create alias */ - if (!samr_create_dom_alias( - pol_open_domain, - acct_name, - &pol_open_alias, rid)) - { - return False; - } - - DEBUG(5,("create_samr_domain_alias: name: %s rid 0x%x\n", - acct_name, *rid)); - - ctr.switch_value1 = 3; - make_samr_alias_info3(&ctr.alias.info3, acct_desc); - - /* send set alias info */ - if (!samr_set_aliasinfo( - &pol_open_alias, - &ctr)) - { - DEBUG(5,("create_samr_domain_alias: error in samr_set_aliasinfo\n")); - ret = False; - } - - return samr_close(&pol_open_alias) && ret; -} - -/**************************************************************************** -do a SAMR create domain group -****************************************************************************/ -BOOL create_samr_domain_group( - POLICY_HND *pol_open_domain, - const char *acct_name, const char *acct_desc, - uint32 *rid) -{ - POLICY_HND pol_open_group; - GROUP_INFO_CTR ctr; - BOOL ret = True; - - if (pol_open_domain == NULL || acct_name == NULL || acct_desc == NULL) return False; - - /* send create group*/ - if (!samr_create_dom_group( - pol_open_domain, - acct_name, - &pol_open_group, rid)) - { - return False; - } - - DEBUG(5,("create_samr_domain_group: name: %s rid 0x%x\n", - acct_name, *rid)); - - ctr.switch_value1 = 4; - ctr.switch_value2 = 4; - make_samr_group_info4(&ctr.group.info4, acct_desc); - - /* send user groups query */ - if (!samr_set_groupinfo( - &pol_open_group, - &ctr)) - { - DEBUG(5,("create_samr_domain_group: error in samr_set_groupinfo\n")); - ret = False; - } - - return samr_close(&pol_open_group) && ret; -} - -/**************************************************************************** -do a SAMR query user groups -****************************************************************************/ -BOOL get_samr_query_usergroups( const POLICY_HND *pol_open_domain, - uint32 user_rid, - uint32 *num_groups, DOM_GID **gid) -{ - POLICY_HND pol_open_user; - BOOL ret = True; - - if (pol_open_domain == NULL || num_groups == NULL || gid == NULL) return False; - - /* send open domain (on user sid) */ - if (!samr_open_user( - pol_open_domain, - 0x02011b, user_rid, - &pol_open_user)) - { - return False; - } - - /* send user groups query */ - if (!samr_query_usergroups( - &pol_open_user, - num_groups, gid)) - { - DEBUG(5,("samr_query_usergroups: error in query user groups\n")); - ret = False; - } - - return samr_close(&pol_open_user) && ret; -} - -/**************************************************************************** -do a SAMR delete group -****************************************************************************/ -BOOL delete_samr_dom_group( - POLICY_HND *pol_open_domain, - uint32 group_rid) -{ - POLICY_HND pol_open_group; - - if (pol_open_domain == NULL) return False; - - /* send open domain (on group rid) */ - if (!samr_open_group(pol_open_domain, - 0x00000010, group_rid, - &pol_open_group)) - { - return False; - } - - /* send group delete */ - if (!samr_delete_dom_group(&pol_open_group)) - - { - DEBUG(5,("delete_samr_dom_group: error in delete domain group\n")); - samr_close(&pol_open_group); - return False; - } - - return True; -} - - -/**************************************************************************** -do a SAMR query group members -****************************************************************************/ -BOOL get_samr_query_groupmem( - const POLICY_HND *pol_open_domain, - uint32 group_rid, uint32 *num_mem, - uint32 **rid, uint32 **attr) -{ - POLICY_HND pol_open_group; - BOOL ret = True; - - if (pol_open_domain == NULL || num_mem == NULL || rid == NULL || attr == NULL) return False; - - /* send open domain (on group sid) */ - if (!samr_open_group( pol_open_domain, - 0x00000010, group_rid, - &pol_open_group)) - { - return False; - } - - /* send group info query */ - if (!samr_query_groupmem(&pol_open_group, num_mem, rid, attr)) - - { - DEBUG(5,("samr_query_group: error in query group members\n")); - ret = False; - } - - return samr_close(&pol_open_group) && ret; -} - -/**************************************************************************** -do a SAMR delete alias -****************************************************************************/ -BOOL delete_samr_dom_alias( - POLICY_HND *pol_open_domain, - uint32 alias_rid) -{ - POLICY_HND pol_open_alias; - - if (pol_open_domain == NULL) return False; - - /* send open domain (on alias rid) */ - if (!samr_open_alias(pol_open_domain, - 0x000f001f, alias_rid, &pol_open_alias)) - { - return False; - } - - /* send alias delete */ - if (!samr_delete_dom_alias(&pol_open_alias)) - - { - DEBUG(5,("delete_samr_dom_alias: error in delete domain alias\n")); - samr_close(&pol_open_alias); - return False; - } - - return True; -} - - -/**************************************************************************** -do a SAMR query alias members -****************************************************************************/ -BOOL get_samr_query_aliasmem( - const POLICY_HND *pol_open_domain, - uint32 alias_rid, uint32 *num_mem, DOM_SID2 *sid) -{ - POLICY_HND pol_open_alias; - BOOL ret = True; - - if (pol_open_domain == NULL || num_mem == NULL || sid == NULL) return False; - - /* send open domain (on alias sid) */ - if (!samr_open_alias( pol_open_domain, - 0x000f001f, alias_rid, - &pol_open_alias)) - { - return False; - } - - /* send alias info query */ - if (!samr_query_aliasmem( &pol_open_alias, num_mem, sid)) - - { - DEBUG(5,("samr_query_alias: error in query alias members\n")); - ret = False; - } - - return samr_close(&pol_open_alias) && ret; -} - -/**************************************************************************** -do a SAMR set user info -****************************************************************************/ -BOOL set_samr_set_userinfo2( - POLICY_HND *pol_open_domain, - uint32 info_level, - uint32 user_rid, void *usr) -{ - POLICY_HND pol_open_user; - BOOL ret = True; - - if (pol_open_domain == NULL || usr == NULL) return False; - - /* send open domain (on user sid) */ - if (!samr_open_user( - pol_open_domain, - 0x000601b4, user_rid, - &pol_open_user)) - { - return False; - } - - /* send user info query */ - if (!samr_set_userinfo2( - &pol_open_user, - info_level, usr)) - { - DEBUG(5,("samr_set_userinfo: error in query user info, level 0x%x\n", - info_level)); - ret = False; - } - - return samr_close(&pol_open_user) && ret; -} - -/**************************************************************************** -do a SAMR set user info -****************************************************************************/ -BOOL set_samr_set_userinfo( - POLICY_HND *pol_open_domain, - uint32 info_level, - uint32 user_rid, void *usr) -{ - POLICY_HND pol_open_user; - BOOL ret = True; - - if (pol_open_domain == NULL || usr == NULL) return False; - - /* send open domain (on user sid) */ - if (!samr_open_user( - pol_open_domain, - 0x000601b4, user_rid, - &pol_open_user)) - { - return False; - } - - /* send user info query */ - if (!samr_set_userinfo( - &pol_open_user, - info_level, usr)) - { - DEBUG(5,("samr_set_userinfo: error in query user info, level 0x%x\n", - info_level)); - ret = False; - } - - return samr_close(&pol_open_user) && ret; -} - -/**************************************************************************** -do a SAMR query user info -****************************************************************************/ -BOOL get_samr_query_userinfo( - const POLICY_HND *pol_open_domain, - uint32 info_level, - uint32 user_rid, void *usr) -{ - POLICY_HND pol_open_user; - BOOL ret = True; - - if (pol_open_domain == NULL || usr == NULL) return False; - - /* send open domain (on user sid) */ - if (!samr_open_user( - pol_open_domain, - 0x02011b, user_rid, - &pol_open_user)) - { - return False; - } - - /* send user info query */ - if (!samr_query_userinfo( - &pol_open_user, - info_level, usr)) - { - DEBUG(5,("samr_query_userinfo: error in query user info, level 0x%x\n", - info_level)); - ret = False; - } - - return samr_close(&pol_open_user) && ret; -} - -/**************************************************************************** -do a SAMR query group info -****************************************************************************/ -BOOL get_samr_query_groupinfo( - const POLICY_HND *pol_open_domain, - uint32 info_level, - uint32 group_rid, GROUP_INFO_CTR *ctr) -{ - POLICY_HND pol_open_group; - BOOL ret = True; - - if (pol_open_domain == NULL || ctr == NULL) return False; - - bzero(ctr, sizeof(*ctr)); - - /* send open domain (on group sid) */ - if (!samr_open_group( - pol_open_domain, - 0x02000000, group_rid, &pol_open_group)) - { - return False; - } - - /* send group info query */ - if (!samr_query_groupinfo( - &pol_open_group, - info_level, ctr)) - { - DEBUG(5,("samr_query_groupinfo: error in query group info, level 0x%x\n", - info_level)); - ret = False; - } - - return samr_close(&pol_open_group) && ret; -} - -/**************************************************************************** -do a SAMR query alias info -****************************************************************************/ -BOOL get_samr_query_aliasinfo( - const POLICY_HND *pol_open_domain, - uint32 info_level, - uint32 alias_rid, ALIAS_INFO_CTR *ctr) -{ - POLICY_HND pol_open_alias; - BOOL ret = True; - - if (pol_open_domain == NULL || ctr == NULL) return False; - - bzero(ctr, sizeof(*ctr)); - - /* send open domain (on alias sid) */ - if (!samr_open_alias( - pol_open_domain, - 0x02000000, alias_rid, &pol_open_alias)) - { - return False; - } - - /* send alias info query */ - if (!samr_query_aliasinfo( - &pol_open_alias, - info_level, ctr)) - { - DEBUG(5,("samr_query_aliasinfo: error in query alias info, level 0x%x\n", - info_level)); - ret = False; - } - - return samr_close(&pol_open_alias) && ret; -} - -/**************************************************************************** -SAM create domain user. -****************************************************************************/ -BOOL msrpc_sam_create_dom_user(const char* srv_name, DOM_SID *sid1, - char *acct_name, uint16 acb_info, - const char *password, int plen, - uint32 *rid) -{ - BOOL res = True; - BOOL res1 = True; - BOOL res2 = True; - uint32 ace_perms = 0x02000000; /* absolutely no idea. */ - uint32 user_rid; - POLICY_HND sam_pol; - POLICY_HND pol_dom; - - /* establish a connection. */ - res = res ? samr_connect( - srv_name, 0x02000000, - &sam_pol) : False; - - /* connect to the domain */ - res1 = res ? samr_open_domain( - &sam_pol, ace_perms, sid1, - &pol_dom) : False; - - /* create a domain user */ - res2 = res1 ? create_samr_domain_user( &pol_dom, - acct_name, - acb_info, password, plen, &user_rid) : False; - - res1 = res1 ? samr_close( &pol_dom) : False; - res = res ? samr_close( &sam_pol) : False; - - if (res2) - { - DEBUG(5,("msrpc_sam_create_dom_user: succeeded\n")); - } - else - { - DEBUG(5,("msrpc_sam_create_dom_user: failed\n")); - } - - return res2; -} - -/**************************************************************************** -experimental SAM query display info. -****************************************************************************/ -BOOL msrpc_sam_query_dispinfo(const char* srv_name, const char* domain, - DOM_SID *sid1, - uint16 switch_value, - uint32 *num_entries, SAM_DISPINFO_CTR *ctr, - DISP_FN(disp_fn)) -{ - BOOL res = True; - BOOL res1 = True; - uint32 ace_perms = 0x304; /* absolutely no idea. */ - POLICY_HND sam_pol; - POLICY_HND pol_dom; - - /* establish a connection. */ - res = res ? samr_connect( srv_name, 0x02000000, &sam_pol) : False; - - /* connect to the domain */ - res = res ? samr_open_domain( &sam_pol, ace_perms, sid1, - &pol_dom) : False; - - /* send a samr query_disp_info command */ - res1 = res ? samr_query_dispinfo( &pol_dom, switch_value, - num_entries, ctr) : False; - - res = res ? samr_close(&sam_pol) : False; - res = res ? samr_close(&pol_dom) : False; - - if (res1 && disp_fn != NULL) - { - disp_fn(domain, sid1, switch_value, *num_entries, ctr); - } - - return res1; -} - diff --git a/source3/rpc_parse/parse_at.c b/source3/rpc_parse/parse_at.c deleted file mode 100644 index a03a8cfad9..0000000000 --- a/source3/rpc_parse/parse_at.c +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 2.1. - * RPC parsing routines: scheduler service - * Copyright (C) Matthew Chapman 1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * Copyright (C) Andrew Tridgell 1992-1999. - * - * 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" - -extern int DEBUGLEVEL; - -/******************************************************************* - make_at_q_add_job - ********************************************************************/ -BOOL make_at_q_add_job(AT_Q_ADD_JOB *q_a, char *server, - AT_JOB_INFO *info, char *command) -{ - DEBUG(5,("make_at_q_add_job\n")); - - make_buf_unistr2(&(q_a->uni_srv_name), &(q_a->ptr_srv_name), server); - memcpy(&(q_a->info), info, sizeof(q_a->info)); - make_unistr2(&(q_a->command), command, strlen(command)+1); - - return True; -} - -/******************************************************************* -reads or writes a AT_JOB_INFO structure. -********************************************************************/ -BOOL at_io_job_info(char *desc, AT_JOB_INFO *info, prs_struct *ps, int depth) -{ - if (info == NULL) return False; - - prs_debug(ps, depth, desc, "at_io_job_info"); - depth++; - - prs_align(ps); - - prs_uint32("time", ps, depth, &(info->time)); - prs_uint32("monthdays", ps, depth, &(info->monthdays)); - prs_uint8("weekdays", ps, depth, &(info->weekdays)); - prs_uint8("flags", ps, depth, &(info->flags)); - prs_align(ps); - - prs_uint32("ptr_command", ps, depth, &(info->ptr_command)); - - return True; -} - -/******************************************************************* -reads or writes a AT_Q_ADD_JOB structure. -********************************************************************/ -BOOL at_io_q_add_job(char *desc, AT_Q_ADD_JOB *q_a, prs_struct *ps, int depth) -{ - if (q_a == NULL) return False; - - prs_debug(ps, depth, desc, "at_q_add_job"); - depth++; - - prs_align(ps); - prs_uint32("ptr_srv_name", ps, depth, &(q_a->ptr_srv_name)); - smb_io_unistr2("", &(q_a->uni_srv_name), q_a->ptr_srv_name, ps, depth); - at_io_job_info("", &(q_a->info), ps, depth); - smb_io_unistr2("", &(q_a->command), q_a->info.ptr_command, ps, depth); - - return True; -} - -/******************************************************************* -reads or writes a AT_R_ADD_JOB structure. -********************************************************************/ -BOOL at_io_r_add_job(char *desc, AT_R_ADD_JOB *r_a, prs_struct *ps, int depth) -{ - if (r_a == NULL) return False; - - prs_debug(ps, depth, desc, "at_r_add_job"); - depth++; - - prs_align(ps); - prs_uint32("jobid", ps, depth, &(r_a->jobid)); - prs_uint32("status", ps, depth, &(r_a->status)); - - return True; -} - -/******************************************************************* - make_at_q_del_job - ********************************************************************/ -BOOL make_at_q_del_job(AT_Q_DEL_JOB *q_a, char *server, uint32 min_jobid, - uint32 max_jobid) -{ - DEBUG(5,("make_at_q_del_job\n")); - - make_buf_unistr2(&(q_a->uni_srv_name), &(q_a->ptr_srv_name), server); - q_a->min_jobid = min_jobid; - q_a->max_jobid = max_jobid; - - return True; -} - -/******************************************************************* -reads or writes a AT_Q_DEL_JOB structure. -********************************************************************/ -BOOL at_io_q_del_job(char *desc, AT_Q_DEL_JOB *q_d, prs_struct *ps, int depth) -{ - if (q_d == NULL) return False; - - prs_debug(ps, depth, desc, "at_q_del_job"); - depth++; - - prs_align(ps); - - prs_uint32("ptr_srv_name", ps, depth, &(q_d->ptr_srv_name)); - smb_io_unistr2("", &(q_d->uni_srv_name), q_d->ptr_srv_name, ps, depth); - prs_align(ps); - prs_uint32("min_jobid", ps, depth, &(q_d->min_jobid)); - prs_uint32("max_jobid", ps, depth, &(q_d->max_jobid)); - - return True; -} - -/******************************************************************* -reads or writes a AT_R_DEL_JOB structure. -********************************************************************/ -BOOL at_io_r_del_job(char *desc, AT_R_DEL_JOB *r_d, prs_struct *ps, int depth) -{ - if (r_d == NULL) return False; - - prs_debug(ps, depth, desc, "at_r_del_job"); - depth++; - - prs_align(ps); - prs_uint32("status", ps, depth, &(r_d->status)); - - return True; -} - -/******************************************************************* - make_at_q_enum_jobs - ********************************************************************/ -BOOL make_at_q_enum_jobs(AT_Q_ENUM_JOBS *q_e, char *server) -{ - DEBUG(5,("make_at_q_enum_jobs\n")); - - make_buf_unistr2(&(q_e->uni_srv_name), &(q_e->ptr_srv_name), server); - q_e->unknown0 = 0; - q_e->unknown1 = 0; - q_e->max_len = 0xffff; - q_e->ptr_resume = 1; - q_e->hnd_resume = 0; - - return True; -} - -/******************************************************************* -reads or writes a AT_Q_ENUM_JOBS structure. -********************************************************************/ -BOOL at_io_q_enum_jobs(char *desc, AT_Q_ENUM_JOBS *q_e, prs_struct *ps, int depth) -{ - if (q_e == NULL) return False; - - prs_debug(ps, depth, desc, "at_q_enum_jobs"); - depth++; - - prs_align(ps); - prs_uint32("ptr_srv_name", ps, depth, &(q_e->ptr_srv_name)); - smb_io_unistr2("", &(q_e->uni_srv_name), q_e->ptr_srv_name, ps, depth); - prs_align(ps); - prs_uint32("unknown0", ps, depth, &(q_e->unknown0)); - prs_uint32("unknown1", ps, depth, &(q_e->unknown1)); - prs_uint32("max_len" , ps, depth, &(q_e->max_len )); - - prs_uint32("ptr_resume", ps, depth, &(q_e->ptr_resume)); - prs_uint32("hnd_resume", ps, depth, &(q_e->hnd_resume)); - - return True; -} - -/******************************************************************* -reads or writes a AT_R_ENUM_JOBS structure. -********************************************************************/ -BOOL at_io_r_enum_jobs(char *desc, AT_R_ENUM_JOBS *r_e, prs_struct *ps, int depth) -{ - if (r_e == NULL) return False; - - prs_debug(ps, depth, desc, "at_r_enum_jobs"); - depth++; - - prs_align(ps); - prs_uint32("num_entries", ps, depth, &(r_e->num_entries)); - prs_uint32("ptr_entries", ps, depth, &(r_e->ptr_entries)); - - if (r_e->ptr_entries != 0) - { - int i; - - prs_uint32("num_entries2", ps, depth, &(r_e->num_entries2)); - if (r_e->num_entries2 != r_e->num_entries) - { - /* RPC fault */ - return False; - } - - SMB_ASSERT_ARRAY(r_e->info, r_e->num_entries2); - - for (i = 0; i < r_e->num_entries2; i++) - { - prs_uint32("jobid", ps, depth, &(r_e->info[i].jobid)); - at_io_job_info("", &(r_e->info[i].info), ps, depth); - } - - for (i = 0; i < r_e->num_entries2; i++) - { - smb_io_unistr2("", &(r_e->command[i]), - r_e->info[i].info.ptr_command, ps, depth); - } - } - - prs_align(ps); - prs_uint32("total_entries", ps, depth, &(r_e->total_entries)); - prs_uint32("ptr_resume" , ps, depth, &(r_e->ptr_resume )); - prs_uint32("hnd_resume" , ps, depth, &(r_e->hnd_resume )); - - prs_uint32("status", ps, depth, &(r_e->status)); - - return True; -} - -/******************************************************************* - make_at_q_query_job - ********************************************************************/ -BOOL make_at_q_query_job(AT_Q_QUERY_JOB *q_q, char *server, uint32 jobid) -{ - DEBUG(5,("make_at_q_query_job\n")); - - make_buf_unistr2(&(q_q->uni_srv_name), &(q_q->ptr_srv_name), server); - q_q->jobid = jobid; - - return True; -} - -/******************************************************************* -reads or writes a AT_Q_QUERY_JOB structure. -********************************************************************/ -BOOL at_io_q_query_job(char *desc, AT_Q_QUERY_JOB *q_q, prs_struct *ps, int depth) -{ - if (q_q == NULL) return False; - - prs_debug(ps, depth, desc, "at_q_query_job"); - depth++; - - prs_align(ps); - prs_uint32("ptr_srv_name", ps, depth, &(q_q->ptr_srv_name)); - smb_io_unistr2("", &(q_q->uni_srv_name), q_q->ptr_srv_name, ps, depth); - prs_align(ps); - prs_uint32("jobid", ps, depth, &(q_q->jobid)); - - return True; -} - -/******************************************************************* -reads or writes a AT_R_QUERY_JOB structure. -********************************************************************/ -BOOL at_io_r_query_job(char *desc, AT_R_QUERY_JOB *r_q, prs_struct *ps, int depth) -{ - if (r_q == NULL) return False; - - prs_debug(ps, depth, desc, "at_r_query_job"); - depth++; - - prs_align(ps); - prs_uint32("ptr_info", ps, depth, &(r_q->ptr_info)); - if (r_q->ptr_info != 0) - { - at_io_job_info("", &(r_q->info), ps, depth); - smb_io_unistr2("", &(r_q->command), r_q->info.ptr_command, ps, depth); - } - - prs_align(ps); - prs_uint32("status", ps, depth, &(r_q->status)); - - return True; -} diff --git a/source3/rpc_parse/parse_brs.c b/source3/rpc_parse/parse_brs.c deleted file mode 100644 index 723866e9f9..0000000000 --- a/source3/rpc_parse/parse_brs.c +++ /dev/null @@ -1,180 +0,0 @@ - -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * Copyright (C) Paul Ashton 1997-1999. - * - * 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" - -extern int DEBUGLEVEL; - - -/******************************************************************* - make_brs_q_query_info - ********************************************************************/ -BOOL make_brs_q_query_info(BRS_Q_QUERY_INFO *q_u, - const char *server, uint16 switch_value) -{ - DEBUG(5,("make_brs_q_query_info\n")); - - make_buf_unistr2(&(q_u->uni_srv_name), &(q_u->ptr_srv_name), server); - q_u->switch_value1 = switch_value; - q_u->switch_value2 = switch_value; - - q_u->ptr = 1; - q_u->pad1 = 0x0; - q_u->pad2 = 0x0; - - return True; -} - -/******************************************************************* -reads or writes a BRS_Q_QUERY_INFO structure. -********************************************************************/ -BOOL brs_io_q_query_info(char *desc, BRS_Q_QUERY_INFO *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "brs_io_q_query_info"); - depth++; - - prs_align(ps); - - prs_uint32("ptr_srv_name", ps, depth, &(q_u->ptr_srv_name)); - smb_io_unistr2("", &(q_u->uni_srv_name), q_u->ptr_srv_name, ps, depth); - prs_align(ps); - - prs_uint16("switch_value1", ps, depth, &(q_u->switch_value1)); - prs_align(ps); - - prs_uint16("switch_value2", ps, depth, &(q_u->switch_value2)); - prs_align(ps); - - prs_uint32("ptr", ps, depth, &(q_u->ptr)); - if (q_u->ptr) - { - prs_uint32("pad1", ps, depth, &(q_u->pad1)); - } - - prs_uint32("pad2", ps, depth, &(q_u->pad2)); - - return True; -} - -/******************************************************************* - brs_info_100 - ********************************************************************/ -BOOL make_brs_info_100(BRS_INFO_100 *inf) -{ - DEBUG(5,("BRS_INFO_100: %d\n", __LINE__)); - - inf->pad1 = 0x0; - inf->ptr2 = 0x1; - inf->pad2 = 0x0; - inf->pad3 = 0x0; - - return True; -} - -/******************************************************************* -reads or writes a BRS_INFO_100 structure. -********************************************************************/ -static BOOL brs_io_brs_info_100(char *desc, BRS_INFO_100 *inf, prs_struct *ps, int depth) -{ - if (inf == NULL) return False; - - prs_debug(ps, depth, desc, "brs_io_brs_info_100"); - depth++; - - prs_align(ps); - - prs_uint32("pad1", ps, depth, &(inf->pad1)); - prs_uint32("ptr2", ps, depth, &(inf->ptr2)); - prs_uint32("pad2", ps, depth, &(inf->pad2)); - prs_uint32("pad3", ps, depth, &(inf->pad3)); - - return True; -} - -/******************************************************************* - make_brs_r_query_info - - only supports info level 100 at the moment. - - ********************************************************************/ -BOOL make_brs_r_query_info(BRS_R_QUERY_INFO *r_u, - uint32 switch_value, void *inf, - int status) -{ - DEBUG(5,("make_brs_r_unknown_0: %d\n", __LINE__)); - - r_u->switch_value1 = switch_value; /* same as in request */ - r_u->switch_value2 = switch_value; /* same as in request */ - - r_u->ptr_1 = inf != NULL ? 1 : 0; /* pointer 1 */ - r_u->info.id = inf; - - r_u->status = status; - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL brs_io_r_query_info(char *desc, BRS_R_QUERY_INFO *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "brs_io_r_query_info"); - depth++; - - prs_align(ps); - - prs_uint16("switch_value1", ps, depth, &(r_u->switch_value1)); - prs_align(ps); - - prs_uint16("switch_value2", ps, depth, &(r_u->switch_value2)); - prs_align(ps); - - prs_uint32("ptr_1 ", ps, depth, &(r_u->ptr_1)); - if (r_u->ptr_1 != 0x0) - { - switch (r_u->switch_value1) - { - case 100: - { - brs_io_brs_info_100("inf", r_u->info.brs100, ps, depth); - break; - } - default: - { - break; - } - } - } - - prs_uint32("status ", ps, depth, &(r_u->status)); - - return True; -} - diff --git a/source3/rpc_parse/parse_creds.c b/source3/rpc_parse/parse_creds.c deleted file mode 100644 index c661d5a3c6..0000000000 --- a/source3/rpc_parse/parse_creds.c +++ /dev/null @@ -1,563 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tgrpsgell 1992-1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * Copyright (C) Paul Ashton 1997-1999. - * - * 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, Cambgrpsge, MA 02139, USA. - */ - - -#include "includes.h" - -extern int DEBUGLEVEL; - - -/******************************************************************* -makes a CREDS_UNIX structure. -********************************************************************/ -BOOL make_creds_unix(CREDS_UNIX *r_u, const char* user_name, - const char* requested_name, - const char* real_name, - BOOL guest) -{ - if (r_u == NULL) return False; - - DEBUG(5,("make_creds_unix\n")); - - fstrcpy(r_u->user_name , user_name); - fstrcpy(r_u->requested_name, requested_name); - fstrcpy(r_u->real_name , real_name); - r_u->guest = guest; - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL creds_io_unix(char *desc, CREDS_UNIX *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "creds_io_unix"); - depth++; - - prs_align(ps); - prs_string("user_name", ps, depth, r_u->user_name, strlen(r_u->user_name), sizeof(r_u->user_name)); - prs_align(ps); - prs_string("requested_name", ps, depth, r_u->requested_name, strlen(r_u->requested_name), sizeof(r_u->requested_name)); - prs_align(ps); - prs_string("real_name", ps, depth, r_u->real_name, strlen(r_u->real_name), sizeof(r_u->real_name)); - prs_align(ps); - prs_uint32("guest", ps, depth, &(r_u->guest)); - return True; -} - - -/******************************************************************* -frees a structure. -********************************************************************/ -void creds_free_unix(CREDS_UNIX *r_u) -{ -} - -/******************************************************************* -makes a CREDS_UNIX_SEC structure. -********************************************************************/ -BOOL make_creds_unix_sec(CREDS_UNIX_SEC *r_u, - uint32 uid, uint32 gid, uint32 num_grps, gid_t *grps) -{ - int i; - if (r_u == NULL) return False; - - DEBUG(5,("make_creds_unix_sec\n")); - - r_u->uid = uid; - r_u->gid = gid; - r_u->num_grps = num_grps; - r_u->grps = (uint32*)Realloc(NULL, sizeof(r_u->grps[0]) * - r_u->num_grps); - if (r_u->grps == NULL && num_grps != 0) - { - return False; - } - for (i = 0; i < num_grps; i++) - { - r_u->grps[i] = (gid_t)grps[i]; - } - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL creds_io_unix_sec(char *desc, CREDS_UNIX_SEC *r_u, prs_struct *ps, int depth) -{ - uint32 i; - - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "creds_io_unix_sec"); - depth++; - - prs_align(ps); - - prs_uint32("uid", ps, depth, &(r_u->uid)); - prs_uint32("gid", ps, depth, &(r_u->gid)); - prs_uint32("num_grps", ps, depth, &(r_u->num_grps)); - if (r_u->num_grps != 0) - { - r_u->grps = (uint32*)Realloc(r_u->grps, - sizeof(r_u->grps[0]) * - r_u->num_grps); - if (r_u->grps == NULL) - { - creds_free_unix_sec(r_u); - return False; - } - } - for (i = 0; i < r_u->num_grps; i++) - { - prs_uint32("", ps, depth, &(r_u->grps[i])); - } - return True; -} - - -/******************************************************************* -frees a structure. -********************************************************************/ -void creds_free_unix_sec(CREDS_UNIX_SEC *r_u) -{ - if (r_u->grps != NULL) - { - free(r_u->grps); - r_u->grps = NULL; - } -} - -/******************************************************************* -makes a CREDS_NT_SEC structure. -********************************************************************/ -BOOL make_creds_nt_sec(CREDS_NT_SEC *r_u, - DOM_SID *sid, uint32 num_grps, uint32 *grps) -{ - int i; - if (r_u == NULL) return False; - - DEBUG(5,("make_creds_unix_sec\n")); - - sid_copy(&r_u->sid, sid); - r_u->num_grps = num_grps; - r_u->grp_rids = (uint32*)Realloc(NULL, sizeof(r_u->grp_rids[0]) * - r_u->num_grps); - - if (r_u->grp_rids == NULL && num_grps != 0) - { - return False; - } - for (i = 0; i < num_grps; i++) - { - r_u->grp_rids[i] = grps[i]; - } - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL creds_io_nt_sec(char *desc, CREDS_NT_SEC *r_u, prs_struct *ps, int depth) -{ - int i; - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "creds_io_nt"); - depth++; - - prs_align(ps); - - smb_io_dom_sid ("sid", &r_u->sid, ps, depth); - prs_align(ps); - - prs_uint32("num_grps", ps, depth, &(r_u->num_grps)); - if (r_u->num_grps != 0) - { - r_u->grp_rids = (uint32*)Realloc(r_u->grp_rids, - sizeof(r_u->grp_rids[0]) * - r_u->num_grps); - if (r_u->grp_rids == NULL) - { - creds_free_nt_sec(r_u); - return False; - } - } - for (i = 0; i < r_u->num_grps; i++) - { - prs_uint32("", ps, depth, &(r_u->grp_rids[i])); - } - - return True; -} - -/******************************************************************* -frees a structure. -********************************************************************/ -void creds_free_nt_sec(CREDS_NT_SEC *r_u) -{ - if (r_u->grp_rids != NULL) - { - free(r_u->grp_rids); - r_u->grp_rids = NULL; - } -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL creds_io_pwd_info(char *desc, struct pwd_info *pwd, prs_struct *ps, int depth) -{ - if (pwd == NULL) return False; - - prs_debug(ps, depth, desc, "creds_io_pwd_info"); - depth++; - - prs_align(ps); - - prs_uint32("nullpwd", ps, depth, &(pwd->null_pwd)); - if (pwd->null_pwd) - { - return True; - } - - prs_uint32("cleartext", ps, depth, &(pwd->cleartext)); - if (pwd->cleartext) - { - prs_string("password", ps, depth, pwd->password, strlen(pwd->password), sizeof(pwd->password)); - prs_align(ps); - return True; - } - prs_uint32("crypted", ps, depth, &(pwd->crypted)); - - prs_uint8s(False, "smb_lm_pwd", ps, depth, (char*)&pwd->smb_lm_pwd, sizeof(pwd->smb_lm_pwd)); - prs_align(ps); - prs_uint8s(False, "smb_nt_pwd", ps, depth, (char*)&pwd->smb_nt_pwd, sizeof(pwd->smb_nt_pwd)); - prs_align(ps); - - prs_uint8s(False, "smb_lm_owf", ps, depth, (char*)&pwd->smb_lm_owf, sizeof(pwd->smb_lm_owf)); - prs_align(ps); - prs_uint32("nt_owf_len", ps, depth, &(pwd->nt_owf_len)); - if (pwd->nt_owf_len > sizeof(pwd->smb_nt_owf)) - { - return False; - } - prs_uint8s(False, "smb_nt_owf", ps, depth, (char*)&pwd->smb_nt_owf, pwd->nt_owf_len); - prs_align(ps); - - prs_uint8s(False, "lm_cli_chal", ps, depth, (char*)&pwd->lm_cli_chal, sizeof(pwd->lm_cli_chal)); - prs_align(ps); - prs_uint32("nt_cli_chal_len", ps, depth, &(pwd->nt_cli_chal_len)); - - if (pwd->nt_cli_chal_len > sizeof(pwd->nt_cli_chal)) - { - return False; - } - prs_uint8s(False, "nt_cli_chal", ps, depth, (char*)&pwd->nt_cli_chal, pwd->nt_cli_chal_len); - prs_align(ps); - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL creds_io_nt(char *desc, CREDS_NT *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "creds_io_nt"); - depth++; - - prs_align(ps); - - /* lkclXXXX CHEAT!!!!!!!! */ - prs_string("user_name", ps, depth, r_u->user_name, strlen(r_u->user_name), sizeof(r_u->user_name)); - prs_align(ps); - prs_string("domain", ps, depth, r_u->domain, strlen(r_u->domain), sizeof(r_u->domain)); - prs_align(ps); - - creds_io_pwd_info("pwd", &r_u->pwd, ps, depth); - prs_align(ps); - - prs_uint32("ntlmssp", ps, depth, &(r_u->ntlmssp_flags)); - - return True; -} - -/******************************************************************* -frees a structure. -********************************************************************/ -void creds_free_nt(CREDS_NT *r_u) -{ -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL creds_io_hybrid(char *desc, CREDS_HYBRID *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "creds_io_hybrid"); - depth++; - - prs_align(ps); - - prs_uint32("reuse", ps, depth, &(r_u->reuse)); - prs_uint32("ptr_ntc", ps, depth, &(r_u->ptr_ntc)); - prs_uint32("ptr_uxc", ps, depth, &(r_u->ptr_uxc)); - prs_uint32("ptr_nts", ps, depth, &(r_u->ptr_nts)); - prs_uint32("ptr_uxs", ps, depth, &(r_u->ptr_uxs)); - if (r_u->ptr_ntc != 0) - { - if (!creds_io_nt ("ntc", &r_u->ntc, ps, depth)) return False; - } - if (r_u->ptr_uxc != 0) - { - if (!creds_io_unix("uxc", &r_u->uxc, ps, depth)) return False; - } - if (r_u->ptr_nts != 0) - { - if (!creds_io_nt_sec ("nts", &r_u->nts, ps, depth)) return False; - } - if (r_u->ptr_uxs != 0) - { - if (!creds_io_unix_sec("uxs", &r_u->uxs, ps, depth)) return False; - } - return True; -} - -void copy_unix_creds(CREDS_UNIX *to, const CREDS_UNIX *from) -{ - if (from == NULL) - { - to->user_name[0] = 0; - return; - } - fstrcpy(to->user_name, from->user_name); -}; - -void copy_nt_sec_creds(CREDS_NT_SEC *to, const CREDS_NT_SEC *from) -{ - if (from == NULL) - { - ZERO_STRUCTP(to); - return; - } - memcpy(&to, &from, sizeof(*from)); -}; - -void copy_unix_sec_creds(CREDS_UNIX_SEC *to, const CREDS_UNIX_SEC *from) -{ - if (from == NULL) - { - to->uid = -1; - to->gid = -1; - to->num_grps = 0; - to->grps = NULL; - return; - } - to->uid = from->uid; - to->gid = from->gid; - to->num_grps = 0; - to->grps = NULL; - - if (from->num_grps != 0) - { - size_t size = from->num_grps * sizeof(from->grps[0]); - to->grps = (uint32*)malloc(size); - if (to->grps == NULL) - { - return; - } - to->num_grps = from->num_grps; - memcpy(to->grps, from->grps, size); - } -}; - -void copy_nt_creds(struct ntuser_creds *to, - const struct ntuser_creds *from) -{ - if (from == NULL) - { - to->domain[0] = 0; - to->user_name[0] = 0; - pwd_set_nullpwd(&to->pwd); - to->ntlmssp_flags = 0; - - return; - } - safe_strcpy(to->domain , from->domain , sizeof(from->domain )-1); - safe_strcpy(to->user_name, from->user_name, sizeof(from->user_name)-1); - memcpy(&to->pwd, &from->pwd, sizeof(from->pwd)); - to->ntlmssp_flags = from->ntlmssp_flags; -}; - -void copy_user_creds(struct user_creds *to, - const struct user_creds *from) -{ - ZERO_STRUCTP(to); - if (from == NULL) - { - to->ptr_ntc = 0; - to->ptr_uxc = 0; - to->ptr_nts = 0; - to->ptr_uxs = 0; - copy_nt_creds(&to->ntc, NULL); - copy_unix_creds(&to->uxc, NULL); - copy_nt_sec_creds(&to->nts, NULL); - copy_unix_sec_creds(&to->uxs, NULL); - to->reuse = False; - return; - } - to->ptr_nts = from->ptr_nts; - to->ptr_uxs = from->ptr_uxs; - to->ptr_ntc = from->ptr_ntc; - to->ptr_uxc = from->ptr_uxc; - if (to->ptr_ntc != 0) - { - copy_nt_creds(&to->ntc, &from->ntc); - } - if (to->ptr_uxc != 0) - { - copy_unix_creds(&to->uxc, &from->uxc); - } - if (to->ptr_ntc != 0) - { - copy_nt_sec_creds(&to->nts, &from->nts); - } - if (to->ptr_uxc != 0) - { - copy_unix_sec_creds(&to->uxs, &from->uxs); - } - to->reuse = from->reuse; -}; - -void free_user_creds(struct user_creds *creds) -{ - creds_free_unix(&creds->uxc); - creds_free_nt (&creds->ntc); - creds_free_unix_sec(&creds->uxs); - creds_free_nt_sec (&creds->nts); -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL creds_io_cmd(char *desc, CREDS_CMD *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "creds_io_cmd"); - depth++; - - prs_align(ps); - - prs_uint16("version", ps, depth, &(r_u->version)); - prs_uint16("command", ps, depth, &(r_u->command)); - - prs_string("name ", ps, depth, r_u->name, strlen(r_u->name), sizeof(r_u->name)); - prs_align(ps); - - prs_uint32("ptr_creds", ps, depth, &(r_u->ptr_creds)); - if (r_u->ptr_creds != 0) - { - if (!creds_io_hybrid("creds", r_u->cred, ps, depth)) - { - return False; - } - } - - - return True; -} - - -BOOL create_ntuser_creds( prs_struct *ps, - const char* name, - uint16 version, uint16 command, - const struct ntuser_creds *ntu, - BOOL reuse) -{ - CREDS_CMD cmd; - struct user_creds usr; - - ZERO_STRUCT(cmd); - ZERO_STRUCT(usr); - - DEBUG(10,("create_user_creds: %s %d %d\n", - name, version, command)); - - usr.reuse = reuse; - - fstrcpy(cmd.name, name); - cmd.version = version; - cmd.command = command; - cmd.ptr_creds = ntu != NULL ? 1 : 0; - cmd.cred = &usr; - - if (ntu != NULL) - { - copy_nt_creds(&usr.ntc, ntu); - usr.ptr_ntc = 1; - } - else - { - usr.ptr_ntc = 0; - } - - prs_init(ps, 1024, 4, 0, False); - - ps->offset = 4; - return creds_io_cmd("creds", &cmd, ps, 0); -} - -BOOL create_user_creds( prs_struct *ps, - const char* name, - uint16 version, uint16 command, - const struct user_creds *usr) -{ - CREDS_CMD cmd; - - ZERO_STRUCT(cmd); - - DEBUG(10,("create_user_creds: %s %d %d\n", - name, version, command)); - - fstrcpy(cmd.name, name); - cmd.version = version; - cmd.command = command; - cmd.ptr_creds = usr != NULL ? 1 : 0; - cmd.cred = usr; - - prs_init(ps, 1024, 4, 0, False); - - ps->offset = 4; - return creds_io_cmd("creds", &cmd, ps, 0); -} diff --git a/source3/rpc_parse/parse_eventlog.c b/source3/rpc_parse/parse_eventlog.c deleted file mode 100644 index 0b49ed5da7..0000000000 --- a/source3/rpc_parse/parse_eventlog.c +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * Copyright (C) Jean François Micouleau 1998-1999. - * - * 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" - -extern int DEBUGLEVEL; - -/******************************************************************* -********************************************************************/ -BOOL make_eventlog_q_open(EVENTLOG_Q_OPEN *q_u, const char *journal, char *unk) -{ - int len_journal = journal != NULL ? strlen(journal) : 0; - int len_unk = unk != NULL ? strlen(unk) : 0; - - q_u->ptr0=0x1; - q_u->unk0=0x5c; - q_u->unk1=0x01; - - make_uni_hdr(&(q_u->hdr_source), len_journal); - make_unistr2(&(q_u->uni_source), journal, len_journal); - - make_uni_hdr(&(q_u->hdr_unk), len_unk); - make_unistr2(&(q_u->uni_unk), unk, len_unk); - - q_u->unk6=0x01; - q_u->unk7=0x01; - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL eventlog_io_q_open(char *desc, EVENTLOG_Q_OPEN *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "eventlog_io_q_open"); - depth++; - - prs_align(ps); - - prs_uint32("ptr0", ps, depth, &(q_u->ptr0)); - - prs_uint16("unk0", ps, depth, &(q_u->unk0)); - prs_uint16("unk1", ps, depth, &(q_u->unk1)); - - smb_io_unihdr("hdr_source", &(q_u->hdr_source), ps, depth); - smb_io_unistr2("uni_source", &(q_u->uni_source), - q_u->hdr_source.buffer, ps, depth); - prs_align(ps); - - smb_io_unihdr("hdr_unk", &(q_u->hdr_unk), ps, depth); - smb_io_unistr2("uni_unk", &(q_u->uni_unk), - q_u->hdr_unk.buffer, ps, depth); - prs_align(ps); - - prs_uint32("unk6", ps, depth, &(q_u->unk6)); - prs_uint32("unk7", ps, depth, &(q_u->unk7)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL eventlog_io_r_open(char *desc, EVENTLOG_R_OPEN *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "eventlog_io_r_open"); - depth++; - - prs_align(ps); - smb_io_pol_hnd("", &(r_u->pol), ps, depth); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL make_eventlog_q_close(EVENTLOG_Q_CLOSE *q_u, POLICY_HND *pol) -{ - memcpy(&(q_u->pol.data), pol->data, sizeof(q_u->pol.data)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL eventlog_io_q_close(char *desc, EVENTLOG_Q_CLOSE *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "eventlog_io_q_close"); - depth++; - - prs_align(ps); - smb_io_pol_hnd("", &(q_u->pol), ps, depth); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL eventlog_io_r_close(char *desc, EVENTLOG_R_CLOSE *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "eventlog_io_r_close"); - depth++; - - prs_align(ps); - smb_io_pol_hnd("", &(r_u->pol), ps, depth); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL make_eventlog_q_numofeventlogrec(EVENTLOG_Q_NUMOFEVENTLOGREC *q_u, POLICY_HND *pol) -{ - memcpy(&(q_u->pol.data), pol->data, sizeof(q_u->pol.data)); - - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL eventlog_io_q_numofeventlogrec(char *desc,EVENTLOG_Q_NUMOFEVENTLOGREC *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "eventlog_io_q_numofeventlogrec"); - depth++; - - prs_align(ps); - smb_io_pol_hnd("", &(q_u->pol), ps, depth); - - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL eventlog_io_r_numofeventlogrec(char *desc, EVENTLOG_R_NUMOFEVENTLOGREC *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "eventlog_io_r_numofeventlogrec"); - depth++; - - prs_align(ps); - prs_uint32("number", ps, depth, &(r_u->number)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL make_eventlog_q_readeventlog(EVENTLOG_Q_READEVENTLOG *q_u, POLICY_HND *pol, - uint32 flags, uint32 offset, uint32 number_of_bytes) -{ - memcpy(&(q_u->pol.data), pol->data, sizeof(q_u->pol.data)); - q_u->flags=flags; - q_u->offset=offset; - q_u->number_of_bytes=number_of_bytes; - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL eventlog_io_q_readeventlog(char *desc, EVENTLOG_Q_READEVENTLOG *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "eventlog_io_q_readeventlog"); - depth++; - - prs_align(ps); - smb_io_pol_hnd("", &(q_u->pol), ps, depth); - prs_uint32("flags", ps, depth, &(q_u->flags)); - prs_uint32("offset", ps, depth, &(q_u->offset)); - prs_uint32("number_of_bytes", ps, depth, &(q_u->number_of_bytes)); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL eventlog_io_eventlog(char *desc, EVENTLOGRECORD *ev, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "eventlog_io_eventlog"); - depth++; - - prs_align(ps); - prs_uint32("size", ps, depth, &(ev->size)); - prs_uint32("reserved", ps, depth, &(ev->reserved)); - prs_uint32("recordnumber", ps, depth, &(ev->recordnumber)); - prs_uint32("creationtime", ps, depth, &(ev->creationtime)); - prs_uint32("writetime", ps, depth, &(ev->writetime)); - prs_uint32("eventnumber", ps, depth, &(ev->eventnumber)); - - prs_uint16("eventtype", ps, depth, &(ev->eventtype)); - prs_uint16("num_of_strings", ps, depth, &(ev->num_of_strings)); - prs_uint16("category", ps, depth, &(ev->category)); - prs_uint16("reserved_flag", ps, depth, &(ev->reserved_flag)); - - prs_uint32("closingrecord", ps, depth, &(ev->closingrecord)); - prs_uint32("stringoffset", ps, depth, &(ev->stringoffset)); - prs_uint32("sid_length", ps, depth, &(ev->sid_length)); - prs_uint32("sid_offset", ps, depth, &(ev->sid_offset)); - prs_uint32("data_length", ps, depth, &(ev->data_length)); - prs_uint32("data_offset", ps, depth, &(ev->data_offset)); - - smb_io_unistr("", &(ev->sourcename), ps, depth); - smb_io_unistr("", &(ev->computername), ps, depth); - - if (ev->sid_length!=0) - smb_io_unistr("", &(ev->sid), ps, depth); - - if (ev->num_of_strings!=0) - smb_io_unistr("", &(ev->strings),ps, depth); - - if (ev->data_length) - smb_io_unistr("", &(ev->data), ps, depth); - - prs_uint32("size2", ps, depth, &(ev->size2)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL eventlog_io_r_readeventlog(char *desc, EVENTLOG_R_READEVENTLOG *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "eventlog_io_r_readeventlog"); - depth++; - - prs_align(ps); - prs_uint32("number_of_bytes", ps, depth, &(r_u->number_of_bytes)); - - if (r_u->number_of_bytes!= 0) - eventlog_io_eventlog("", r_u->event, ps, depth); - - prs_uint32("sent_size", ps, depth, &(r_u->sent_size)); - prs_uint32("real_size", ps, depth, &(r_u->real_size)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c deleted file mode 100644 index 5cb6179936..0000000000 --- a/source3/rpc_parse/parse_spoolss.c +++ /dev/null @@ -1,4408 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1998, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1998, - * Copyright (C) Jean François Micouleau 1998. - * - * 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 "nterr.h" - -extern int DEBUGLEVEL; - - -/******************************************************************* -return the length of a UNISTR string. -********************************************************************/ -static uint32 str_len_uni(UNISTR *source) -{ - uint32 i=0; - - while (source->buffer[i]!=0x0000) - { - i++; - } - return i; -} - -/******************************************************************* -This should be moved in a more generic lib. -********************************************************************/ -static BOOL spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime) -{ - prs_uint16("year", ps, depth, &(systime->year)); - prs_uint16("month", ps, depth, &(systime->month)); - prs_uint16("dayofweek", ps, depth, &(systime->dayofweek)); - prs_uint16("day", ps, depth, &(systime->day)); - prs_uint16("hour", ps, depth, &(systime->hour)); - prs_uint16("minute", ps, depth, &(systime->minute)); - prs_uint16("second", ps, depth, &(systime->second)); - prs_uint16("milliseconds", ps, depth, &(systime->milliseconds)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime) -{ - systime->year=unixtime->tm_year+1900; - systime->month=unixtime->tm_mon+1; - systime->dayofweek=unixtime->tm_wday; - systime->day=unixtime->tm_mday; - systime->hour=unixtime->tm_hour; - systime->minute=unixtime->tm_min; - systime->second=unixtime->tm_sec; - systime->milliseconds=0; - - return True; -} - -/******************************************************************* -reads or writes an POLICY_HND structure. -********************************************************************/ -static BOOL smb_io_prt_hnd(char *desc, POLICY_HND *hnd, prs_struct *ps, int depth) -{ - if (hnd == NULL) return False; - - prs_debug(ps, depth, desc, "smb_io_prt_hnd"); - depth++; - - prs_align(ps); - - prs_uint8s (False, "data", ps, depth, hnd->data, POLICY_HND_SIZE); - - return True; -} - -/******************************************************************* -reads or writes an DOC_INFO structure. -********************************************************************/ -static BOOL smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth) -{ - if (info_1 == NULL) return False; - - prs_debug(ps, depth, desc, "smb_io_doc_info_1"); - depth++; - - prs_align(ps); - - prs_uint32("p_docname", ps, depth, &(info_1->p_docname)); - prs_uint32("p_outputfile", ps, depth, &(info_1->p_outputfile)); - prs_uint32("p_datatype", ps, depth, &(info_1->p_datatype)); - - smb_io_unistr2("", &(info_1->docname), info_1->p_docname, ps, depth); - smb_io_unistr2("", &(info_1->outputfile), info_1->p_outputfile, ps, depth); - smb_io_unistr2("", &(info_1->datatype), info_1->p_datatype, ps, depth); - - return True; -} - -/******************************************************************* -reads or writes an DOC_INFO structure. -********************************************************************/ -static BOOL smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth) -{ - uint32 useless_ptr=0; - - if (info == NULL) return False; - - prs_debug(ps, depth, desc, "smb_io_doc_info"); - depth++; - - prs_align(ps); - - prs_uint32("switch_value", ps, depth, &(info->switch_value)); - - prs_uint32("doc_info_X ptr", ps, depth, &(useless_ptr)); - - switch (info->switch_value) - { - case 1: - smb_io_doc_info_1("",&(info->doc_info_1), ps, depth); - break; - case 2: - /* - this is just a placeholder - - MSDN July 1998 says doc_info_2 is only on - Windows 95, and as Win95 doesn't do RPC to print - this case is nearly impossible - - Maybe one day with Windows for dishwasher 2037 ... - - */ - /* smb_io_doc_info_2("",&(info->doc_info_2), ps, depth); */ - break; - default: - DEBUG(0,("Something is obviously wrong somewhere !\n")); - break; - } - - return True; -} - -/******************************************************************* -reads or writes an DOC_INFO_CONTAINER structure. -********************************************************************/ -static BOOL smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth) -{ - if (cont == NULL) return False; - - prs_debug(ps, depth, desc, "smb_io_doc_info_container"); - depth++; - - prs_align(ps); - - prs_uint32("level", ps, depth, &(cont->level)); - - smb_io_doc_info("",&(cont->docinfo), ps, depth); - - return True; -} - -/******************************************************************* -reads or writes an NOTIFY OPTION TYPE structure. -********************************************************************/ -static BOOL smb_io_notify_option_type(char *desc, - SPOOL_NOTIFY_OPTION_TYPE *type, - prs_struct *ps, int depth) -{ - uint32 useless_ptr; - - prs_debug(ps, depth, desc, "smb_io_notify_option_type"); - depth++; - - prs_align(ps); - - prs_uint16("type", ps, depth, &(type->type)); - prs_uint16("reserved0", ps, depth, &(type->reserved0)); - prs_uint32("reserved1", ps, depth, &(type->reserved1)); - prs_uint32("reserved2", ps, depth, &(type->reserved2)); - prs_uint32("count", ps, depth, &(type->count)); - prs_uint32("useless ptr", ps, depth, &useless_ptr); - - - return True; -} - -/******************************************************************* -reads or writes an NOTIFY OPTION TYPE DATA. -********************************************************************/ -static BOOL smb_io_notify_option_type_data(char *desc, - SPOOL_NOTIFY_OPTION_TYPE *type, - prs_struct *ps, int depth) -{ - uint32 count; - int i; - - prs_debug(ps, depth, desc, "smb_io_notify_option_type_data"); - depth++; - - prs_align(ps); - - prs_uint32("count", ps, depth, &count); - - if (count != type->count) - { - DEBUG(4,("What a mess, count was %x now is %x !\n",type->count,count)); - type->count=count; - } - for(i=0;i<count;i++) - { - /* read the option type struct */ - prs_uint16("fields",ps,depth,&(type->fields[i])); - } - - return True; -} - -/******************************************************************* -reads or writes an NOTIFY OPTION structure. -********************************************************************/ -static BOOL smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option, - prs_struct *ps, int depth) -{ - uint32 useless_ptr; - int i; - - prs_debug(ps, depth, desc, "smb_io_notify_option"); - depth++; - - prs_align(ps); - - /* memory pointer to the struct */ - prs_uint32("useless ptr", ps, depth, &useless_ptr); - - prs_uint32("version", ps, depth, &(option->version)); - prs_uint32("reserved", ps, depth, &(option->reserved)); - prs_uint32("count", ps, depth, &(option->count)); - prs_uint32("useless ptr", ps, depth, &useless_ptr); - prs_uint32("count", ps, depth, &(option->count)); - - /* read the option type struct */ - for(i=0;i<option->count;i++) - { - smb_io_notify_option_type("",&(option->type[i]) ,ps, depth); - } - - /* now read the type associated with the option type struct */ - for(i=0;i<option->count;i++) - { - smb_io_notify_option_type_data("",&(option->type[i]) ,ps, depth); - } - - - return True; -} - - -/******************************************************************* -reads or writes an NOTIFY INFO DATA structure. -********************************************************************/ -static BOOL smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data, - prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - - uint32 how_many_words; - BOOL isvalue; - uint32 x; - - prs_debug(ps, depth, desc, "smb_io_notify_info_data"); - depth++; - - how_many_words=data->size; - if (how_many_words==POINTER) - { - how_many_words=TWO_VALUE; - } - - isvalue=data->enc_type; - - prs_align(ps); - prs_uint16("type", ps, depth, &(data->type)); - prs_uint16("field", ps, depth, &(data->field)); - /*prs_align(ps);*/ - - prs_uint32("how many words", ps, depth, &how_many_words); - prs_uint32("id", ps, depth, &(data->id)); - prs_uint32("how many words", ps, depth, &how_many_words); - /*prs_align(ps);*/ - - if (isvalue==True) - { - prs_uint32("value[0]", ps, depth, &(data->notify_data.value[0])); - prs_uint32("value[1]", ps, depth, &(data->notify_data.value[1])); - /*prs_align(ps);*/ - } - else - { - /* it's a string */ - /* length in ascii including \0 */ - x=2*(data->notify_data.data.length+1); - prs_uint32("string length", ps, depth, &x ); - prs_uint32("pointer", ps, depth, &useless_ptr); - /*prs_align(ps);*/ - } - - return True; -} - -/******************************************************************* -reads or writes an NOTIFY INFO DATA structure. -********************************************************************/ -BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data, - prs_struct *ps, int depth) -{ - uint32 x; - BOOL isvalue; - - prs_debug(ps, depth, desc, "smb_io_notify_info_data"); - depth++; - - prs_align(ps); - isvalue=data->enc_type; - - if (isvalue==False) - { - /* length of string in unicode include \0 */ - x=data->notify_data.data.length+1; - prs_uint32("string length", ps, depth, &x ); - prs_uint16s(True,"string",ps,depth,data->notify_data.data.string,x); - } - prs_align(ps); - - return True; -} - -/******************************************************************* -reads or writes an NOTIFY INFO structure. -********************************************************************/ -static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, - prs_struct *ps, int depth) -{ - uint32 useless_ptr=0x0001; - int i; - - info->version=0x02; - prs_debug(ps, depth, desc, "smb_io_notify_info"); - depth++; - - prs_align(ps); - - prs_uint32("pointer", ps, depth, &useless_ptr); - prs_uint32("count", ps, depth, &(info->count)); - prs_uint32("version", ps, depth, &(info->version)); - prs_uint32("flags", ps, depth, &(info->flags)); - prs_uint32("count", ps, depth, &(info->count)); - - for (i=0;i<info->count;i++) - { - smb_io_notify_info_data(desc, &(info->data[i]), ps, depth); - } - - /* now do the strings at the end of the stream */ - for (i=0;i<info->count;i++) - { - smb_io_notify_info_data_strings(desc, &(info->data[i]), - ps, depth); - } - - return True; -} - -/******************************************************************* - * write a structure. - * called from static spoolss_r_open_printer_ex (srv_spoolss.c) - * called from spoolss_open_printer_ex (cli_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex"); - depth++; - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(r_u->handle),ps,depth); - -/* prs_align(ps);*/ - - prs_uint32("status code", ps, depth, &(r_u->status)); - - - return True; -} - -/******************************************************************* - * make a structure. - ********************************************************************/ -BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, - const char *printername, - uint32 cbbuf, uint32 devmod, uint32 des_access, - const char *station, - const char *username) -{ - int len_name = printername != NULL ? strlen(printername) : 0; - int len_sta = station != NULL ? strlen(station ) : 0; - int len_user = username != NULL ? strlen(username ) : 0; - - if (q_u == NULL) return False; - - DEBUG(5,("make_spoolss_io_q_open_printer_ex\n")); - - q_u->ptr = 1; - make_unistr2(&(q_u->printername), printername, len_name); - - q_u->unknown0 = 0x0; /* 0x0000 0000 */ - q_u->cbbuf = cbbuf; /* 0x0000 0000 */ - q_u->devmod = devmod; /* 0x0000 0000 */ - q_u->access_required = des_access; - - q_u->unknown1 = 0x1; - q_u->unknown2 = 0x1; - q_u->unknown3 = 0x149f7d8; /* looks like a pointer */ - q_u->unknown4 = 0x1c; - q_u->unknown5 = 0x00b94dd0; - q_u->unknown6 = 0x0149f5cc; /* looks like _another_ pointer */ - q_u->unknown7 = 0x00000565; - q_u->unknown8 = 0x2; - q_u->unknown9 = 0x0; - q_u->unknown10 = 0x0; - - make_unistr2(&(q_u->station), station, len_sta); - make_unistr2(&(q_u->username), username, len_user); - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_q_open_printer_ex (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex"); - depth++; - - prs_align(ps); - - prs_uint32("ptr", ps, depth, &(q_u->ptr)); - smb_io_unistr2("", &(q_u->printername),True,ps,depth); - - prs_align(ps); - - prs_uint32("unknown0", ps, depth, &(q_u->unknown0)); - prs_uint32("cbbuf", ps, depth, &(q_u->cbbuf)); - prs_uint32("devmod", ps, depth, &(q_u->devmod)); - prs_uint32("access required", ps, depth, &(q_u->access_required)); - - /* don't care to decode end of packet by now */ - /* but when acl will be implemented, it will be useful */ - - prs_uint32("unknown1", ps, depth, &(q_u->unknown1)); - prs_uint32("unknown2", ps, depth, &(q_u->unknown2)); - prs_uint32("unknown3", ps, depth, &(q_u->unknown3)); - prs_uint32("unknown4", ps, depth, &(q_u->unknown4)); - prs_uint32("unknown5", ps, depth, &(q_u->unknown5)); - prs_uint32("unknown6", ps, depth, &(q_u->unknown6)); - prs_uint32("unknown7", ps, depth, &(q_u->unknown7)); - prs_uint32("unknown8", ps, depth, &(q_u->unknown8)); - prs_uint32("unknown9", ps, depth, &(q_u->unknown9)); - prs_uint32("unknown10", ps, depth, &(q_u->unknown10)); - - smb_io_unistr2("", &(q_u->station),True,ps,depth); - prs_align(ps); - smb_io_unistr2("", &(q_u->username),True,ps,depth); - prs_align(ps); - - return True; -} - -/******************************************************************* - * make a structure. - ********************************************************************/ -BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u, - POLICY_HND *handle, - char *valuename, - uint32 size) -{ - int len_name = valuename != NULL ? strlen(valuename) : 0; - - if (q_u == NULL) return False; - - DEBUG(5,("make_spoolss_q_getprinterdata\n")); - - memcpy(&(q_u->handle), handle, sizeof(q_u->handle)); - make_unistr2(&(q_u->valuename), valuename, len_name); - q_u->size = size; - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_q_getprinterdata (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata"); - depth++; - - prs_align(ps); - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_align(ps); - smb_io_unistr2("", &(q_u->valuename),True,ps,depth); - prs_align(ps); - prs_uint32("size", ps, depth, &(q_u->size)); - - return True; -} - -/******************************************************************* - * write a structure. - * called from spoolss_r_getprinterdata (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata"); - depth++; - - /* grow buffer mem enough */ - mem_grow_data(&(ps->data), ps->io, r_u->size+100, 0); - - prs_align(ps); - prs_uint32("type", ps, depth, &(r_u->type)); - prs_uint32("size", ps, depth, &(r_u->size)); - - prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size); - prs_align(ps); - - prs_uint32("needed", ps, depth, &(r_u->needed)); - prs_uint32("status", ps, depth, &(r_u->status)); - prs_align(ps); - - return True; -} - -/******************************************************************* - * make a structure. - ********************************************************************/ -BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd) -{ - if (q_u == NULL) return False; - - DEBUG(5,("make_spoolss_q_closeprinter\n")); - - memcpy(&(q_u->handle), hnd, sizeof(q_u->handle)); - - return True; -} - -/******************************************************************* - * read a structure. - * called from static spoolss_q_closeprinter (srv_spoolss.c) - * called from spoolss_closeprinter (cli_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - - return True; -} - -/******************************************************************* - * write a structure. - * called from static spoolss_r_closeprinter (srv_spoolss.c) - * called from spoolss_closeprinter (cli_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter"); - depth++; - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(r_u->handle),ps,depth); - prs_uint32("status", ps, depth, &(r_u->status)); - - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_q_startdocprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - - smb_io_doc_info_container("",&(q_u->doc_info_container), ps, depth); - - return True; -} - -/******************************************************************* - * write a structure. - * called from spoolss_r_startdocprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter"); - depth++; - prs_uint32("jobid", ps, depth, &(r_u->jobid)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_q_enddocprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - - return True; -} - -/******************************************************************* - * write a structure. - * called from spoolss_r_enddocprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter"); - depth++; - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_q_startpageprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - - return True; -} - -/******************************************************************* - * write a structure. - * called from spoolss_r_startpageprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter"); - depth++; - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_q_endpageprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - - return True; -} - -/******************************************************************* - * write a structure. - * called from spoolss_r_endpageprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter"); - depth++; - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_q_writeprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_uint32("buffer_size", ps, depth, &(q_u->buffer_size)); - - if (q_u->buffer_size!=0) - { - q_u->buffer=(uint8 *)malloc(q_u->buffer_size*sizeof(uint8)); - prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size); - } - prs_align(ps); - prs_uint32("buffer_size2", ps, depth, &(q_u->buffer_size2)); - - return True; -} - -/******************************************************************* - * write a structure. - * called from spoolss_r_writeprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter"); - depth++; - prs_uint32("buffer_written", ps, depth, &(r_u->buffer_written)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_q_rffpcnex (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, - prs_struct *ps, int depth) -{ - uint32 useless_ptr; - - prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex"); - depth++; - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_uint32("flags", ps, depth, &(q_u->flags)); - prs_uint32("options", ps, depth, &(q_u->options)); - prs_uint32("useless ptr", ps, depth, &useless_ptr); - /*prs_align(ps);*/ - - smb_io_unistr2("", &(q_u->localmachine), True, ps, depth); - - prs_align(ps); - prs_uint32("printerlocal", ps, depth, &(q_u->printerlocal)); - - smb_io_notify_option("notify option", &(q_u->option), ps, depth); - - - return True; -} - -/******************************************************************* - * write a structure. - * called from spoolss_r_rffpcnex (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, - prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex"); - depth++; - - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_q_rfnpcnex (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, - prs_struct *ps, int depth) -{ - - prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - - prs_uint32("change", ps, depth, &(q_u->change)); - - smb_io_notify_option("notify option",&(q_u->option),ps,depth); - - return True; -} - -/******************************************************************* - * write a structure. - * called from spoolss_r_rfnpcnex (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_rfnpcnex(char *desc, - SPOOL_R_RFNPCNEX *r_u, - prs_struct *ps, int depth) -{ - uint32 x=0x0; - - prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex"); - depth++; - - prs_align(ps); - - smb_io_notify_info("notify info",&(r_u->info),ps,depth); - prs_align(ps); - prs_uint32("status", ps, depth, &(x)); - - return True; -} - -/******************************************************************* - * return the length of a uint32 (obvious, but the code is clean) - ********************************************************************/ -static uint32 size_of_uint32(uint32 *value) -{ - return (sizeof(*value)); - - return True; -} - -/******************************************************************* - * return the length of a UNICODE string in number of char, includes: - * - the leading zero - * - the relative pointer size - ********************************************************************/ -static uint32 size_of_relative_string(UNISTR *string) -{ - uint32 size=0; - - size=str_len_uni(string); /* the string length */ - size=size+1; /* add the leading zero */ - size=size*2; /* convert in char */ - size=size+4; /* add the size of the ptr */ - return (size); - - return True; -} - -/******************************************************************* - * return the length of a uint32 (obvious, but the code is clean) - ********************************************************************/ -static uint32 size_of_device_mode(DEVICEMODE *devmode) -{ - if (devmode==NULL) - return (4); - else - return (0xDC+4); - - return True; -} - -/******************************************************************* - * return the length of a uint32 (obvious, but the code is clean) - ********************************************************************/ -static uint32 size_of_systemtime(SYSTEMTIME *systime) -{ - if (systime==NULL) - return (4); - else - return (sizeof(SYSTEMTIME) +4); - - return True; -} - -/******************************************************************* - * write a UNICODE string. - * used by all the RPC structs passing a buffer - ********************************************************************/ -static BOOL spoolss_smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int depth) -{ - if (uni == NULL) return False; - - prs_debug(ps, depth, desc, "spoolss_smb_io_unistr"); - depth++; - prs_unistr("unistr", ps, depth, uni); - - return True; -} - - -/******************************************************************* - * write a UNICODE string and its relative pointer. - * used by all the RPC structs passing a buffer - ********************************************************************/ -static BOOL smb_io_relstr(char *desc, prs_struct *ps, int depth, UNISTR *buffer, - uint32 *start_offset, uint32 *end_offset) -{ - if (!ps->io) - { - uint32 struct_offset = ps->offset; - uint32 relative_offset; - - /* writing */ - *end_offset -= 2*(str_len_uni(buffer)+1); - ps->offset=*end_offset; - spoolss_smb_io_unistr(desc, buffer, ps, depth); - - ps->offset=struct_offset; - relative_offset=*end_offset-*start_offset; - - prs_uint32("offset", ps, depth, &(relative_offset)); - } - else - { - uint32 old_offset; - uint32 relative_offset; - - prs_uint32("offset", ps, depth, &(relative_offset)); - - old_offset = ps->offset; - ps->offset = (*start_offset) + relative_offset; - - spoolss_smb_io_unistr(desc, buffer, ps, depth); - - *end_offset = ps->offset; - ps->offset = old_offset; - } - return True; -} - - -/******************************************************************* - * write a array UNICODE strings and its relative pointer. - * used by 2 RPC structs - ********************************************************************/ -static BOOL smb_io_relarraystr(char *desc, prs_struct *ps, int depth, UNISTR ***buffer, - uint32 *start_offset, uint32 *end_offset) -{ - int i=0; - uint32 struct_offset; - uint32 relative_offset; - struct_offset=ps->offset; - - while ( (*buffer)[i]!=0x0000 ) - { - i++; - } - - i--; - - /* that's for the ending NULL */ - *end_offset-=2; - - do - { - *end_offset-= 2*(str_len_uni((*buffer)[i])+1); - ps->offset=*end_offset; - spoolss_smb_io_unistr(desc, (*buffer)[i], ps, depth); - - i--; - } - while (i>=0); - - ps->offset=struct_offset; - relative_offset=*end_offset-*start_offset; - - prs_uint32("offset", ps, depth, &(relative_offset)); - - return True; -} - -/******************************************************************* - * write a DEVICEMODE struct. - * on reading allocate memory for the private member - ********************************************************************/ -static BOOL smb_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode) -{ - prs_debug(ps, depth, desc, "smb_io_devmode"); - depth++; - - prs_uint16s(True,"devicename", ps, depth, devmode->devicename.buffer, 32); - prs_uint16("specversion", ps, depth, &(devmode->specversion)); - prs_uint16("driverversion", ps, depth, &(devmode->driverversion)); - prs_uint16("size", ps, depth, &(devmode->size)); - prs_uint16("driverextra", ps, depth, &(devmode->driverextra)); - prs_uint32("fields", ps, depth, &(devmode->fields)); - prs_uint16("orientation", ps, depth, &(devmode->orientation)); - prs_uint16("papersize", ps, depth, &(devmode->papersize)); - prs_uint16("paperlength", ps, depth, &(devmode->paperlength)); - prs_uint16("paperwidth", ps, depth, &(devmode->paperwidth)); - prs_uint16("scale", ps, depth, &(devmode->scale)); - prs_uint16("copies", ps, depth, &(devmode->copies)); - prs_uint16("defaultsource", ps, depth, &(devmode->defaultsource)); - prs_uint16("printquality", ps, depth, &(devmode->printquality)); - prs_uint16("color", ps, depth, &(devmode->color)); - prs_uint16("duplex", ps, depth, &(devmode->duplex)); - prs_uint16("yresolution", ps, depth, &(devmode->yresolution)); - prs_uint16("ttoption", ps, depth, &(devmode->ttoption)); - prs_uint16("collate", ps, depth, &(devmode->collate)); - prs_uint16s(True, "formname", ps, depth, devmode->formname.buffer, 32); - prs_uint16("logpixels", ps, depth, &(devmode->logpixels)); - prs_uint32("bitsperpel", ps, depth, &(devmode->bitsperpel)); - prs_uint32("pelswidth", ps, depth, &(devmode->pelswidth)); - prs_uint32("pelsheight", ps, depth, &(devmode->pelsheight)); - prs_uint32("displayflags", ps, depth, &(devmode->displayflags)); - prs_uint32("displayfrequency", ps, depth, &(devmode->displayfrequency)); - prs_uint32("icmmethod", ps, depth, &(devmode->icmmethod)); - prs_uint32("icmintent", ps, depth, &(devmode->icmintent)); - prs_uint32("mediatype", ps, depth, &(devmode->mediatype)); - prs_uint32("dithertype", ps, depth, &(devmode->dithertype)); - prs_uint32("reserved1", ps, depth, &(devmode->reserved1)); - prs_uint32("reserved2", ps, depth, &(devmode->reserved2)); - prs_uint32("panningwidth", ps, depth, &(devmode->panningwidth)); - prs_uint32("panningheight", ps, depth, &(devmode->panningheight)); - - if (devmode->driverextra!=0) - { - if (ps->io) - { - devmode->private=(uint8 *)malloc(devmode->driverextra*sizeof(uint8)); - DEBUG(7,("smb_io_devmode: allocated memory [%d] for private\n",devmode->driverextra)); - } - DEBUG(7,("smb_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra)); - - prs_uint8s(True, "private", ps, depth, devmode->private, devmode->driverextra); - DEBUG(8,("smb_io_devmode: parsed\n")); - } - - return True; -} - -/******************************************************************* - * write a DEVMODE struct and its relative pointer. - * used by all the RPC structs passing a buffer - ********************************************************************/ -static BOOL smb_io_reldevmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode, - uint32 *start_offset, uint32 *end_offset) -{ - uint32 struct_offset; - uint32 relative_offset; - - prs_debug(ps, depth, desc, "smb_io_reldevmode"); - depth++; - - struct_offset=ps->offset; - *end_offset-= (devmode->size+devmode->driverextra); - ps->offset=*end_offset; - - smb_io_devmode(desc, ps, depth, devmode); - - ps->offset=struct_offset; - relative_offset=*end_offset-*start_offset; - - prs_uint32("offset", ps, depth, &(relative_offset)); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_printer_info_0(char *desc, PRINTER_INFO_0 *info, prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - prs_debug(ps, depth, desc, "smb_io_printer_info_0"); - depth++; - *start_offset=ps->offset; - - smb_io_relstr("printername",ps, depth, &(info->printername), start_offset, end_offset); - smb_io_relstr("servername",ps, depth, &(info->servername), start_offset, end_offset); - prs_uint32("cjobs", ps, depth, &(info->cjobs)); - prs_uint32("attributes", ps, depth, &(info->attributes)); - - prs_uint32("unknown0", ps, depth, &(info->unknown0)); - prs_uint32("unknown1", ps, depth, &(info->unknown1)); - prs_uint32("unknown2", ps, depth, &(info->unknown2)); - prs_uint32("unknown3", ps, depth, &(info->unknown3)); - prs_uint32("unknown4", ps, depth, &(info->unknown4)); - prs_uint32("unknown5", ps, depth, &(info->unknown5)); - prs_uint32("unknown6", ps, depth, &(info->unknown6)); - prs_uint16("majorversion", ps, depth, &(info->majorversion)); - prs_uint16("buildversion", ps, depth, &(info->buildversion)); - prs_uint32("unknown7", ps, depth, &(info->unknown7)); - prs_uint32("unknown8", ps, depth, &(info->unknown8)); - prs_uint32("unknown9", ps, depth, &(info->unknown9)); - prs_uint32("unknown10", ps, depth, &(info->unknown10)); - prs_uint32("unknown11", ps, depth, &(info->unknown11)); - prs_uint32("unknown12", ps, depth, &(info->unknown12)); - prs_uint32("unknown13", ps, depth, &(info->unknown13)); - prs_uint32("unknown14", ps, depth, &(info->unknown14)); - prs_uint32("unknown15", ps, depth, &(info->unknown15)); - prs_uint32("unknown16", ps, depth, &(info->unknown16)); - prs_uint32("unknown17", ps, depth, &(info->unknown17)); - prs_uint32("unknown18", ps, depth, &(info->unknown18)); - prs_uint32("status" , ps, depth, &(info->status)); - prs_uint32("unknown20", ps, depth, &(info->unknown20)); - prs_uint32("unknown21", ps, depth, &(info->unknown21)); - prs_uint16("unknown22", ps, depth, &(info->unknown22)); - prs_uint32("unknown23", ps, depth, &(info->unknown23)); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_printer_info_1(char *desc, PRINTER_INFO_1 *info, prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - prs_debug(ps, depth, desc, "smb_io_printer_info_1"); - depth++; - *start_offset=ps->offset; - - prs_uint32("flags", ps, depth, &(info->flags)); - smb_io_relstr("description",ps, depth, &(info->description), start_offset, end_offset); - smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset); - smb_io_relstr("comment",ps, depth, &(info->comment), start_offset, end_offset); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_printer_info_2(char *desc, PRINTER_INFO_2 *info, prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - uint32 pipo=0; - uint32 devmode_offset; - uint32 backup_offset; - - prs_debug(ps, depth, desc, "smb_io_printer_info_2"); - depth++; - *start_offset=ps->offset; - - smb_io_relstr("servername", ps, depth, &(info->servername), start_offset, end_offset); - smb_io_relstr("printername", ps, depth, &(info->printername), start_offset, end_offset); - smb_io_relstr("sharename", ps, depth, &(info->sharename), start_offset, end_offset); - smb_io_relstr("portname", ps, depth, &(info->portname), start_offset, end_offset); - smb_io_relstr("drivername", ps, depth, &(info->drivername), start_offset, end_offset); - smb_io_relstr("comment", ps, depth, &(info->comment), start_offset, end_offset); - smb_io_relstr("location", ps, depth, &(info->location), start_offset, end_offset); - - devmode_offset=ps->offset; - ps->offset=ps->offset+4; - - smb_io_relstr("sepfile", ps, depth, &(info->sepfile), start_offset, end_offset); - smb_io_relstr("printprocessor",ps, depth, &(info->printprocessor), start_offset, end_offset); - smb_io_relstr("datatype", ps, depth, &(info->datatype), start_offset, end_offset); - smb_io_relstr("parameters", ps, depth, &(info->parameters), start_offset, end_offset); - - prs_uint32("security descriptor", ps, depth, &(pipo)); - - prs_uint32("attributes", ps, depth, &(info->attributes)); - prs_uint32("priority", ps, depth, &(info->priority)); - prs_uint32("defpriority", ps, depth, &(info->defaultpriority)); - prs_uint32("starttime", ps, depth, &(info->starttime)); - prs_uint32("untiltime", ps, depth, &(info->untiltime)); - prs_uint32("status", ps, depth, &(info->status)); - prs_uint32("jobs", ps, depth, &(info->cjobs)); - prs_uint32("averageppm", ps, depth, &(info->averageppm)); - - /* - I'm not sure if putting the devmode at the end the struct is worth it - but NT does it - */ - backup_offset=ps->offset; - ps->offset=devmode_offset; - smb_io_reldevmode("devmode", ps, depth, info->devmode, start_offset, end_offset); - ps->offset=backup_offset; - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_printer_driver_info_1(char *desc, DRIVER_INFO_1 *info, prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1"); - depth++; - *start_offset=ps->offset; - - smb_io_relstr("name", ps, depth, &(info->name), start_offset, end_offset); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_printer_driver_info_2(char *desc, DRIVER_INFO_2 *info,prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - prs_debug(ps, depth, desc, "smb_io_printer_xxx"); - depth++; - *start_offset=ps->offset; - - prs_uint32("version", ps, depth, &(info->version)); - smb_io_relstr("name", ps, depth, &(info->name), start_offset, end_offset); - smb_io_relstr("architecture", ps, depth, &(info->architecture), start_offset, end_offset); - smb_io_relstr("driverpath", ps, depth, &(info->driverpath), start_offset, end_offset); - smb_io_relstr("datafile", ps, depth, &(info->datafile), start_offset, end_offset); - smb_io_relstr("configfile", ps, depth, &(info->configfile), start_offset, end_offset); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_printer_driver_info_3(char *desc, DRIVER_INFO_3 *info,prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3"); - depth++; - *start_offset=ps->offset; - - prs_uint32("version", ps, depth, &(info->version)); - smb_io_relstr("name", ps, depth, &(info->name), start_offset, end_offset); - smb_io_relstr("architecture", ps, depth, &(info->architecture), start_offset, end_offset); - smb_io_relstr("driverpath", ps, depth, &(info->driverpath), start_offset, end_offset); - smb_io_relstr("datafile", ps, depth, &(info->datafile), start_offset, end_offset); - smb_io_relstr("configfile", ps, depth, &(info->configfile), start_offset, end_offset); - smb_io_relstr("helpfile", ps, depth, &(info->helpfile), start_offset, end_offset); - - smb_io_relarraystr("dependentfiles", ps, depth, &(info->dependentfiles), start_offset, end_offset); - - smb_io_relstr("monitorname", ps, depth, &(info->monitorname), start_offset, end_offset); - smb_io_relstr("defaultdatatype", ps, depth, &(info->defaultdatatype), start_offset, end_offset); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_job_info_1(char *desc, JOB_INFO_1 *info, prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - prs_debug(ps, depth, desc, "smb_io_job_info_1"); - depth++; - *start_offset=ps->offset; - - prs_uint32("jobid", ps, depth, &(info->jobid)); - smb_io_relstr("printername", ps, depth, &(info->printername), start_offset, end_offset); - smb_io_relstr("machinename", ps, depth, &(info->machinename), start_offset, end_offset); - smb_io_relstr("username", ps, depth, &(info->username), start_offset, end_offset); - smb_io_relstr("document", ps, depth, &(info->document), start_offset, end_offset); - smb_io_relstr("datatype", ps, depth, &(info->datatype), start_offset, end_offset); - smb_io_relstr("text_status", ps, depth, &(info->text_status), start_offset, end_offset); - prs_uint32("status", ps, depth, &(info->status)); - prs_uint32("priority", ps, depth, &(info->priority)); - prs_uint32("position", ps, depth, &(info->position)); - prs_uint32("totalpages", ps, depth, &(info->totalpages)); - prs_uint32("pagesprinted", ps, depth, &(info->pagesprinted)); - spoolss_io_system_time("submitted", ps, depth, &(info->submitted) ); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_job_info_2(char *desc, JOB_INFO_2 *info, prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - int pipo=0; - prs_debug(ps, depth, desc, "smb_io_job_info_2"); - depth++; - *start_offset=ps->offset; - - prs_uint32("jobid", ps, depth, &(info->jobid)); - smb_io_relstr("printername", ps, depth, &(info->printername), start_offset, end_offset); - smb_io_relstr("machinename", ps, depth, &(info->machinename), start_offset, end_offset); - smb_io_relstr("username", ps, depth, &(info->username), start_offset, end_offset); - smb_io_relstr("document", ps, depth, &(info->document), start_offset, end_offset); - smb_io_relstr("notifyname", ps, depth, &(info->notifyname), start_offset, end_offset); - smb_io_relstr("datatype", ps, depth, &(info->datatype), start_offset, end_offset); - - smb_io_relstr("printprocessor", ps, depth, &(info->printprocessor), start_offset, end_offset); - smb_io_relstr("parameters", ps, depth, &(info->parameters), start_offset, end_offset); - smb_io_relstr("drivername", ps, depth, &(info->drivername), start_offset, end_offset); - smb_io_reldevmode("devmode", ps, depth, info->devmode, start_offset, end_offset); - smb_io_relstr("text_status", ps, depth, &(info->text_status), start_offset, end_offset); - -/* SEC_DESC sec_desc;*/ - prs_uint32("Hack! sec desc", ps, depth, &pipo); - - prs_uint32("status", ps, depth, &(info->status)); - prs_uint32("priority", ps, depth, &(info->priority)); - prs_uint32("position", ps, depth, &(info->position)); - prs_uint32("starttime", ps, depth, &(info->starttime)); - prs_uint32("untiltime", ps, depth, &(info->untiltime)); - prs_uint32("totalpages", ps, depth, &(info->totalpages)); - prs_uint32("size", ps, depth, &(info->size)); - spoolss_io_system_time("submitted", ps, depth, &(info->submitted) ); - prs_uint32("timeelapsed", ps, depth, &(info->timeelapsed)); - prs_uint32("pagesprinted", ps, depth, &(info->pagesprinted)); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_form_1(char *desc, FORM_1 *info, prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - prs_debug(ps, depth, desc, "smb_io_form_1"); - depth++; - *start_offset=ps->offset; - - prs_uint32("flag", ps, depth, &(info->flag)); - smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset); - prs_uint32("width", ps, depth, &(info->width)); - prs_uint32("length", ps, depth, &(info->length)); - prs_uint32("left", ps, depth, &(info->left)); - prs_uint32("top", ps, depth, &(info->top)); - prs_uint32("right", ps, depth, &(info->right)); - prs_uint32("bottom", ps, depth, &(info->bottom)); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_port_2(char *desc, PORT_INFO_2 *info, prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - prs_debug(ps, depth, desc, "smb_io_form_1"); - depth++; - *start_offset=ps->offset; - - smb_io_relstr("port_name",ps, depth, &(info->port_name), start_offset, end_offset); - smb_io_relstr("monitor_name",ps, depth, &(info->monitor_name), start_offset, end_offset); - smb_io_relstr("description",ps, depth, &(info->description), start_offset, end_offset); - prs_uint32("port_type", ps, depth, &(info->port_type)); - prs_uint32("reserved", ps, depth, &(info->reserved)); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_processor_info_1(char *desc, PRINTPROCESSOR_1 *info, prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - prs_debug(ps, depth, desc, "smb_io_processor_info_1"); - depth++; - *start_offset=ps->offset; - - smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL smb_io_monitor_info_1(char *desc, PRINTMONITOR_1 *info, prs_struct *ps, int depth, - uint32 *start_offset, uint32 *end_offset) -{ - prs_debug(ps, depth, desc, "smb_io_monitor_info_1"); - depth++; - *start_offset=ps->offset; - - smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info) -{ - int size=0; - - size+=size_of_uint32( &(info->attributes) ); - size+=size_of_relative_string( &(info->printername) ); - size+=size_of_relative_string( &(info->servername) ); - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info) -{ - int size=0; - - size+=size_of_uint32( &(info->flags) ); - size+=size_of_relative_string( &(info->description) ); - size+=size_of_relative_string( &(info->name) ); - size+=size_of_relative_string( &(info->comment) ); - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info) -{ - int size=0; - - size+=4; /* the security descriptor */ - size+=info->devmode->size+4; /* size of the devmode and the ptr */ - size+=info->devmode->driverextra; /* if a devmode->private section exists, add its size */ - - size+=size_of_relative_string( &(info->servername) ); - size+=size_of_relative_string( &(info->printername) ); - size+=size_of_relative_string( &(info->sharename) ); - size+=size_of_relative_string( &(info->portname) ); - size+=size_of_relative_string( &(info->drivername) ); - size+=size_of_relative_string( &(info->comment) ); - size+=size_of_relative_string( &(info->location) ); - - size+=size_of_relative_string( &(info->sepfile) ); - size+=size_of_relative_string( &(info->printprocessor) ); - size+=size_of_relative_string( &(info->datatype) ); - size+=size_of_relative_string( &(info->parameters) ); - - size+=size_of_uint32( &(info->attributes) ); - size+=size_of_uint32( &(info->priority) ); - size+=size_of_uint32( &(info->defaultpriority) ); - size+=size_of_uint32( &(info->starttime) ); - size+=size_of_uint32( &(info->untiltime) ); - size+=size_of_uint32( &(info->status) ); - size+=size_of_uint32( &(info->cjobs) ); - size+=size_of_uint32( &(info->averageppm) ); - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info) -{ - int size=0; - DEBUG(9,("Sizing driver info_1\n")); - size+=size_of_relative_string( &(info->name) ); - - DEBUGADD(9,("size: [%d]\n", size)); - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info) -{ - int size=0; - DEBUG(9,("Sizing driver info_2\n")); - size+=size_of_uint32( &(info->version) ); - size+=size_of_relative_string( &(info->name) ); - size+=size_of_relative_string( &(info->architecture) ); - size+=size_of_relative_string( &(info->driverpath) ); - size+=size_of_relative_string( &(info->datafile) ); - size+=size_of_relative_string( &(info->configfile) ); - - DEBUGADD(9,("size: [%d]\n", size)); - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info) -{ - int size=0; - UNISTR **string; - int i=0; - - DEBUG(9,("Sizing driver info_3\n")); - size+=size_of_uint32( &(info->version) ); - size+=size_of_relative_string( &(info->name) ); - size+=size_of_relative_string( &(info->architecture) ); - size+=size_of_relative_string( &(info->driverpath) ); - size+=size_of_relative_string( &(info->datafile) ); - size+=size_of_relative_string( &(info->configfile) ); - size+=size_of_relative_string( &(info->helpfile) ); - size+=size_of_relative_string( &(info->monitorname) ); - size+=size_of_relative_string( &(info->defaultdatatype) ); - - string=info->dependentfiles; - - while ( (string)[i]!=0x0000 ) - { - size+=2*(1+ str_len_uni( string[i] ) ); - i++; - } - size+=6; - - DEBUGADD(9,("size: [%d]\n", size)); - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_job_info_1(JOB_INFO_1 *info) -{ - int size=0; - size+=size_of_uint32( &(info->jobid) ); - size+=size_of_relative_string( &(info->printername) ); - size+=size_of_relative_string( &(info->machinename) ); - size+=size_of_relative_string( &(info->username) ); - size+=size_of_relative_string( &(info->document) ); - size+=size_of_relative_string( &(info->datatype) ); - size+=size_of_relative_string( &(info->text_status) ); - size+=size_of_uint32( &(info->status) ); - size+=size_of_uint32( &(info->priority) ); - size+=size_of_uint32( &(info->position) ); - size+=size_of_uint32( &(info->totalpages) ); - size+=size_of_uint32( &(info->pagesprinted) ); - size+=size_of_systemtime( &(info->submitted) ); - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_job_info_2(JOB_INFO_2 *info) -{ - int size=0; - - size+=4; /* size of sec desc ptr */ - - size+=size_of_uint32( &(info->jobid) ); - size+=size_of_relative_string( &(info->printername) ); - size+=size_of_relative_string( &(info->machinename) ); - size+=size_of_relative_string( &(info->username) ); - size+=size_of_relative_string( &(info->document) ); - size+=size_of_relative_string( &(info->notifyname) ); - size+=size_of_relative_string( &(info->datatype) ); - size+=size_of_relative_string( &(info->printprocessor) ); - size+=size_of_relative_string( &(info->parameters) ); - size+=size_of_relative_string( &(info->drivername) ); - size+=size_of_device_mode( info->devmode ); - size+=size_of_relative_string( &(info->text_status) ); -/* SEC_DESC sec_desc;*/ - size+=size_of_uint32( &(info->status) ); - size+=size_of_uint32( &(info->priority) ); - size+=size_of_uint32( &(info->position) ); - size+=size_of_uint32( &(info->starttime) ); - size+=size_of_uint32( &(info->untiltime) ); - size+=size_of_uint32( &(info->totalpages) ); - size+=size_of_uint32( &(info->size) ); - size+=size_of_systemtime( &(info->submitted) ); - size+=size_of_uint32( &(info->timeelapsed) ); - size+=size_of_uint32( &(info->pagesprinted) ); - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_form_1(FORM_1 *info) -{ - int size=0; - - size+=size_of_uint32( &(info->flag) ); - size+=size_of_relative_string( &(info->name) ); - size+=size_of_uint32( &(info->width) ); - size+=size_of_uint32( &(info->length) ); - size+=size_of_uint32( &(info->left) ); - size+=size_of_uint32( &(info->top) ); - size+=size_of_uint32( &(info->right) ); - size+=size_of_uint32( &(info->bottom) ); - - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_port_info_2(PORT_INFO_2 *info) -{ - int size=0; - - size+=size_of_relative_string( &(info->port_name) ); - size+=size_of_relative_string( &(info->monitor_name) ); - size+=size_of_relative_string( &(info->description) ); - - size+=size_of_uint32( &(info->port_type) ); - size+=size_of_uint32( &(info->reserved) ); - - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_processor_info_1(PRINTPROCESSOR_1 *info) -{ - int size=0; - size+=size_of_relative_string( &(info->name) ); - - return (size); - - return True; -} - -/******************************************************************* -return the size required by a struct in the stream -********************************************************************/ -static uint32 spoolss_size_monitor_info_1(PRINTMONITOR_1 *info) -{ - int size=0; - size+=size_of_relative_string( &(info->name) ); - - return (size); - - return True; -} - -/******************************************************************* - * make a structure. - ********************************************************************/ -static BOOL make_spoolss_buffer(BUFFER* buffer, uint32 size) -{ - buffer->ptr = (size != 0) ? 1 : 0; - buffer->size = size; - buffer->data = (uint8 *)Realloc( NULL, (buffer->size) * sizeof(uint8) ); - - return (buffer->data != NULL || size == 0); -} - -/******************************************************************* - * read a uint8 buffer of size *size. - * allocate memory for it - * return a pointer to the allocated memory and the size - * return NULL and a size of 0 if the buffer is empty - * - * jfmxxxx: fix it to also write a buffer - ********************************************************************/ -static BOOL spoolss_io_read_buffer(char *desc, prs_struct *ps, int depth, BUFFER *buffer) -{ - prs_debug(ps, depth, desc, "spoolss_io_read_buffer"); - depth++; - - prs_align(ps); - - prs_uint32("pointer", ps, depth, &(buffer->ptr)); - - if (buffer->ptr != 0x0000) - { - prs_uint32("size", ps, depth, &(buffer->size)); - if (ps->io) - { - /* reading */ - buffer->data=(uint8 *)Realloc(NULL, buffer->size * sizeof(uint8) ); - } - if (buffer->data == NULL) - { - return False; - } - mem_grow_data(&(ps->data), ps->io, - ps->data->data_size + buffer->size, 0); - prs_uint8s(True, "buffer", ps, depth, buffer->data, buffer->size); - prs_align(ps); - - } - else - { - if (ps->io) - { - /* reading */ - buffer->data=0x0000; - buffer->size=0x0000; - } - } - - if (!ps->io) - { - /* writing */ - if (buffer->data != NULL) - { - free(buffer->data); - } - buffer->data = NULL; - } - return True; -} - -/******************************************************************* - * read a uint8 buffer of size *size. - * allocate memory for it - * return a pointer to the allocated memory and the size - * return NULL and a size of 0 if the buffer is empty - * - * jfmxxxx: fix it to also write a buffer - ********************************************************************/ -BOOL spoolss_io_free_buffer(BUFFER *buffer) -{ - DEBUG(8,("spoolss_io_free_buffer\n")); - - if (buffer->ptr != 0x0000) - { - free(buffer->data); - } - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_getprinterdriver2 (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_getprinterdriver2(char *desc, - SPOOL_Q_GETPRINTERDRIVER2 *q_u, - prs_struct *ps, int depth) -{ - uint32 useless_ptr; - prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_uint32("pointer", ps, depth, &useless_ptr); - smb_io_unistr2("architecture", &(q_u->architecture),True,ps,depth); - - prs_align(ps); - - prs_uint32("level", ps, depth, &(q_u->level)); - spoolss_io_read_buffer("", ps, depth, &(q_u->buffer)); - - prs_align(ps); - - prs_uint32("buffer size", ps, depth, &(q_u->buf_size)); - prs_uint32("status", ps, depth, &(q_u->status)); - - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_getprinterdriver2 (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, - prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - uint32 pipo=0; - DRIVER_INFO_1 *info1; - DRIVER_INFO_2 *info2; - DRIVER_INFO_3 *info3; - - prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2"); - depth++; - - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - - info1 = r_u->printer.info1; - info2 = r_u->printer.info2; - info3 = r_u->printer.info3; - - switch (r_u->level) - { - case 1: - { - bufsize_required += spoolss_size_printer_driver_info_1(info1); - break; - } - case 2: - { - bufsize_required += spoolss_size_printer_driver_info_2(info2); - break; - } - case 3: - { - bufsize_required += spoolss_size_printer_driver_info_3(info3); - break; - } - } - - if (ps->io) - { - /* reading */ - r_u->offered = bufsize_required; - } - - DEBUG(4,("spoolss_io_r_getprinterdriver2, size needed: %d\n",bufsize_required)); - DEBUG(4,("spoolss_io_r_getprinterdriver2, size offered: %d\n",r_u->offered)); - - /* check if the buffer is big enough for the datas */ - if (r_u->offered < bufsize_required) - { - /* it's too small */ - r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */ - r_u->offered=0; /* don't send back the buffer */ - - DEBUG(4,("spoolss_io_r_getprinterdriver2, buffer too small\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - } - else - { - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - - DEBUG(4,("spoolss_io_r_getprinterdriver2, buffer large enough\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - - beginning=ps->offset; - start_offset=ps->offset; - end_offset=start_offset+r_u->offered; - - switch (r_u->level) - { - case 1: - { - smb_io_printer_driver_info_1(desc, - info1, - ps, - depth, - &start_offset, - &end_offset); - break; - } - case 2: - { - smb_io_printer_driver_info_2(desc, - info2, - ps, - depth, - &start_offset, - &end_offset); - break; - } - case 3: - { - smb_io_printer_driver_info_3(desc, - info3, - ps, - depth, - &start_offset, - &end_offset); - break; - } - - } - - ps->offset=beginning+r_u->offered; - prs_align(ps); - } - - /* - * if the buffer was too small, send the minimum required size - * if it was too large, send the real needed size - */ - - prs_uint32("size of buffer needed", ps, depth, &(bufsize_required)); - prs_uint32("pipo", ps, depth, &pipo); - prs_uint32("pipo", ps, depth, &pipo); - prs_uint32("status", ps, depth, &(r_u->status)); - - - return True; -} - -/******************************************************************* - * make a structure. - ********************************************************************/ -BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u, - uint32 flags, - const char* servername, - uint32 level, - uint32 size) -{ - size_t len_name = servername != NULL ? strlen(servername) : 0; - - DEBUG(5,("make_spoolss_q_enumprinters. size: %d\n", size)); - - q_u->flags = flags; - - make_unistr2(&(q_u->servername), servername, len_name); - - q_u->level = level; - make_spoolss_buffer(&q_u->buffer, size); - q_u->buf_size = size; - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_enumprinters (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, - prs_struct *ps, int depth) -{ - uint32 useless_ptr = 0x01; - prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters"); - depth++; - - prs_align(ps); - - prs_uint32("flags", ps, depth, &(q_u->flags)); - prs_uint32("useless ptr", ps, depth, &useless_ptr); - - smb_io_unistr2("", &(q_u->servername),True,ps,depth); - prs_align(ps); - - prs_uint32("level", ps, depth, &(q_u->level)); - - spoolss_io_read_buffer("buffer", ps, depth, &(q_u->buffer)); - - prs_uint32("buf_size", ps, depth, &q_u->buf_size); - - return True; -} - -/**************************************************************************** -****************************************************************************/ -void free_r_enumprinters(SPOOL_R_ENUMPRINTERS *r_u) -{ - DEBUG(4,("free_enum_printers_info: [%d] structs to free at level [%d]\n", r_u->returned, r_u->level)); - switch (r_u->level) - { - case 1: - { - free_print1_array(r_u->returned, r_u->printer.printers_1); - break; - } - case 2: - { - free_print2_array(r_u->returned, r_u->printer.printers_2); - break; - } - } -} - -/******************************************************************* - * write a structure. - * called from spoolss_r_enum_printers (srv_spoolss.c) - * - ********************************************************************/ -BOOL spoolss_io_r_enumprinters(char *desc, - SPOOL_R_ENUMPRINTERS *r_u, - prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - int i; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - uint32 tmp_ct = 0; - - PRINTER_INFO_1 *info1; - PRINTER_INFO_2 *info2; - fstring tmp; - - slprintf(tmp, sizeof(tmp)-1, "spoolss_io_r_enumprinters %d", r_u->level); - - prs_debug(ps, depth, desc, tmp); - depth++; - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - - if (!ps->io) - { - /* writing */ - for(i=0;i<r_u->returned;i++) - { - switch (r_u->level) - { - case 1: - info1 = r_u->printer.printers_1[i]; - bufsize_required += spoolss_size_printer_info_1(info1); - break; - case 2: - info2 = r_u->printer.printers_2[i]; - bufsize_required += spoolss_size_printer_info_2(info2); - break; - } - } - - DEBUG(4,("spoolss_io_r_enumprinters, size needed: %d\n",bufsize_required)); - DEBUG(4,("spoolss_io_r_enumprinters, size offered: %d\n",r_u->offered)); - - if (r_u->offered<bufsize_required) - { - /* - * so the buffer is too small to handle datas - * reply the minimum size required in the status - * make the buffer equal 0 - * and reply no printers in buffer - */ - r_u->status=ERROR_INSUFFICIENT_BUFFER; - r_u->offered=0; - /*r_u->returned=0;*/ - - DEBUG(4,("spoolss_io_r_enumprinters, buffer too small\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - prs_uint32("size of buffer needed", ps, depth, &(bufsize_required)); - prs_uint32("count", ps, depth, &(r_u->returned)); - prs_uint32("status", ps, depth, &(r_u->status)); - return False; - } - - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - - DEBUG(4,("spoolss_io_r_enumprinters, buffer large enough\n")); - } - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - - /* have to skip to end of buffer when reading, and have to record - * size of buffer when writing. *shudder*. - */ - - beginning = ps->offset; - start_offset = ps->offset; - end_offset = start_offset + r_u->offered; - - if (ps->io) - { - /* reading */ - ps->offset = beginning + r_u->offered; - - prs_align(ps); - prs_uint32("buffer size", ps, depth, &(bufsize_required)); - prs_uint32("count", ps, depth, &(r_u->returned)); - - ps->offset = beginning; - } - - for(i=0;i<r_u->returned;i++) - { - - switch (r_u->level) - { - case 1: - { - if (ps->io) - { - /* reading */ - r_u->printer.printers_1[i] = add_print1_to_array(&tmp_ct, &r_u->printer.printers_1, NULL); - } - info1 = r_u->printer.printers_1[i]; - if (info1 == NULL) - { - return False; - } - smb_io_printer_info_1(desc, info1, ps, depth, - &start_offset, &end_offset); - break; - } - case 2: - { - if (ps->io) - { - /* reading */ - r_u->printer.printers_2[i] = add_print2_to_array(&tmp_ct, &r_u->printer.printers_2, NULL); - } - info2 = r_u->printer.printers_2[i]; - if (info2 == NULL) - { - return False; - } - smb_io_printer_info_2(desc, info2, ps, depth, - &start_offset, &end_offset); - break; - } - } - } - - ps->offset = beginning + r_u->offered; - prs_align(ps); - - prs_uint32("buffer size", ps, depth, &(bufsize_required)); - prs_uint32("count", ps, depth, &(r_u->returned)); - prs_uint32("status", ps, depth, &(r_u->status)); - - if (!ps->io) - { - /* writing */ - free_r_enumprinters(r_u); - } - - return True; -} - -/******************************************************************* - * write a structure. - * called from spoolss_r_enum_printers (srv_spoolss.c) - * - ********************************************************************/ -BOOL spoolss_io_r_getprinter(char *desc, - SPOOL_R_GETPRINTER *r_u, - prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - - prs_debug(ps, depth, desc, "spoolss_io_r_getprinter"); - depth++; - - prs_align(ps); - - prs_uint32("pointer", ps, depth, &useless_ptr); - - switch (r_u->level) - { - case 0: - { - PRINTER_INFO_0 *info; - info = r_u->printer.info0; - bufsize_required += spoolss_size_printer_info_0(info); - break; - } - case 1: - { - PRINTER_INFO_1 *info; - info = r_u->printer.info1; - bufsize_required += spoolss_size_printer_info_1(info); - break; - } - case 2: - { - PRINTER_INFO_2 *info; - info = r_u->printer.info2; - bufsize_required += spoolss_size_printer_info_2(info); - break; - } - } - - DEBUG(4,("spoolss_io_r_getprinter, size needed: %d\n",bufsize_required)); - DEBUG(4,("spoolss_io_r_getprinter, size offered: %d\n",r_u->offered)); - - /* check if the buffer is big enough for the datas */ - if (r_u->offered < bufsize_required) - { - /* it's too small */ - r_u->status = ERROR_INSUFFICIENT_BUFFER; /* say so */ - r_u->offered = 0; /* don't send back the buffer */ - - DEBUG(4,("spoolss_io_r_getprinter, buffer too small\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - } - else - { - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - - DEBUG(4,("spoolss_io_r_getprinter, buffer large enough\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - } - - if (ps->io) - { - /* reading */ - r_u->printer.info = Realloc(NULL, r_u->offered); - } - - if (bufsize_required <= r_u->offered) - { - beginning=ps->offset; - start_offset=ps->offset; - end_offset=start_offset+r_u->offered; - - switch (r_u->level) - { - case 0: - { - PRINTER_INFO_0 *info; - info = r_u->printer.info0; - smb_io_printer_info_0(desc, - info, - ps, - depth, - &start_offset, - &end_offset); - break; - } - case 1: - { - PRINTER_INFO_1 *info; - info = r_u->printer.info1; - smb_io_printer_info_1(desc, - info, - ps, - depth, - &start_offset, - &end_offset); - break; - } - case 2: - { - PRINTER_INFO_2 *info; - info = r_u->printer.info2; - smb_io_printer_info_2(desc, - info, - ps, - depth, - &start_offset, - &end_offset); - break; - } - - } - - ps->offset=beginning+r_u->offered; - prs_align(ps); - } - - /* - * if the buffer was too small, send the minimum required size - * if it was too large, send the real needed size - */ - - prs_uint32("size of buffer needed", ps, depth, &(bufsize_required)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* - * read a uint8 buffer of size *size. - * allocate memory for it - * return a pointer to the allocated memory and the size - * return NULL and a size of 0 if the buffer is empty - * - * jfmxxxx: fix it to also write a buffer - ********************************************************************/ -static BOOL spoolss_io_read_buffer8(char *desc, prs_struct *ps, uint8 **buffer, uint32 *size,int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_read_buffer8"); - depth++; - - prs_align(ps); - - prs_uint32("buffer size", ps, depth, size); - *buffer = (uint8 *)Realloc(NULL, (*size) * sizeof(uint8) ); - prs_uint8s(True,"buffer",ps,depth,*buffer,*size); - prs_align(ps); - - return True; -} - -/******************************************************************* - * make a structure. - * called from spoolss_getprinter (srv_spoolss.c) - ********************************************************************/ -BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u, - POLICY_HND *hnd, - uint32 level, - uint32 buf_size) -{ - if (q_u == NULL) return False; - - memcpy(&q_u->handle, hnd, sizeof(q_u->handle)); - - q_u->level = level; - q_u->buffer = (uint8 *)Realloc(NULL, (buf_size) * sizeof(uint8) ); - q_u->offered = buf_size; - - return True; -} - -/******************************************************************* - * read a structure. - * called from spoolss_getprinter (srv_spoolss.c) - ********************************************************************/ -BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, - prs_struct *ps, int depth) -{ - uint32 count = 0; - uint32 buf_ptr = q_u->buffer != NULL ? 1 : 0; - prs_debug(ps, depth, desc, "spoolss_io_q_getprinter"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - - prs_uint32("level", ps, depth, &(q_u->level)); - - if (!ps->io) - { - /* writing */ - buf_ptr = q_u->buffer != NULL ? 1 : 0; - } - prs_uint32("buffer pointer", ps, depth, &buf_ptr); - - if (buf_ptr != 0) - { - spoolss_io_read_buffer8("",ps, &q_u->buffer, &count,depth); - } - if (q_u->buffer != NULL) - { - free(q_u->buffer); - } - prs_uint32("buffer size", ps, depth, &(q_u->offered)); - - return count == q_u->offered; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_setprinter"); - depth++; - - prs_align(ps); - - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE **devmode) -{ - uint32 devmode_size=0x0; - uint32 useless_ptr=0x0; - - prs_debug(ps, depth, desc, "spoolss_io_devmode"); - depth++; - - prs_uint32("devmode_size", ps, depth, &(devmode_size)); - prs_uint32("useless_ptr", ps, depth, &(useless_ptr)); - - if (devmode_size!=0 && useless_ptr!=0) - { - /* so we have a DEVICEMODE to follow */ - if (ps->io) - { - DEBUG(9,("Allocating memory for spoolss_io_devmode\n")); - *devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE)); - ZERO_STRUCTP(*devmode); - } - - /* this is bad code, shouldn't be there */ - prs_uint32("devmode_size", ps, depth, &(devmode_size)); - - smb_io_devmode(desc, ps, depth, *devmode); - } - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_q_setprinter"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle", &(q_u->handle),ps,depth); - prs_uint32("level", ps, depth, &(q_u->level)); - - /* again a designed mess */ - /* sometimes I'm wondering how all of this work ! */ - - /* To be correct it need to be split in 3 functions */ - - spool_io_printer_info_level("", &(q_u->info), ps, depth); - - spoolss_io_devmode(desc, ps, depth, &(q_u->devmode)); - - prs_uint32("security.size_of_buffer", ps, depth, &(q_u->security.size_of_buffer)); - prs_uint32("security.data", ps, depth, &(q_u->security.data)); - - prs_uint32("command", ps, depth, &(q_u->command)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_fcpn"); - depth++; - - prs_align(ps); - - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth) -{ - - prs_debug(ps, depth, desc, "spoolss_io_q_fcpn"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - - return True; -} - - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, ""); - depth++; - - prs_align(ps); - - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth) -{ - - prs_debug(ps, depth, desc, ""); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_uint32("level", ps, depth, &(q_u->level)); - - spoolss_io_read_buffer("", ps, depth, &(q_u->buffer)); - - prs_align(ps); - - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} - -/**************************************************************************** -****************************************************************************/ -void free_r_enumjobs(SPOOL_R_ENUMJOBS *r_u) -{ - DEBUG(4,("free_enum_jobs_info: [%d] structs to free at level [%d]\n", r_u->numofjobs, r_u->level)); - switch (r_u->level) - { - case 1: - { - free_job1_array(r_u->numofjobs, r_u->job.job_info_1); - break; - } - case 2: - { - free_job2_array(r_u->numofjobs, r_u->job.job_info_2); - break; - } - } -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth) -{ - uint32 useless_ptr = 0; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - uint32 tmp_ct = 0; - int i; - - prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs"); - depth++; - - prs_align(ps); - - if (!ps->io) - { - /* writing */ - switch (r_u->level) - { - case 1: - { - for (i=0; i<r_u->numofjobs; i++) - { - JOB_INFO_1 *info; - info=r_u->job.job_info_1[i]; - bufsize_required += spoolss_size_job_info_1(&(info[i])); - } - break; - } - case 2: - { - for (i=0; i<r_u->numofjobs; i++) - { - JOB_INFO_2 *info; - info=r_u->job.job_info_2[i]; - - bufsize_required += spoolss_size_job_info_2(&(info[i])); - } - break; - } - } - - DEBUG(4,("spoolss_io_r_enumjobs, size needed: %d\n",bufsize_required)); - DEBUG(4,("spoolss_io_r_enumjobs, size offered: %d\n",r_u->offered)); - - /* check if the buffer is big enough for the datas */ - if (r_u->offered<bufsize_required) - { - /* it's too small */ - r_u->status = ERROR_INSUFFICIENT_BUFFER; /* say so */ - r_u->offered = bufsize_required; - useless_ptr = 0; - - DEBUG(4,("spoolss_io_r_enumjobs, buffer too small\n")); - - } - else - { - useless_ptr = 1; - } - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - } - - prs_uint32("pointer", ps, depth, &useless_ptr); - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - - if (useless_ptr != 0) - { - beginning=ps->offset; - start_offset=ps->offset; - end_offset=start_offset+r_u->offered; - - tmp_ct = 0; - - if (ps->io) - { - /* reading */ - ps->offset = beginning + r_u->offered; - - prs_align(ps); - prs_uint32("buffer size", ps, depth, &(bufsize_required)); - prs_uint32("numofjobs", ps, depth, &(r_u->numofjobs)); - - ps->offset = beginning; - } - - switch (r_u->level) - { - case 1: - { - JOB_INFO_1 *info; - for (i=0; i<r_u->numofjobs; i++) - { - if (ps->io) - { - /* reading */ - r_u->job.job_info_1[i] = add_job1_to_array(&tmp_ct, &r_u->job.job_info_1, NULL); - } - info = r_u->job.job_info_1[i]; - smb_io_job_info_1(desc, - info, - ps, - depth, - &start_offset, - &end_offset); - } - break; - } - case 2: - { - JOB_INFO_2 *info; - for (i=0; i<r_u->numofjobs; i++) - { - if (ps->io) - { - /* reading */ - r_u->job.job_info_2[i] = add_job2_to_array(&tmp_ct, &r_u->job.job_info_2, NULL); - } - info = r_u->job.job_info_2[i]; - smb_io_job_info_2(desc, - info, - ps, - depth, - &start_offset, - &end_offset); - } - break; - } - - } - ps->offset=beginning+r_u->offered; - prs_align(ps); - - /* - * if the buffer was too small, send the minimum required size - * if it was too large, send the real needed size - */ - - prs_uint32("buffer size", ps, depth, &(bufsize_required)); - } - - prs_uint32("numofjobs", ps, depth, &(r_u->numofjobs)); - prs_uint32("status", ps, depth, &(r_u->status)); - - if (!ps->io) - { - /* writing */ - free_r_enumjobs(r_u); - } - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd, - uint32 firstjob, - uint32 numofjobs, - uint32 level, - uint32 buf_size) -{ - if (q_u == NULL) - { - return False; - } - memcpy(&q_u->handle, hnd, sizeof(q_u->handle)); - q_u->firstjob = firstjob; - q_u->numofjobs = numofjobs; - q_u->level = level; - - if (!make_spoolss_buffer(&q_u->buffer, buf_size)) - { - return False; - } - q_u->buf_size = buf_size; - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_uint32("firstjob", ps, depth, &(q_u->firstjob)); - prs_uint32("numofjobs", ps, depth, &(q_u->numofjobs)); - prs_uint32("level", ps, depth, &(q_u->level)); - - spoolss_io_read_buffer("", ps, depth, &(q_u->buffer)); - - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob"); - depth++; - - prs_align(ps); - - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_uint32("jobid", ps, depth, &(q_u->jobid)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_setjob"); - depth++; - - prs_align(ps); - - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_q_setjob"); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_uint32("jobid", ps, depth, &(q_u->jobid)); - /* - * level is usually 0. If (level!=0) then I'm in trouble ! - * I will try to generate setjob command with level!=0, one day. - */ - prs_uint32("level", ps, depth, &(q_u->level)); - prs_uint32("command", ps, depth, &(q_u->command)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_enumdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - int i; - - prs_debug(ps, depth, desc, "spoolss_io_r_enumdrivers"); - depth++; - - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - - DEBUG(7,("Level [%d], number [%d]\n", r_u->level, r_u->numofdrivers)); - switch (r_u->level) - { - case 1: - { - DRIVER_INFO_1 *driver_info_1; - driver_info_1=r_u->driver.driver_info_1; - - for (i=0; i<r_u->numofdrivers; i++) - { - bufsize_required += spoolss_size_printer_driver_info_1(&(driver_info_1[i])); - } - break; - } - case 2: - { - DRIVER_INFO_2 *driver_info_2; - driver_info_2=r_u->driver.driver_info_2; - - for (i=0; i<r_u->numofdrivers; i++) - { - bufsize_required += spoolss_size_printer_driver_info_2(&(driver_info_2[i])); - } - break; - } - case 3: - { - DRIVER_INFO_3 *driver_info_3; - driver_info_3=r_u->driver.driver_info_3; - - for (i=0; i<r_u->numofdrivers; i++) - { - bufsize_required += spoolss_size_printer_driver_info_3(&(driver_info_3[i])); - } - break; - } - } - - DEBUGADD(7,("size needed: %d\n",bufsize_required)); - DEBUGADD(7,("size offered: %d\n",r_u->offered)); - - /* check if the buffer is big enough for the datas */ - - if (r_u->offered<bufsize_required) - { - - /* it's too small */ - r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */ - r_u->offered=0; /* don't send back the buffer */ - DEBUGADD(8,("buffer too small\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - } - else - { - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - - DEBUGADD(8,("buffer large enough\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - beginning=ps->offset; - start_offset=ps->offset; - end_offset=start_offset+r_u->offered; - - switch (r_u->level) - { - case 1: - { - DRIVER_INFO_1 *info; - for (i=0; i<r_u->numofdrivers; i++) - { - info = &(r_u->driver.driver_info_1[i]); - smb_io_printer_driver_info_1(desc, info, ps, depth, &start_offset, &end_offset); - } - break; - } - case 2: - { - DRIVER_INFO_2 *info; - for (i=0; i<r_u->numofdrivers; i++) - { - info = &(r_u->driver.driver_info_2[i]); - smb_io_printer_driver_info_2(desc, info, ps, depth, &start_offset, &end_offset); - } - break; - } - case 3: - { - DRIVER_INFO_3 *info; - for (i=0; i<r_u->numofdrivers; i++) - { - info = &(r_u->driver.driver_info_3[i]); - smb_io_printer_driver_info_3(desc, info, ps, depth, &start_offset, &end_offset); - } - break; - } - } - ps->offset=beginning+r_u->offered; - prs_align(ps); - } - - /* - * if the buffer was too small, send the minimum required size - * if it was too large, send the real needed size - */ - - prs_uint32("size of buffer needed", ps, depth, &(bufsize_required)); - prs_uint32("numofdrivers", ps, depth, &(r_u->numofdrivers)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth) -{ - - uint32 useless_ptr=0xADDE0FF0; - prs_debug(ps, depth, desc, ""); - depth++; - - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - smb_io_unistr2("", &(q_u->name),True,ps,depth); - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - smb_io_unistr2("", &(q_u->environment),True,ps,depth); - prs_align(ps); - prs_uint32("level", ps, depth, &(q_u->level)); - spoolss_io_read_buffer("", ps, depth, &(q_u->buffer)); - prs_align(ps); - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - int i; - - prs_debug(ps, depth, desc, "spoolss_io_r_enumforms"); - depth++; - - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - switch (r_u->level) - { - case 1: - { - FORM_1 *forms_1; - forms_1=r_u->forms_1; - - for (i=0; i<r_u->numofforms; i++) - { - bufsize_required += spoolss_size_form_1(&(forms_1[i])); - } - break; - } - } - - DEBUG(4,("spoolss_io_r_enumforms, size needed: %d\n",bufsize_required)); - DEBUG(4,("spoolss_io_r_enumforms, size offered: %d\n",r_u->offered)); - - /* check if the buffer is big enough for the datas */ - - if (r_u->offered<bufsize_required) - { - - /* it's too small */ - r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */ - r_u->offered=0; /* don't send back the buffer */ - - DEBUG(4,("spoolss_io_r_enumforms, buffer too small\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - } - else - { - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - - DEBUG(4,("spoolss_io_r_enumforms, buffer large enough\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - - if (r_u->offered!=0) - { - beginning=ps->offset; - start_offset=ps->offset; - end_offset=start_offset+r_u->offered; - - switch (r_u->level) - { - case 1: - { - FORM_1 *info; - for (i=0; i<r_u->numofforms; i++) - { - info = &(r_u->forms_1[i]); - smb_io_form_1(desc, info, ps, depth, &start_offset, &end_offset); - } - break; - } - } - ps->offset=beginning+r_u->offered; - prs_align(ps); - } - } - - /* - * if the buffer was too small, send the minimum required size - * if it was too large, send the real needed size - */ - - prs_uint32("size of buffer needed", ps, depth, &(bufsize_required)); - prs_uint32("numofforms", ps, depth, &(r_u->numofforms)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth) -{ - - prs_debug(ps, depth, desc, ""); - depth++; - - prs_align(ps); - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_uint32("level", ps, depth, &(q_u->level)); - spoolss_io_read_buffer("", ps, depth, &(q_u->buffer)); - prs_align(ps); - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - int i; - - prs_debug(ps, depth, desc, "spoolss_io_r_enumports"); - depth++; - - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - switch (r_u->level) - { - case 2: - { - PORT_INFO_2 *port_2; - port_2=r_u->port.port_info_2; - - for (i=0; i<r_u->numofports; i++) - { - bufsize_required += spoolss_size_port_info_2(&(port_2[i])); - } - break; - } - } - - DEBUG(4,("size needed: %d\n",bufsize_required)); - DEBUG(4,("size offered: %d\n",r_u->offered)); - - /* check if the buffer is big enough for the datas */ - if (r_u->offered<bufsize_required) - { - - /* it's too small */ - r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */ - r_u->offered=0; /* don't send back the buffer */ - - DEBUG(4,("buffer too small\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - } - else - { - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - - DEBUG(4,("buffer large enough\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - beginning=ps->offset; - start_offset=ps->offset; - end_offset=start_offset+r_u->offered; - - switch (r_u->level) - { - case 2: - { - PORT_INFO_2 *info; - for (i=0; i<r_u->numofports; i++) - { - info = &(r_u->port.port_info_2[i]); - smb_io_port_2(desc, info, ps, depth, &start_offset, &end_offset); - } - break; - } - } - ps->offset=beginning+r_u->offered; - prs_align(ps); - } - - /* - * if the buffer was too small, send the minimum required size - * if it was too large, send the real needed size - */ - - prs_uint32("size of buffer needed", ps, depth, &(bufsize_required)); - prs_uint32("numofports", ps, depth, &(r_u->numofports)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth) -{ - uint32 useless; - prs_debug(ps, depth, desc, ""); - depth++; - - prs_align(ps); - prs_uint32("useless", ps, depth, &useless); - smb_io_unistr2("", &(q_u->name),True,ps,depth); - prs_align(ps); - prs_uint32("level", ps, depth, &(q_u->level)); - spoolss_io_read_buffer("", ps, depth, &(q_u->buffer)); - prs_align(ps); - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} - - -/******************************************************************* -********************************************************************/ -BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 **q_u, prs_struct *ps, int depth) -{ - SPOOL_PRINTER_INFO_LEVEL_2 *il; - - prs_debug(ps, depth, desc, ""); - depth++; - - /* reading */ - if (ps->io) - { - il=(SPOOL_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2)); - ZERO_STRUCTP(il); - *q_u=il; - DEBUG(7,("lecture: memoire ok\n")); - } - else - { - il=*q_u; - } - - prs_align(ps); - - prs_uint32("servername_ptr", ps, depth, &(il->servername_ptr)); - prs_uint32("printername_ptr", ps, depth, &(il->printername_ptr)); - prs_uint32("sharename_ptr", ps, depth, &(il->sharename_ptr)); - prs_uint32("portname_ptr", ps, depth, &(il->portname_ptr)); - prs_uint32("drivername_ptr", ps, depth, &(il->drivername_ptr)); - prs_uint32("comment_ptr", ps, depth, &(il->comment_ptr)); - prs_uint32("location_ptr", ps, depth, &(il->location_ptr)); - prs_uint32("devmode_ptr", ps, depth, &(il->devmode_ptr)); - prs_uint32("sepfile_ptr", ps, depth, &(il->sepfile_ptr)); - prs_uint32("printprocessor_ptr", ps, depth, &(il->printprocessor_ptr)); - prs_uint32("datatype_ptr", ps, depth, &(il->datatype_ptr)); - prs_uint32("parameters_ptr", ps, depth, &(il->parameters_ptr)); - prs_uint32("secdesc_ptr", ps, depth, &(il->secdesc_ptr)); - - prs_uint32("attributes", ps, depth, &(il->attributes)); - prs_uint32("priority", ps, depth, &(il->priority)); - prs_uint32("default_priority", ps, depth, &(il->default_priority)); - prs_uint32("starttime", ps, depth, &(il->starttime)); - prs_uint32("untiltime", ps, depth, &(il->untiltime)); - prs_uint32("status", ps, depth, &(il->status)); - prs_uint32("cjobs", ps, depth, &(il->cjobs)); - prs_uint32("averageppm", ps, depth, &(il->averageppm)); - - smb_io_unistr2("", &(il->servername), il->servername_ptr, ps, depth); - smb_io_unistr2("", &(il->printername), il->printername_ptr, ps, depth); - smb_io_unistr2("", &(il->sharename), il->sharename_ptr, ps, depth); - smb_io_unistr2("", &(il->portname), il->portname_ptr, ps, depth); - smb_io_unistr2("", &(il->drivername), il->drivername_ptr, ps, depth); - smb_io_unistr2("", &(il->comment), il->comment_ptr, ps, depth); - smb_io_unistr2("", &(il->location), il->location_ptr, ps, depth); - smb_io_unistr2("", &(il->sepfile), il->sepfile_ptr, ps, depth); - smb_io_unistr2("", &(il->printprocessor), il->printprocessor_ptr, ps, depth); - smb_io_unistr2("", &(il->datatype), il->datatype_ptr, ps, depth); - smb_io_unistr2("", &(il->parameters), il->parameters_ptr, ps, depth); - - prs_align(ps); - - /* this code as nothing to do here !!! - - if (il->secdesc_ptr) - { - il->secdesc=NULL; - sec_io_desc_buf("", &(il->secdesc), ps, depth); - } - - */ - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth) -{ - uint32 useless; - uint32 level; - prs_debug(ps, depth, desc, ""); - depth++; - - prs_align(ps); - prs_uint32("info level", ps, depth, &level); - prs_uint32("useless", ps, depth, &useless); - - switch (level) - { - /* - * level 0 is used by setprinter when managing the queue - * (hold, stop, start a queue) - */ - case 0: - break; - /* - * level 2 is used by addprinter - * and by setprinter when updating printer's info - */ - case 2: - spool_io_printer_info_level_2("", &(il->info_2), ps, depth); - break; - } - - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spool_io_user_level_1(char *desc, SPOOL_USER_LEVEL_1 **q_u, prs_struct *ps, int depth) -{ - SPOOL_USER_LEVEL_1 *il; - prs_debug(ps, depth, desc, ""); - depth++; - - /* reading */ - if (ps->io) - { - il=(SPOOL_USER_LEVEL_1 *)malloc(sizeof(SPOOL_USER_LEVEL_1)); - ZERO_STRUCTP(il); - *q_u=il; - } - else - { - il=*q_u; - } - - prs_align(ps); - prs_uint32("size", ps, depth, &(il->size)); - prs_uint32("client_name_ptr", ps, depth, &(il->client_name_ptr)); - prs_uint32("user_name_ptr", ps, depth, &(il->user_name_ptr)); - prs_uint32("build", ps, depth, &(il->build)); - prs_uint32("major", ps, depth, &(il->major)); - prs_uint32("minor", ps, depth, &(il->minor)); - prs_uint32("processor", ps, depth, &(il->processor)); - - smb_io_unistr2("", &(il->client_name), il->client_name_ptr, ps, depth); - prs_align(ps); - smb_io_unistr2("", &(il->user_name), il->user_name_ptr, ps, depth); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spool_io_user_level(char *desc, SPOOL_USER_LEVEL *q_u, prs_struct *ps, int depth) -{ - uint32 useless; - uint32 level; - prs_debug(ps, depth, desc, "spool_io_user_level"); - depth++; - - prs_align(ps); - prs_uint32("info_level", ps, depth, &level); - prs_uint32("useless", ps, depth, &useless); - - switch (level) - { - case 1: - spool_io_user_level_1("", &(q_u->user_level_1), ps, depth); - break; - - } - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth) -{ - uint32 useless; - prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex"); - depth++; - - /* - * I think that's one of the few well written functions. - * the sub-structures are correctly parsed and analysed - * the info level are handled in a nice way. - */ - - prs_align(ps); - prs_uint32("useless", ps, depth, &useless); - smb_io_unistr2("", &(q_u->server_name),True,ps,depth); - prs_align(ps); - - prs_uint32("info_level", ps, depth, &(q_u->level)); - - spool_io_printer_info_level("", &(q_u->info), ps, depth); - - /* the 4 unknown are all 0 */ - - /* - * en fait ils sont pas inconnu - * par recoupement avec rpcSetPrinter - * c'est le devicemode - * et le security descriptor. - */ - - prs_uint32("unk0", ps, depth, &(q_u->unk0)); - prs_uint32("unk1", ps, depth, &(q_u->unk1)); - prs_uint32("unk2", ps, depth, &(q_u->unk2)); - prs_uint32("unk3", ps, depth, &(q_u->unk3)); - - prs_uint32("info_level", ps, depth, &(q_u->user_level)); - - spool_io_user_level("", &(q_u->user), ps, depth); - - return True; -} - - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex"); - depth++; - - smb_io_prt_hnd("printer handle",&(r_u->handle),ps,depth); - - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u, - prs_struct *ps, int depth) -{ - SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il; - - prs_debug(ps, depth, desc, ""); - depth++; - - /* reading */ - if (ps->io) - { - il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3)); - ZERO_STRUCTP(il); - *q_u=il; - DEBUG(1,("lecture: memoire ok\n")); - } - else - { - il=*q_u; - } - - prs_align(ps); - - prs_uint32("cversion", ps, depth, &(il->cversion)); - prs_uint32("name", ps, depth, &(il->name_ptr)); - prs_uint32("environment", ps, depth, &(il->environment_ptr)); - prs_uint32("driverpath", ps, depth, &(il->driverpath_ptr)); - prs_uint32("datafile", ps, depth, &(il->datafile_ptr)); - prs_uint32("configfile", ps, depth, &(il->configfile_ptr)); - prs_uint32("helpfile", ps, depth, &(il->helpfile_ptr)); - prs_uint32("monitorname", ps, depth, &(il->monitorname_ptr)); - prs_uint32("defaultdatatype", ps, depth, &(il->defaultdatatype_ptr)); - prs_uint32("dependentfilessize", ps, depth, &(il->dependentfilessize)); - prs_uint32("dependentfiles", ps, depth, &(il->dependentfiles_ptr)); - - prs_align(ps); - - smb_io_unistr2("", &(il->name), il->name_ptr, ps, depth); - smb_io_unistr2("", &(il->environment), il->environment_ptr, ps, depth); - smb_io_unistr2("", &(il->driverpath), il->driverpath_ptr, ps, depth); - smb_io_unistr2("", &(il->datafile), il->datafile_ptr, ps, depth); - smb_io_unistr2("", &(il->configfile), il->configfile_ptr, ps, depth); - smb_io_unistr2("", &(il->helpfile), il->helpfile_ptr, ps, depth); - smb_io_unistr2("", &(il->monitorname), il->monitorname_ptr, ps, depth); - smb_io_unistr2("", &(il->defaultdatatype), il->defaultdatatype_ptr, ps, depth); - - prs_align(ps); - if (il->dependentfiles_ptr) - smb_io_buffer5("", &(il->dependentfiles), ps, depth); - - - return True; -} - - -/******************************************************************* - convert a buffer of UNICODE strings null terminated - the buffer is terminated by a NULL - - convert to an ascii array (null terminated) - - dynamically allocate memory - -********************************************************************/ -BOOL uniarray_2_ascarray(BUFFER5 *buf5, char ***ar) -{ - char **array; - char *string; - char *destend; - char *dest; - uint32 n; - uint32 i; - - uint16 *src; - - if (buf5==NULL) return False; - - array=NULL; - n=0; - i=0; - src=buf5->buffer; - - string=(char *)malloc(sizeof(char)*buf5->buf_len); - - destend = string + buf5->buf_len; - dest=string; - - while (dest < destend) - { - *(dest++) = (char)*(src++); - } - - /* that ugly for the first one but that's working */ - array=(char **)Realloc(array, sizeof(char *)*(i+1)); - array[i++]=string; - - while ( n < buf5->buf_len ) - { - if ( *(string++) == '\0' ) - { - array=(char **)Realloc(array, sizeof(char *)*(i+1)); - array[i++]=string; - } - n++; - } - *ar=array; - - DEBUG(10,("Number of dependent files: [%d]\n", i-1)); - - return True; -} - -/******************************************************************* - read a UNICODE array with null terminated strings - and null terminated array - and size of array at beginning -********************************************************************/ -BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth) -{ - if (buffer==NULL) return False; - - buffer->undoc=0; - buffer->uni_str_len=buffer->uni_max_len; - - prs_uint32("buffer_size", ps, depth, &(buffer->uni_max_len)); - - prs_unistr2(True, "buffer ", ps, depth, buffer); - - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth) -{ - uint32 useless; - uint32 level; - prs_debug(ps, depth, desc, ""); - depth++; - - prs_align(ps); - prs_uint32("info level", ps, depth, &level); - prs_uint32("useless", ps, depth, &useless); - - switch (level) - { - case 3: - spool_io_printer_driver_info_level_3("", &(il->info_3), ps, depth); - break; - } - - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth) -{ - uint32 useless; - prs_debug(ps, depth, desc, ""); - depth++; - - prs_align(ps); - prs_uint32("useless", ps, depth, &useless); - smb_io_unistr2("", &(q_u->server_name),True,ps,depth); - prs_align(ps); - prs_uint32("info_level", ps, depth, &(q_u->level)); - - spool_io_printer_driver_info_level("", &(q_u->info), ps, depth); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, ""); - depth++; - - prs_uint32("status", ps, depth, &(q_u->status)); - - return True; -} - - -/******************************************************************* -********************************************************************/ -BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni, - NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc) -{ - NT_PRINTER_DRIVER_INFO_LEVEL_3 *d; - - DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n")); - - if (*asc==NULL) - { - *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3)); - ZERO_STRUCTP(*asc); - } - - d=*asc; - - d->cversion=uni->cversion; - - unistr2_to_ascii(d->name, &(uni->name), sizeof(d->name)-1); - unistr2_to_ascii(d->environment, &(uni->environment), sizeof(d->environment)-1); - unistr2_to_ascii(d->driverpath, &(uni->driverpath), sizeof(d->driverpath)-1); - unistr2_to_ascii(d->datafile, &(uni->datafile), sizeof(d->datafile)-1); - unistr2_to_ascii(d->configfile, &(uni->configfile), sizeof(d->configfile)-1); - unistr2_to_ascii(d->helpfile, &(uni->helpfile), sizeof(d->helpfile)-1); - unistr2_to_ascii(d->monitorname, &(uni->monitorname), sizeof(d->monitorname)-1); - unistr2_to_ascii(d->defaultdatatype, &(uni->defaultdatatype), sizeof(d->defaultdatatype)-1); - - DEBUGADD(8,( "version: %d\n", d->cversion)); - DEBUGADD(8,( "name: %s\n", d->name)); - DEBUGADD(8,( "environment: %s\n", d->environment)); - DEBUGADD(8,( "driverpath: %s\n", d->driverpath)); - DEBUGADD(8,( "datafile: %s\n", d->datafile)); - DEBUGADD(8,( "configfile: %s\n", d->configfile)); - DEBUGADD(8,( "helpfile: %s\n", d->helpfile)); - DEBUGADD(8,( "monitorname: %s\n", d->monitorname)); - DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype)); - - uniarray_2_ascarray(&(uni->dependentfiles), &(d->dependentfiles) ); - - return True; -} - -BOOL uni_2_asc_printer_info_2(SPOOL_PRINTER_INFO_LEVEL_2 *uni, - NT_PRINTER_INFO_LEVEL_2 **asc) -{ - NT_PRINTER_INFO_LEVEL_2 *d; - - DEBUG(7,("Converting from UNICODE to ASCII\n")); - - if (*asc==NULL) - { - DEBUGADD(8,("allocating memory\n")); - - *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2)); - ZERO_STRUCTP(*asc); - } - DEBUGADD(8,("start converting\n")); - - d=*asc; - - d->attributes=uni->attributes; - d->priority=uni->priority; - d->default_priority=uni->default_priority; - d->starttime=uni->starttime; - d->untiltime=uni->untiltime; - d->status=uni->status; - d->cjobs=uni->cjobs; - - unistr2_to_ascii(d->servername, &(uni->servername), sizeof(d->servername)-1); - unistr2_to_ascii(d->printername, &(uni->printername), sizeof(d->printername)-1); - unistr2_to_ascii(d->sharename, &(uni->sharename), sizeof(d->sharename)-1); - unistr2_to_ascii(d->portname, &(uni->portname), sizeof(d->portname)-1); - unistr2_to_ascii(d->drivername, &(uni->drivername), sizeof(d->drivername)-1); - unistr2_to_ascii(d->comment, &(uni->comment), sizeof(d->comment)-1); - unistr2_to_ascii(d->location, &(uni->location), sizeof(d->location)-1); - unistr2_to_ascii(d->sepfile, &(uni->sepfile), sizeof(d->sepfile)-1); - unistr2_to_ascii(d->printprocessor, &(uni->printprocessor), sizeof(d->printprocessor)-1); - unistr2_to_ascii(d->datatype, &(uni->datatype), sizeof(d->datatype)-1); - unistr2_to_ascii(d->parameters, &(uni->parameters), sizeof(d->parameters)-1); - - return True; -} - -BOOL convert_printer_info(SPOOL_PRINTER_INFO_LEVEL uni, - NT_PRINTER_INFO_LEVEL *printer, - uint32 level) -{ - switch (level) - { - case 2: - { - uni_2_asc_printer_info_2(uni.info_2, &(printer->info_2)); - break; - } - default: - break; - } - - - - return True; -} - -BOOL convert_printer_driver_info(SPOOL_PRINTER_DRIVER_INFO_LEVEL uni, - NT_PRINTER_DRIVER_INFO_LEVEL *printer, - uint32 level) -{ - switch (level) - { - case 3: - { - printer->info_3=NULL; - uni_2_asc_printer_driver_3(uni.info_3, &(printer->info_3)); - break; - } - default: - break; - } - - - - return True; -} - -BOOL convert_devicemode(DEVICEMODE devmode, NT_DEVICEMODE *nt_devmode) -{ - unistr_to_ascii(nt_devmode->devicename, - devmode.devicename.buffer, - 31); - - unistr_to_ascii(nt_devmode->formname, - devmode.formname.buffer, - 31); - - nt_devmode->specversion=devmode.specversion; - nt_devmode->driverversion=devmode.driverversion; - nt_devmode->size=devmode.size; - nt_devmode->driverextra=devmode.driverextra; - nt_devmode->fields=devmode.fields; - nt_devmode->orientation=devmode.orientation; - nt_devmode->papersize=devmode.papersize; - nt_devmode->paperlength=devmode.paperlength; - nt_devmode->paperwidth=devmode.paperwidth; - nt_devmode->scale=devmode.scale; - nt_devmode->copies=devmode.copies; - nt_devmode->defaultsource=devmode.defaultsource; - nt_devmode->printquality=devmode.printquality; - nt_devmode->color=devmode.color; - nt_devmode->duplex=devmode.duplex; - nt_devmode->yresolution=devmode.yresolution; - nt_devmode->ttoption=devmode.ttoption; - nt_devmode->collate=devmode.collate; - - nt_devmode->logpixels=devmode.logpixels; - nt_devmode->bitsperpel=devmode.bitsperpel; - nt_devmode->pelswidth=devmode.pelswidth; - nt_devmode->pelsheight=devmode.pelsheight; - nt_devmode->displayflags=devmode.displayflags; - nt_devmode->displayfrequency=devmode.displayfrequency; - nt_devmode->icmmethod=devmode.icmmethod; - nt_devmode->icmintent=devmode.icmintent; - nt_devmode->mediatype=devmode.mediatype; - nt_devmode->dithertype=devmode.dithertype; - nt_devmode->reserved1=devmode.reserved1; - nt_devmode->reserved2=devmode.reserved2; - nt_devmode->panningwidth=devmode.panningwidth; - nt_devmode->panningheight=devmode.panningheight; - - if (nt_devmode->driverextra != 0) - { - /* if we had a previous private delete it and make a new one */ - if (nt_devmode->private != NULL) - free(nt_devmode->private); - nt_devmode->private=(uint8 *)malloc(nt_devmode->driverextra * sizeof(uint8)); - memcpy(nt_devmode->private, devmode.private, nt_devmode->driverextra); - } - - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - - prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir"); - depth++; - - prs_align(ps); - - prs_uint32("pointer", ps, depth, &useless_ptr); - - switch (r_u->level) - { - case 1: - { - DRIVER_DIRECTORY_1 *driver_info_1; - driver_info_1=&(r_u->driver.driver_info_1); - - bufsize_required = size_of_relative_string(&(driver_info_1->name)); - break; - } - } - - DEBUG(4,("spoolss_io_r_getprinterdriverdir, size needed: %d\n",bufsize_required)); - DEBUG(4,("spoolss_io_r_getprinterdriverdir, size offered: %d\n",r_u->offered)); - - /* check if the buffer is big enough for the datas */ - - if (r_u->offered<bufsize_required) - { - - /* it's too small */ - r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */ - r_u->offered=0; /* don't send back the buffer */ - DEBUG(4,("spoolss_io_r_getprinterdriverdir, buffer too small\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - } - else - { - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - - DEBUG(4,("spoolss_io_r_getprinterdriverdir, buffer large enough\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - beginning=ps->offset; - start_offset=ps->offset; - end_offset=start_offset+r_u->offered; - - switch (r_u->level) - { - case 1: - { - DRIVER_DIRECTORY_1 *info; - info = &(r_u->driver.driver_info_1); - prs_unistr("name", ps, depth, &(info->name)); - /*smb_io_printer_driver_dir_1(desc, info, ps, depth, &start_offset, &end_offset);*/ - break; - } - } - ps->offset=beginning+r_u->offered; - prs_align(ps); - } - - /* - * if the buffer was too small, send the minimum required size - * if it was too large, send the real needed size - */ - - prs_uint32("size of buffer needed", ps, depth, &(bufsize_required)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth) -{ - - uint32 useless_ptr=0xADDE0FF0; - prs_debug(ps, depth, desc, ""); - depth++; - - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - smb_io_unistr2("", &(q_u->name),True,ps,depth); - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - smb_io_unistr2("", &(q_u->environment),True,ps,depth); - prs_align(ps); - prs_uint32("level", ps, depth, &(q_u->level)); - spoolss_io_read_buffer("", ps, depth, &(q_u->buffer)); - prs_align(ps); - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - int i; - - prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors"); - depth++; - - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - switch (r_u->level) - { - case 1: - { - PRINTPROCESSOR_1 *info_1; - info_1=r_u->info_1; - - for (i=0; i<r_u->numofprintprocessors; i++) - { - bufsize_required += spoolss_size_processor_info_1(&(info_1[i])); - } - break; - } - } - - DEBUG(4,("size needed: %d\n",bufsize_required)); - DEBUG(4,("size offered: %d\n",r_u->offered)); - - /* check if the buffer is big enough for the datas */ - if (r_u->offered<bufsize_required) - { - - /* it's too small */ - r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */ - r_u->offered=0; /* don't send back the buffer */ - - DEBUG(4,("buffer too small\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - } - else - { - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - - DEBUG(4,("buffer large enough\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - beginning=ps->offset; - start_offset=ps->offset; - end_offset=start_offset+r_u->offered; - - switch (r_u->level) - { - case 1: - { - PRINTPROCESSOR_1 *info_1; - for (i=0; i<r_u->numofprintprocessors; i++) - { - info_1 = &(r_u->info_1[i]); - smb_io_processor_info_1(desc, info_1, ps, depth, &start_offset, &end_offset); - } - break; - } - } - ps->offset=beginning+r_u->offered; - prs_align(ps); - } - - /* - * if the buffer was too small, send the minimum required size - * if it was too large, send the real needed size - */ - - prs_uint32("size of buffer needed", ps, depth, &(bufsize_required)); - prs_uint32("numofprintprocessors", ps, depth, &(r_u->numofprintprocessors)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth) -{ - uint32 useless; - prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors"); - depth++; - - prs_align(ps); - prs_uint32("useless", ps, depth, &useless); - smb_io_unistr2("", &(q_u->name),True,ps,depth); - prs_align(ps); - prs_uint32("useless", ps, depth, &useless); - smb_io_unistr2("", &(q_u->environment),True,ps,depth); - prs_align(ps); - prs_uint32("level", ps, depth, &(q_u->level)); - spoolss_io_read_buffer("", ps, depth, &(q_u->buffer)); - prs_align(ps); - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - int i; - - prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors"); - depth++; - - prs_align(ps); - prs_uint32("pointer", ps, depth, &useless_ptr); - switch (r_u->level) - { - case 1: - { - PRINTMONITOR_1 *info_1; - info_1=r_u->info_1; - - for (i=0; i<r_u->numofprintmonitors; i++) - { - bufsize_required += spoolss_size_monitor_info_1(&(info_1[i])); - } - break; - } - } - - DEBUG(4,("size needed: %d\n",bufsize_required)); - DEBUG(4,("size offered: %d\n",r_u->offered)); - - /* check if the buffer is big enough for the datas */ - if (r_u->offered<bufsize_required) - { - - /* it's too small */ - r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */ - r_u->offered=0; /* don't send back the buffer */ - - DEBUG(4,("buffer too small\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - } - else - { - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - - DEBUG(4,("buffer large enough\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - beginning=ps->offset; - start_offset=ps->offset; - end_offset=start_offset+r_u->offered; - - switch (r_u->level) - { - case 1: - { - PRINTMONITOR_1 *info_1; - for (i=0; i<r_u->numofprintmonitors; i++) - { - info_1 = &(r_u->info_1[i]); - smb_io_monitor_info_1(desc, info_1, ps, depth, &start_offset, &end_offset); - } - break; - } - } - ps->offset=beginning+r_u->offered; - prs_align(ps); - } - - /* - * if the buffer was too small, send the minimum required size - * if it was too large, send the real needed size - */ - - prs_uint32("size of buffer needed", ps, depth, &(bufsize_required)); - prs_uint32("numofprintmonitors", ps, depth, &(r_u->numofprintmonitors)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth) -{ - uint32 useless; - prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors"); - depth++; - - prs_align(ps); - prs_uint32("useless", ps, depth, &useless); - smb_io_unistr2("", &(q_u->name),True,ps,depth); - prs_align(ps); - prs_uint32("level", ps, depth, &(q_u->level)); - spoolss_io_read_buffer("", ps, depth, &(q_u->buffer)); - prs_align(ps); - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata"); - depth++; - - prs_align(ps); - prs_uint32("valuesize", ps, depth, &(r_u->valuesize)); - prs_unistr("value", ps, depth, &(r_u->value)); - prs_uint32("realvaluesize", ps, depth, &(r_u->realvaluesize)); - - prs_uint32("type", ps, depth, &(r_u->type)); - - prs_uint32("datasize", ps, depth, &(r_u->datasize)); - prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize); - prs_uint32("realdatasize", ps, depth, &(r_u->realdatasize)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata"); - depth++; - - prs_align(ps); - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_uint32("index", ps, depth, &(q_u->index)); - prs_uint32("valuesize", ps, depth, &(q_u->valuesize)); - prs_uint32("datasize", ps, depth, &(q_u->datasize)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata"); - depth++; - - prs_align(ps); - smb_io_prt_hnd("printer handle", &(q_u->handle), ps, depth); - smb_io_unistr2("", &(q_u->value), True, ps, depth); - - prs_align(ps); - - prs_uint32("type", ps, depth, &(q_u->type)); - - prs_uint32("max_len", ps, depth, &(q_u->max_len)); - - switch (q_u->type) - { - case 0x1: - case 0x3: - case 0x4: - case 0x7: - q_u->data=(uint8 *)malloc(q_u->max_len * sizeof(uint8)); - prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len); - prs_align(ps); - break; - } - - prs_uint32("real_len", ps, depth, &(q_u->real_len)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata"); - depth++; - - prs_align(ps); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL convert_specific_param(NT_PRINTER_PARAM **param, UNISTR2 value , uint32 type, uint8 *data, uint32 len) -{ - DEBUG(5,("converting a specific param struct\n")); - - if (*param == NULL) - { - *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM)); - ZERO_STRUCTP(*param); - DEBUGADD(6,("Allocated a new PARAM struct\n")); - } - unistr2_to_ascii((*param)->value, &value, sizeof((*param)->value)-1); - (*param)->type = type; - - /* le champ data n'est pas NULL termine */ - /* on stocke donc la longueur */ - - (*param)->data_len=len; - - (*param)->data=(uint8 *)malloc(len * sizeof(uint8)); - - memcpy((*param)->data, data, len); - - DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len)); - - return True; -} - -/******************************************************************* -********************************************************************/ -static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_addform"); - depth++; - prs_align(ps); - - if (ptr!=0) - { - prs_uint32("flags", ps, depth, &(f->flags)); - prs_uint32("name_ptr", ps, depth, &(f->name_ptr)); - prs_uint32("size_x", ps, depth, &(f->size_x)); - prs_uint32("size_y", ps, depth, &(f->size_y)); - prs_uint32("left", ps, depth, &(f->left)); - prs_uint32("top", ps, depth, &(f->top)); - prs_uint32("right", ps, depth, &(f->right)); - prs_uint32("bottom", ps, depth, &(f->bottom)); - - smb_io_unistr2("", &(f->name), f->name_ptr, ps, depth); - } - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth) -{ - uint32 useless_ptr=0; - prs_debug(ps, depth, desc, "spoolss_io_q_addform"); - depth++; - - prs_align(ps); - smb_io_prt_hnd("printer handle", &(q_u->handle), ps, depth); - prs_uint32("level", ps, depth, &(q_u->level)); - prs_uint32("level2", ps, depth, &(q_u->level2)); - - if (q_u->level==1) - { - prs_uint32("useless_ptr", ps, depth, &(useless_ptr)); - spoolss_io_addform("", &(q_u->form), useless_ptr, ps, depth); - } - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_addform"); - depth++; - - prs_align(ps); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth) -{ - uint32 useless_ptr=0; - prs_debug(ps, depth, desc, "spoolss_io_q_setform"); - depth++; - - prs_align(ps); - smb_io_prt_hnd("printer handle", &(q_u->handle), ps, depth); - smb_io_unistr2("", &(q_u->name), True, ps, depth); - - prs_align(ps); - - prs_uint32("level", ps, depth, &(q_u->level)); - prs_uint32("level2", ps, depth, &(q_u->level2)); - - if (q_u->level==1) - { - prs_uint32("useless_ptr", ps, depth, &(useless_ptr)); - spoolss_io_addform("", &(q_u->form), useless_ptr, ps, depth); - } - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth) -{ - prs_debug(ps, depth, desc, "spoolss_io_r_setform"); - depth++; - - prs_align(ps); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth) -{ - uint32 useless_ptr=0xADDE0FF0; - uint32 start_offset, end_offset, beginning; - uint32 bufsize_required=0; - - prs_debug(ps, depth, desc, "spoolss_io_r_getjob"); - depth++; - - prs_align(ps); - - prs_uint32("pointer", ps, depth, &useless_ptr); - - switch (r_u->level) - { - case 1: - { - JOB_INFO_1 *info; - info=r_u->job.job_info_1; - - bufsize_required += spoolss_size_job_info_1(info); - break; - } - case 2: - { - JOB_INFO_2 *info; - info=r_u->job.job_info_2; - - bufsize_required += spoolss_size_job_info_2(info); - break; - } - } - - DEBUG(4,("spoolss_io_r_getjob, size needed: %d\n",bufsize_required)); - DEBUG(4,("spoolss_io_r_getjob, size offered: %d\n",r_u->offered)); - - /* check if the buffer is big enough for the datas */ - if (r_u->offered<bufsize_required) - { - /* it's too small */ - r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */ - r_u->offered=0; /* don't send back the buffer */ - - DEBUG(4,("spoolss_io_r_getjob, buffer too small\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - } - else - { - mem_grow_data(&(ps->data), ps->io, r_u->offered, 0); - - DEBUG(4,("spoolss_io_r_enumjobs, buffer large enough\n")); - - prs_uint32("size of buffer", ps, depth, &(r_u->offered)); - beginning=ps->offset; - start_offset=ps->offset; - end_offset=start_offset+r_u->offered; - - switch (r_u->level) - { - case 1: - { - JOB_INFO_1 *info; - info = r_u->job.job_info_1; - smb_io_job_info_1(desc, info, ps, depth, &start_offset, &end_offset); - break; - } - case 2: - { - JOB_INFO_2 *info; - info = r_u->job.job_info_2; - smb_io_job_info_2(desc, info, ps, depth, &start_offset, &end_offset); - break; - } - - } - ps->offset=beginning+r_u->offered; - prs_align(ps); - } - - /* - * if the buffer was too small, send the minimum required size - * if it was too large, send the real needed size - */ - - prs_uint32("size of buffer needed", ps, depth, &(bufsize_required)); - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -********************************************************************/ -BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth) -{ - - prs_debug(ps, depth, desc, ""); - depth++; - - prs_align(ps); - - smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth); - prs_uint32("jobid", ps, depth, &(q_u->jobid)); - prs_uint32("level", ps, depth, &(q_u->level)); - - spoolss_io_read_buffer("", ps, depth, &(q_u->buffer)); - - prs_align(ps); - - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} diff --git a/source3/rpc_parse/parse_svc.c b/source3/rpc_parse/parse_svc.c deleted file mode 100644 index 08fed7d47c..0000000000 --- a/source3/rpc_parse/parse_svc.c +++ /dev/null @@ -1,936 +0,0 @@ - -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * Copyright (C) Paul Ashton 1997-1999. - * - * 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" - -extern int DEBUGLEVEL; - -/******************************************************************* - make_svc_q_open_sc_man - ********************************************************************/ -BOOL make_svc_q_open_sc_man(SVC_Q_OPEN_SC_MAN *q_u, - const char *server, const char *database, - uint32 des_access) -{ - DEBUG(5,("make_svc_q_open_sc_man\n")); - - make_buf_unistr2(&(q_u->uni_srv_name), &(q_u->ptr_srv_name), server); - make_buf_unistr2(&(q_u->uni_db_name ), &(q_u->ptr_db_name), database); - q_u->des_access = des_access; - - - return True; -} - -/******************************************************************* -reads or writes a SVC_Q_OPEN_SC_MAN structure. -********************************************************************/ -BOOL svc_io_q_open_sc_man(char *desc, SVC_Q_OPEN_SC_MAN *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_q_open_sc_man"); - depth++; - - prs_align(ps); - - prs_uint32("ptr_srv_name", ps, depth, &(q_u->ptr_srv_name)); - smb_io_unistr2("", &(q_u->uni_srv_name), q_u->ptr_srv_name, ps, depth); - prs_align(ps); - - prs_uint32("ptr_db_name", ps, depth, &(q_u->ptr_db_name)); - smb_io_unistr2("", &(q_u->uni_db_name), q_u->ptr_db_name, ps, depth); - prs_align(ps); - - prs_uint32("des_access", ps, depth, &(q_u->des_access)); - prs_align(ps); - - return True; -} - -/******************************************************************* - make_svc_r_open_sc_man - ********************************************************************/ -BOOL make_svc_r_open_sc_man(SVC_R_OPEN_SC_MAN *r_u, POLICY_HND *hnd, - uint32 status) -{ - DEBUG(5,("make_svc_r_unknown_0: %d\n", __LINE__)); - - memcpy(&(r_u->pol), hnd, sizeof(r_u->pol)); - r_u->status = status; - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_r_open_sc_man(char *desc, SVC_R_OPEN_SC_MAN *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_r_open_sc_man"); - depth++; - - prs_align(ps); - - smb_io_pol_hnd("", &(r_u->pol), ps, depth); - - prs_uint32("status ", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* - make_svc_q_open_service - ********************************************************************/ -BOOL make_svc_q_open_service(SVC_Q_OPEN_SERVICE *q_u, - POLICY_HND *hnd, - const char *server, - uint32 des_access) -{ - DEBUG(5,("make_svc_q_open_service\n")); - - memcpy(&(q_u->scman_pol), hnd, sizeof(q_u->scman_pol)); - make_unistr2(&(q_u->uni_svc_name), server, strlen(server)+1); - q_u->des_access = des_access; - - - return True; -} - -/******************************************************************* -reads or writes a SVC_Q_OPEN_SERVICE structure. -********************************************************************/ -BOOL svc_io_q_open_service(char *desc, SVC_Q_OPEN_SERVICE *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_q_open_service"); - depth++; - - prs_align(ps); - - smb_io_pol_hnd("", &(q_u->scman_pol), ps, depth); - prs_align(ps); - - smb_io_unistr2("", &(q_u->uni_svc_name), 1, ps, depth); - prs_align(ps); - - prs_uint32("des_access", ps, depth, &(q_u->des_access)); - prs_align(ps); - - return True; -} - -/******************************************************************* - make_svc_r_open_service - ********************************************************************/ -BOOL make_svc_r_open_service(SVC_R_OPEN_SERVICE *r_u, POLICY_HND *hnd, - uint32 status) -{ - DEBUG(5,("make_svc_r_unknown_0: %d\n", __LINE__)); - - memcpy(&(r_u->pol), hnd, sizeof(r_u->pol)); - r_u->status = status; - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_r_open_service(char *desc, SVC_R_OPEN_SERVICE *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_r_open_service"); - depth++; - - prs_align(ps); - - smb_io_pol_hnd("", &(r_u->pol), ps, depth); - - prs_uint32("status ", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -makes an SVC_Q_STOP_SERVICE structure. -********************************************************************/ -BOOL make_svc_q_stop_service(SVC_Q_STOP_SERVICE *q_c, POLICY_HND *hnd, - uint32 unk) -{ - if (q_c == NULL || hnd == NULL) return False; - - DEBUG(5,("make_svc_q_stop_service\n")); - - memcpy(&(q_c->pol), hnd, sizeof(q_c->pol)); - q_c->unknown = unk; - - return True; -} - -/******************************************************************* -reads or writes a SVC_Q_STOP_SERVICE structure. -********************************************************************/ -BOOL svc_io_q_stop_service(char *desc, SVC_Q_STOP_SERVICE *q_s, prs_struct *ps, int depth) -{ - if (q_s == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_q_stop_service"); - depth++; - - prs_align(ps); - smb_io_pol_hnd("", &(q_s->pol), ps, depth); - - prs_align(ps); - - prs_uint32("unknown", ps, depth, &(q_s->unknown)); - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_r_stop_service(char *desc, SVC_R_STOP_SERVICE *r_s, prs_struct *ps, int depth) -{ - if (r_s == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_r_stop_service"); - depth++; - - prs_uint32("unknown0", ps, depth, &(r_s->unknown0)); - prs_uint32("unknown1", ps, depth, &(r_s->unknown1)); - prs_uint32("unknown2", ps, depth, &(r_s->unknown2)); - prs_uint32("unknown3", ps, depth, &(r_s->unknown3)); - prs_uint32("unknown4", ps, depth, &(r_s->unknown4)); - prs_uint32("unknown5", ps, depth, &(r_s->unknown5)); - prs_uint32("unknown6", ps, depth, &(r_s->unknown6)); - prs_uint32("status", ps, depth, &(r_s->status)); - - return True; -} - -/******************************************************************* -makes an SVC_Q_START_SERVICE structure. -********************************************************************/ -BOOL make_svc_q_start_service(SVC_Q_START_SERVICE *q_c, POLICY_HND *hnd, - uint32 argc, - char **argv) -{ - uint32 i; - - if (q_c == NULL || hnd == NULL) return False; - - DEBUG(5,("make_svc_q_start_service\n")); - - memcpy(&(q_c->pol), hnd, sizeof(q_c->pol)); - q_c->argc = argc; - q_c->ptr_args = 1; - q_c->argc2 = argc; - - for (i = 0; i < argc; i++) - { - size_t len_argv = argv[i] != NULL ? strlen(argv[i])+1 : 0; - q_c->ptr_argv[i] = argv[i] != NULL ? 1 : 0; - make_unistr2(&(q_c->argv[i]), argv[i], len_argv); - } - - return True; -} - -/******************************************************************* -reads or writes a SVC_Q_START_SERVICE structure. -********************************************************************/ -BOOL svc_io_q_start_service(char *desc, SVC_Q_START_SERVICE *q_s, prs_struct *ps, int depth) -{ - if (q_s == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_q_start_service"); - depth++; - - prs_align(ps); - smb_io_pol_hnd("", &(q_s->pol), ps, depth); - - prs_align(ps); - prs_uint32("argc ", ps, depth, &(q_s->argc )); - prs_uint32("ptr_args", ps, depth, &(q_s->ptr_args)); - - if (q_s->ptr_args != 0) - { - uint32 i; - - prs_uint32("argc2 ", ps, depth, &(q_s->argc2)); - - if (q_s->argc2 > MAX_SVC_ARGS) - { - return False; - } - - for (i = 0; i < q_s->argc2; i++) - { - prs_uint32("", ps, depth, &(q_s->ptr_argv[i])); - } - for (i = 0; i < q_s->argc2; i++) - { - smb_io_unistr2("", &(q_s->argv[i]), q_s->ptr_argv[i], ps, depth); - prs_align(ps); - } - } - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_r_start_service(char *desc, SVC_R_START_SERVICE *r_s, prs_struct *ps, int depth) -{ - if (r_s == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_r_start_service"); - depth++; - - prs_uint32("status", ps, depth, &(r_s->status)); - - return True; -} - -/******************************************************************* - make_svc_query_svc_cfg - ********************************************************************/ -BOOL make_svc_query_svc_cfg(QUERY_SERVICE_CONFIG *q_u, - uint32 service_type, uint32 start_type, - uint32 error_control, - char* bin_path_name, char* load_order_grp, - uint32 tag_id, - char* dependencies, char* service_start_name, - char* disp_name) -{ - DEBUG(5,("make_svc_query_svc_cfg\n")); - - q_u->service_type = service_type; - q_u->start_type = start_type; - q_u->error_control = error_control; - make_buf_unistr2(&(q_u->uni_bin_path_name ), &(q_u->ptr_bin_path_name ), bin_path_name ); - make_buf_unistr2(&(q_u->uni_load_order_grp ), &(q_u->ptr_load_order_grp ), load_order_grp ); - q_u->tag_id = tag_id; - make_buf_unistr2(&(q_u->uni_dependencies ), &(q_u->ptr_dependencies ), dependencies ); - make_buf_unistr2(&(q_u->uni_service_start_name), &(q_u->ptr_service_start_name), service_start_name); - make_buf_unistr2(&(q_u->uni_display_name ), &(q_u->ptr_display_name ), disp_name ); - - return True; -} - -/******************************************************************* -reads or writes a QUERY_SERVICE_CONFIG structure. -********************************************************************/ -BOOL svc_io_query_svc_cfg(char *desc, QUERY_SERVICE_CONFIG *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_query_svc_cfg"); - depth++; - - prs_align(ps); - - prs_uint32("service_type ", ps, depth, &(q_u->service_type )); - prs_uint32("start_type ", ps, depth, &(q_u->start_type )); - prs_uint32("error_control ", ps, depth, &(q_u->error_control )); - prs_uint32("ptr_bin_path_name ", ps, depth, &(q_u->ptr_bin_path_name )); - prs_uint32("ptr_load_order_grp ", ps, depth, &(q_u->ptr_load_order_grp )); - prs_uint32("tag_id ", ps, depth, &(q_u->tag_id )); - prs_uint32("ptr_dependencies ", ps, depth, &(q_u->ptr_dependencies )); - prs_uint32("ptr_service_start_name", ps, depth, &(q_u->ptr_service_start_name)); - prs_uint32("ptr_display_name ", ps, depth, &(q_u->ptr_display_name )); - - smb_io_unistr2("uni_bin_path_name ", &(q_u->uni_bin_path_name ), q_u->ptr_bin_path_name , ps, depth); - prs_align(ps); - smb_io_unistr2("uni_load_order_grp ", &(q_u->uni_load_order_grp ), q_u->ptr_load_order_grp , ps, depth); - prs_align(ps); - smb_io_unistr2("uni_dependencies ", &(q_u->uni_dependencies ), q_u->ptr_dependencies , ps, depth); - prs_align(ps); - smb_io_unistr2("uni_service_start_name", &(q_u->uni_service_start_name), q_u->ptr_service_start_name, ps, depth); - prs_align(ps); - smb_io_unistr2("uni_display_name ", &(q_u->uni_display_name ), q_u->ptr_display_name , ps, depth); - prs_align(ps); - - return True; -} - -/******************************************************************* -makes an SVC_Q_ENUM_SVCS_STATUS structure. -********************************************************************/ -BOOL make_svc_q_enum_svcs_status(SVC_Q_ENUM_SVCS_STATUS *q_c, POLICY_HND *hnd, - uint32 service_type, uint32 service_state, - uint32 buf_size, uint32 resume_hnd ) -{ - if (q_c == NULL || hnd == NULL) return False; - - DEBUG(5,("make_svc_q_enum_svcs_status\n")); - - memcpy(&(q_c->pol), hnd, sizeof(q_c->pol)); - q_c->service_type = service_type; - q_c->service_state = service_state; - q_c->buf_size = buf_size; - make_enum_hnd(&q_c->resume_hnd, resume_hnd); - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_q_enum_svcs_status(char *desc, SVC_Q_ENUM_SVCS_STATUS *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_q_enum_svcs_status"); - depth++; - - prs_align(ps); - - smb_io_pol_hnd("", &(q_u->pol), ps, depth); - prs_align(ps); - - prs_uint32("service_type ", ps, depth, &(q_u->service_type )); - prs_uint32("service_state", ps, depth, &(q_u->service_state)); - prs_uint32("buf_size ", ps, depth, &(q_u->buf_size )); - smb_io_enum_hnd("resume_hnd", &(q_u->resume_hnd), ps, depth); - - return True; -} - -/******************************************************************* -makes an SVC_R_ENUM_SVCS_STATUS structure. -********************************************************************/ -BOOL make_svc_r_enum_svcs_status(SVC_R_ENUM_SVCS_STATUS *r_c, - ENUM_SRVC_STATUS *svcs, uint32 more_buf_size, - uint32 num_svcs, uint32 resume_hnd, - uint32 dos_status) -{ - if (r_c == NULL) return False; - - DEBUG(5,("make_svc_r_enum_svcs_status\n")); - - r_c->svcs = svcs; - r_c->more_buf_size = more_buf_size; - r_c->num_svcs = num_svcs; - make_enum_hnd(&r_c->resume_hnd, resume_hnd); - r_c->dos_status = dos_status; - - return True; -} - -/******************************************************************* -reads or writes a SVC_R_ENUM_SVCS_STATUS structure. - -this is another wierd structure. WHY oh WHY can the microsoft teams -not COMMUNICATE and get some CONSISTENCY TO THEIR DATA STRUCTURES! -ARGH! - -********************************************************************/ -BOOL svc_io_r_enum_svcs_status(char *desc, SVC_R_ENUM_SVCS_STATUS *svc, prs_struct *ps, int depth) -{ - uint32 i; - if (svc == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_r_enum_svcs_status"); - depth++; - - prs_align(ps); - - /* - * format is actually as laid out in SVC_R_ENUM_SVCS_STATUS. - * the reason for all the jumping about, which is horrible - * and can be avoided, is due to the use of offsets instead - * of pointers. - * - * if i ever find out that these offsets are in fact non-zero - * tokens just like pointer-tokens, i am going to go MAD. - */ - - if (ps->io) - { - /* reading */ - - uint32 buf_offset; - uint32 new_offset; - - prs_uint32("buf_size", ps, depth, &(svc->buf_size)); - - buf_offset = ps->offset; - ps->offset = buf_offset + svc->buf_size; - - prs_align(ps); - - prs_uint32("more_buf_size", ps, depth, &(svc->more_buf_size)); - prs_uint32("num_svcs", ps, depth, &(svc->num_svcs)); - smb_io_enum_hnd("resume_hnd", &(svc->resume_hnd), ps, depth); - prs_uint32("dos_status", ps, depth, &(svc->dos_status)); - - new_offset = ps->offset; - ps->offset = buf_offset; - - svc->svcs = (ENUM_SRVC_STATUS*)Realloc(NULL, - svc->num_svcs * sizeof(ENUM_SRVC_STATUS)); - - if (svc->svcs == NULL) - { - DEBUG(0,("svc_io_r_enum_svcs_status: Realloc failed\n")); - ps->offset = 0x7fffffff; - return False; - } - - bzero(svc->svcs, svc->num_svcs * sizeof(ENUM_SRVC_STATUS)); - - for (i = 0; i < svc->num_svcs; i++) - { - fstring name; - uint32 old_offset; - uint32 srvc_offset; - uint32 disp_offset; - - prs_uint32("srvc_offset", ps, depth, &srvc_offset); - prs_uint32("disp_offset", ps, depth, &disp_offset); - svc_io_svc_status("status", &svc->svcs[i].status, ps, depth); - - old_offset = ps->offset; - - ps->offset = buf_offset + srvc_offset; - slprintf(name, sizeof(name)-1, "srvc[%02d]", i); - smb_io_unistr(name, &svc->svcs[i].uni_srvc_name, ps, depth); - - ps->offset = buf_offset + disp_offset; - slprintf(name, sizeof(name)-1, "disp[%02d]", i); - smb_io_unistr(name, &svc->svcs[i].uni_disp_name, ps, depth); - - ps->offset = old_offset; - } - - ps->offset = new_offset; - } - else - { - /* writing */ - - uint32 buf_offset; - uint32 old_buf_offset; - uint32 srvc_offset = 9 * sizeof(uint32) * svc->num_svcs; - - prs_uint32_pre("buf_size", ps, depth, &svc->buf_size, &buf_offset); - old_buf_offset = ps->offset; - - srvc_offset += old_buf_offset; - - if (svc->svcs == NULL) - { - return False; - } - - for (i = 0; i < svc->num_svcs; i++) - { - fstring name; - uint32 old_offset; - - /* - * store unicode string offset and unicode string - */ - - srvc_offset -= old_buf_offset; - prs_uint32("srvc_offset", ps, depth, &srvc_offset); - srvc_offset += old_buf_offset; - - slprintf(name, sizeof(name)-1, "srvc[%02d]", i); - - old_offset = ps->offset; - ps->offset = srvc_offset; - smb_io_unistr(name, &svc->svcs[i].uni_srvc_name, ps, depth); - srvc_offset = ps->offset; - ps->offset = old_offset; - - /* - * store unicode string offset and unicode string - */ - - srvc_offset -= old_buf_offset; - prs_uint32("disp_offset", ps, depth, &srvc_offset); - srvc_offset += old_buf_offset; - - slprintf(name, sizeof(name)-1, "disp[%02d]", i); - - old_offset = ps->offset; - ps->offset = srvc_offset; - smb_io_unistr(name, &svc->svcs[i].uni_disp_name, ps, depth); - srvc_offset = ps->offset; - ps->offset = old_offset; - - /* - * store status info - */ - - svc_io_svc_status("status", &svc->svcs[i].status, ps, depth); - } - - prs_uint32_post("buf_size", ps, depth, &svc->buf_size, buf_offset, srvc_offset - buf_offset - sizeof(uint32)); - - ps->offset = srvc_offset; - - prs_align(ps); - - prs_uint32("more_buf_size", ps, depth, &(svc->more_buf_size)); - prs_uint32("num_svcs", ps, depth, &(svc->num_svcs)); - smb_io_enum_hnd("resume_hnd", &(svc->resume_hnd), ps, depth); - prs_uint32("dos_status", ps, depth, &(svc->dos_status)); - } - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_svc_status(char *desc, SVC_STATUS *svc, prs_struct *ps, int depth) -{ - if (svc == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_svc_status"); - depth++; - - prs_align(ps); - - prs_uint32("svc_type", ps, depth, &(svc->svc_type)); - prs_uint32("current_state", ps, depth, &(svc->current_state)); - prs_uint32("controls_accepted", ps, depth, &(svc->controls_accepted)); - prs_uint32("win32_exit_code", ps, depth, &(svc->win32_exit_code)); - prs_uint32("svc_specific_exit_code", ps, depth, &(svc->svc_specific_exit_code)); - prs_uint32("check_point", ps, depth, &(svc->check_point)); - prs_uint32("wait_hint", ps, depth, &(svc->wait_hint)); - - return True; -} - -/******************************************************************* -makes an SVC_Q_QUERY_SVC_CONFIG structure. -********************************************************************/ -BOOL make_svc_q_query_svc_config(SVC_Q_QUERY_SVC_CONFIG *q_c, POLICY_HND *hnd, - uint32 buf_size) -{ - if (q_c == NULL || hnd == NULL) return False; - - DEBUG(5,("make_svc_q_query_svc_config\n")); - - memcpy(&(q_c->pol), hnd, sizeof(q_c->pol)); - q_c->buf_size = buf_size; - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_q_query_svc_config(char *desc, SVC_Q_QUERY_SVC_CONFIG *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_q_query_svc_config"); - depth++; - - prs_align(ps); - - smb_io_pol_hnd("", &(q_u->pol), ps, depth); - prs_align(ps); - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} - -/******************************************************************* -makes an SVC_R_QUERY_SVC_CONFIG structure. -********************************************************************/ -BOOL make_svc_r_query_svc_config(SVC_R_QUERY_SVC_CONFIG *r_c, - QUERY_SERVICE_CONFIG *cfg, - uint32 buf_size) -{ - if (r_c == NULL) return False; - - DEBUG(5,("make_svc_r_query_svc_config\n")); - - r_c->cfg = cfg; - r_c->buf_size = buf_size; - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_r_query_svc_config(char *desc, SVC_R_QUERY_SVC_CONFIG *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_r_query_svc_config"); - depth++; - - prs_align(ps); - - svc_io_query_svc_cfg("cfg", r_u->cfg, ps, depth); - prs_uint32("buf_size", ps, depth, &(r_u->buf_size)); - prs_uint32("status ", ps, depth, &(r_u->status )); - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_q_query_disp_name(char *desc, SVC_Q_QUERY_DISP_NAME *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_q_query_disp_name"); - depth++; - - prs_align(ps); - - smb_io_pol_hnd("", &(q_u->scman_pol), ps, depth); - prs_align(ps); - - smb_io_unistr2("uni_svc_name", &(q_u->uni_svc_name), 1, ps, depth); - prs_align(ps); - - prs_uint32("buf_size", ps, depth, &(q_u->buf_size)); - - return True; -} - -/******************************************************************* -makes an SVC_R_QUERY_DISP_NAME structure. -********************************************************************/ -BOOL make_svc_r_query_disp_name(SVC_R_QUERY_DISP_NAME *r_d, - char *disp_name, uint32 status) -{ - uint32 len = strlen(disp_name); - - if (r_d == NULL) return False; - - DEBUG(5,("make_svc_r_query_disp_name\n")); - - make_unistr2(&(r_d->uni_disp_name), disp_name, len+1); - r_d->buf_size = len; - - r_d->status = status; - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_r_query_disp_name(char *desc, SVC_R_QUERY_DISP_NAME *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_r_query_disp_name"); - depth++; - - prs_align(ps); - - smb_io_unistr2("uni_disp_name", &(r_u->uni_disp_name), 1, ps, depth); - prs_align(ps); - - prs_uint32("buf_size", ps, depth, &(r_u->buf_size)); - prs_uint32("status ", ps, depth, &(r_u->status )); - - return True; -} - -/******************************************************************* -makes an SVC_Q_CLOSE structure. -********************************************************************/ -BOOL make_svc_q_close(SVC_Q_CLOSE *q_c, POLICY_HND *hnd) -{ - if (q_c == NULL || hnd == NULL) return False; - - DEBUG(5,("make_svc_q_close\n")); - - memcpy(&(q_c->pol), hnd, sizeof(q_c->pol)); - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_q_close(char *desc, SVC_Q_CLOSE *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_q_close"); - depth++; - - prs_align(ps); - - smb_io_pol_hnd("", &(q_u->pol), ps, depth); - prs_align(ps); - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_r_close(char *desc, SVC_R_CLOSE *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_r_close"); - depth++; - - prs_align(ps); - - smb_io_pol_hnd("", &(r_u->pol), ps, depth); - prs_align(ps); - - prs_uint32("status", ps, depth, &(r_u->status)); - - return True; -} - -/******************************************************************* -makes an SVC_Q_CHANGE_SVC_CONFIG structure. -********************************************************************/ -BOOL make_svc_q_change_svc_config(SVC_Q_CHANGE_SVC_CONFIG *q_u, POLICY_HND *hnd, - uint32 service_type, uint32 start_type, - uint32 unknown_0, - uint32 error_control, - char* bin_path_name, char* load_order_grp, - uint32 tag_id, - char* dependencies, char* service_start_name, - char* password, - char* disp_name) -{ - if (q_u == NULL || hnd == NULL) return False; - - DEBUG(5,("make_svc_q_change_svc_config\n")); - - memcpy(&(q_u->pol), hnd, sizeof(q_u->pol)); - - q_u->service_type = service_type; - q_u->start_type = start_type; - q_u->unknown_0 = unknown_0; - q_u->error_control = error_control; - make_buf_unistr2(&(q_u->uni_bin_path_name ), &(q_u->ptr_bin_path_name ), bin_path_name ); - make_buf_unistr2(&(q_u->uni_load_order_grp ), &(q_u->ptr_load_order_grp ), load_order_grp ); - q_u->tag_id = tag_id; - make_buf_unistr2(&(q_u->uni_dependencies ), &(q_u->ptr_dependencies ), dependencies ); - make_buf_unistr2(&(q_u->uni_service_start_name), &(q_u->ptr_service_start_name), service_start_name); - make_buf_string2(&(q_u->str_password ), &(q_u->ptr_password ), password ); - make_buf_unistr2(&(q_u->uni_display_name ), &(q_u->ptr_display_name ), disp_name ); - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_q_change_svc_config(char *desc, SVC_Q_CHANGE_SVC_CONFIG *q_u, prs_struct *ps, int depth) -{ - if (q_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_q_change_svc_config"); - depth++; - - prs_align(ps); - - smb_io_pol_hnd("", &(q_u->pol), ps, depth); - prs_align(ps); - - prs_uint32("service_type ", ps, depth, &(q_u->service_type )); - prs_uint32("start_type ", ps, depth, &(q_u->start_type )); - prs_uint32("unknown_0 ", ps, depth, &(q_u->unknown_0 )); - prs_uint32("error_control ", ps, depth, &(q_u->error_control )); - prs_uint32("ptr_bin_path_name ", ps, depth, &(q_u->ptr_bin_path_name )); - smb_io_unistr2("uni_bin_path_name ", &(q_u->uni_bin_path_name ), q_u->ptr_bin_path_name , ps, depth); - prs_align(ps); - - prs_uint32("ptr_load_order_grp ", ps, depth, &(q_u->ptr_load_order_grp )); - smb_io_unistr2("uni_load_order_grp ", &(q_u->uni_load_order_grp ), q_u->ptr_load_order_grp , ps, depth); - prs_align(ps); - prs_uint32("tag_id ", ps, depth, &(q_u->tag_id )); - prs_uint32("ptr_dependencies ", ps, depth, &(q_u->ptr_dependencies )); - smb_io_unistr2("uni_dependencies ", &(q_u->uni_dependencies ), q_u->ptr_dependencies , ps, depth); - prs_align(ps); - prs_uint32("ptr_service_start_name", ps, depth, &(q_u->ptr_service_start_name)); - smb_io_unistr2("uni_service_start_name", &(q_u->uni_service_start_name), q_u->ptr_service_start_name, ps, depth); - prs_align(ps); - prs_uint32("ptr_password ", ps, depth, &(q_u->ptr_password )); - - smb_io_string2("str_password ", &(q_u->str_password ), q_u->ptr_display_name , ps, depth); - prs_align(ps); - - prs_uint32("ptr_display_name ", ps, depth, &(q_u->ptr_display_name )); - smb_io_unistr2("uni_display_name ", &(q_u->uni_display_name ), q_u->ptr_display_name , ps, depth); - prs_align(ps); - - return True; -} - -/******************************************************************* -makes an SVC_R_CHANGE_SVC_CONFIG structure. -********************************************************************/ -BOOL make_svc_r_change_svc_config(SVC_R_CHANGE_SVC_CONFIG *r_c, - uint32 unknown_0, uint32 status) -{ - if (r_c == NULL) return False; - - DEBUG(5,("make_svc_r_change_svc_config\n")); - - r_c->unknown_0 = unknown_0; - r_c->status = status; - - return True; -} - -/******************************************************************* -reads or writes a structure. -********************************************************************/ -BOOL svc_io_r_change_svc_config(char *desc, SVC_R_CHANGE_SVC_CONFIG *r_u, prs_struct *ps, int depth) -{ - if (r_u == NULL) return False; - - prs_debug(ps, depth, desc, "svc_io_r_change_svc_config"); - depth++; - - prs_align(ps); - - prs_uint32("unknown_0", ps, depth, &(r_u->unknown_0)); - prs_uint32("status ", ps, depth, &(r_u->status )); - - return True; -} - diff --git a/source3/rpc_server/srv_brs.c b/source3/rpc_server/srv_brs.c deleted file mode 100644 index c9abab20be..0000000000 --- a/source3/rpc_server/srv_brs.c +++ /dev/null @@ -1,98 +0,0 @@ - -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1999, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - * - * 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 "nterr.h" - -extern int DEBUGLEVEL; -extern pstring global_myname; - - -/******************************************************************* - create_brs_info_100 - ********************************************************************/ -static void create_brs_info_100(BRS_INFO_100 *inf) -{ - DEBUG(5,("create_brs_info_100: %d\n", __LINE__)); - - make_brs_info_100(inf); -} - -/******************************************************************* - brs_reply_query_info - - only supports info level 100 at the moment. - - ********************************************************************/ -static void brs_reply_query_info(BRS_Q_QUERY_INFO *q_u, - prs_struct *rdata, - int status) -{ - BRS_R_QUERY_INFO r_u; - BRS_INFO_100 brs100; - - DEBUG(5,("brs_query_info: %d\n", __LINE__)); - - create_brs_info_100(&brs100); - make_brs_r_query_info(&r_u, q_u->switch_value1, &brs100, status); - - /* store the response in the SMB stream */ - brs_io_r_query_info("", &r_u, rdata, 0); - - DEBUG(5,("brs_query_info: %d\n", __LINE__)); -} - -/******************************************************************* - api_brs_query_info - ********************************************************************/ -static void api_brs_query_info( rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata ) -{ - BRS_Q_QUERY_INFO q_u; - - /* grab the net share enum */ - brs_io_q_query_info("", &q_u, data, 0); - - /* construct reply. always indicate success */ - brs_reply_query_info(&q_u, rdata, 0x0); -} - - -/******************************************************************* - \PIPE\brssvc commands - ********************************************************************/ -struct api_struct api_brs_cmds[] = -{ - { "BRS_Q_QUERY_INFO", BRS_QUERY_INFO, api_brs_query_info }, - { NULL , 0 , NULL } -}; - -/******************************************************************* - receives a browser pipe and responds. - ********************************************************************/ -BOOL api_brs_rpc(rpcsrv_struct *p, prs_struct *data) -{ - return api_rpcTNP(p, "api_brs_rpc", api_brs_cmds, data); -} - diff --git a/source3/rpc_server/srv_sid.c b/source3/rpc_server/srv_sid.c deleted file mode 100644 index 6552e0963b..0000000000 --- a/source3/rpc_server/srv_sid.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1998 - - 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. -*/ - -/* this module is retired, is is called lib/sids.c */ diff --git a/source3/rpc_server/srv_spoolss.c b/source3/rpc_server/srv_spoolss.c deleted file mode 100755 index aff896edfd..0000000000 --- a/source3/rpc_server/srv_spoolss.c +++ /dev/null @@ -1,3781 +0,0 @@ -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1998, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1998, - * Copyright (C) Jean François Micouleau 1998-1999. - * - * 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 "nterr.h" - -extern int DEBUGLEVEL; -extern pstring global_myname; - -#ifndef MAX_OPEN_PRINTER_EXS -#define MAX_OPEN_PRINTER_EXS 50 -#endif - -#define PRINTER_HANDLE_IS_PRINTER 0 -#define PRINTER_HANDLE_IS_PRINTSERVER 1 - - -/* structure to store the printer handles */ -/* and a reference to what it's pointing to */ -/* and the notify info asked about */ -/* that's the central struct */ -static struct -{ - BOOL open; - BOOL document_started; - BOOL page_started; - uint32 current_jobid; - uint32 document_fd; - uint32 document_lastwritten; - pstring document_name; - pstring job_name; - POLICY_HND printer_hnd; - BOOL printer_type; - union - { - fstring printername; - fstring printerservername; - } dev; - uint32 type; - uint32 access; - uint32 number_of_notify; - SPOOL_NOTIFY_OPTION_TYPE notify_info[MAX_PRINTER_NOTIFY+MAX_JOB_NOTIFY]; -} Printer[MAX_OPEN_PRINTER_EXS]; - -#define VALID_HANDLE(pnum) (((pnum) >= 0) && ((pnum) < MAX_OPEN_PRINTER_EXS)) -#define OPEN_HANDLE(pnum) (VALID_HANDLE(pnum) && Printer[pnum].open) - -/**************************************************************************** - initialise printer handle states... -****************************************************************************/ -void init_printer_hnd(void) -{ - int i; - for (i = 0; i < MAX_OPEN_PRINTER_EXS; i++) - { - Printer[i].open = False; - } -} - - -/**************************************************************************** - create a unique printer handle -****************************************************************************/ -static void create_printer_hnd(POLICY_HND *hnd) -{ - static uint32 prt_hnd_low = 0; - static uint32 prt_hnd_high = 0; - - if (hnd == NULL) return; - - /* i severely doubt that prt_hnd_high will ever be non-zero... */ - prt_hnd_low++; - if (prt_hnd_low == 0) prt_hnd_high++; - - SIVAL(hnd->data, 0 , 0x0); /* first bit must be null */ - SIVAL(hnd->data, 4 , prt_hnd_low ); /* second bit is incrementing */ - SIVAL(hnd->data, 8 , prt_hnd_high); /* second bit is incrementing */ - SIVAL(hnd->data, 12, time(NULL)); /* something random */ - SIVAL(hnd->data, 16, getpid()); /* something more random */ -} - -/**************************************************************************** - clear an handle -****************************************************************************/ -static void clear_handle(POLICY_HND *hnd) -{ - bzero(hnd->data, POLICY_HND_SIZE); -} - -/**************************************************************************** - find first available printer slot. creates a printer handle for you. - ****************************************************************************/ -static BOOL open_printer_hnd(POLICY_HND *hnd) -{ - int i; - - for (i = 0; i < MAX_OPEN_PRINTER_EXS; i++) - { - if (!Printer[i].open) - { - Printer[i].open = True; - create_printer_hnd(hnd); - memcpy(&(Printer[i].printer_hnd), hnd, sizeof(*hnd)); - - DEBUG(4,("Opened printer handle[%x] ", i)); - dump_data(4, hnd->data, sizeof(hnd->data)); - return True; - } - } - DEBUG(1,("ERROR - open_printer_hnd: out of Printers Handles!\n")); - return False; -} - -/**************************************************************************** - find printer index by handle -****************************************************************************/ -static int find_printer_index_by_hnd(POLICY_HND *hnd) -{ - int i; - - for (i = 0; i < MAX_OPEN_PRINTER_EXS; i++) - { - if (memcmp(&(Printer[i].printer_hnd), hnd, sizeof(*hnd)) == 0) - { - DEBUG(4,("Found printer handle[%x] ", i)); - dump_data(4, hnd->data, sizeof(hnd->data)); - return i; - } - } - DEBUG(3,("Whoops, Printer handle not found: ")); - dump_data(4, hnd->data, sizeof(hnd->data)); - return -1; -} - -/**************************************************************************** - set printer handle type. -****************************************************************************/ -static BOOL set_printer_hnd_accesstype(POLICY_HND *hnd, uint32 access_required) -{ - int pnum = find_printer_index_by_hnd(hnd); - - if (OPEN_HANDLE(pnum)) - { - DEBUG(4,("Setting printer access=%x (pnum=%x)\n", - access_required, pnum)); - - - - Printer[pnum].access = access_required; - return True; - } - else - { - DEBUG(4,("Error setting printer type=%x (pnum=%x)", - access_required, pnum)); - return False; - } - return False; -} - -/**************************************************************************** - set printer handle type. -****************************************************************************/ -static BOOL set_printer_hnd_printertype(POLICY_HND *hnd, char *printername) -{ - int pnum = find_printer_index_by_hnd(hnd); - - if (OPEN_HANDLE(pnum)) - { - DEBUG(3,("Setting printer type=%s (pnum=%x)\n", printername, pnum)); - - if ( strlen(printername) < 3 ) - { - DEBUGADD(4,("A print server must have at least 1 char ! %s\n", printername)); - return False; - } - - /* check if it's \\server or \\server\printer */ - /* +2 is to skip the leading \\ */ - if (!strchr(printername+2, '\\')) - { - /* it's a print server */ - DEBUGADD(4,("Printer is a print server\n")); - Printer[pnum].printer_type = PRINTER_HANDLE_IS_PRINTSERVER; - return True; - } - else - { - /* it's a printer */ - DEBUGADD(4,("Printer is a printer\n")); - Printer[pnum].printer_type = PRINTER_HANDLE_IS_PRINTER; - return True; - } - } - else - { - DEBUGADD(4,("Error setting printer name %s (pnum=%x)", - printername, pnum)); - return False; - } - return False; -} - -/**************************************************************************** - set printer handle printername. -****************************************************************************/ -static BOOL set_printer_hnd_printername(POLICY_HND *hnd, char *printername) -{ - int pnum = find_printer_index_by_hnd(hnd); - char *back; - NT_PRINTER_INFO_LEVEL printer; - int snum; - int n_services=lp_numservices(); - uint32 marche; - - if (OPEN_HANDLE(pnum)) - { - DEBUG(4,("Setting printer name=%s (len=%d) (pnum=%x)\n", - printername,strlen(printername), pnum)); - - switch (Printer[pnum].printer_type) - { - case PRINTER_HANDLE_IS_PRINTER: - back=strchr(printername+2, '\\'); - back=back+1; - DEBUGADD(5,("searching for %s (len=%d)\n", back,strlen(back))); - /* - * store the Samba share name in it - * in back we have the long printer name - * need to iterate all the snum and do a - * get_a_printer each time to find the printer - * faster to do it here than later. - */ - for (snum=0;snum<n_services; snum++) - { - if (lp_browseable(snum) && - lp_snum_ok(snum) && - lp_print_ok(snum) ) - { - DEBUGADD(5,("share:%s\n",lp_servicename(snum))); - - marche=get_a_printer(&printer, 2, lp_servicename(snum)); - DEBUGADD(6,("marche:%d\n",marche)); - - if ( marche==0 && ( strlen(printer.info_2->printername) == strlen(back) ) - && ( !strncasecmp(printer.info_2->printername, back, strlen(back))) - ) - { - DEBUGADD(4,("Printer found: %s[%x]\n",lp_servicename(snum),snum)); - ZERO_STRUCT(Printer[pnum].dev.printername); - strncpy(Printer[pnum].dev.printername, lp_servicename(snum), strlen(lp_servicename(snum))); - free_a_printer(printer, 2); - return True; - break; - } - free_a_printer(printer, 2); - } - } - - return False; - break; - case PRINTER_HANDLE_IS_PRINTSERVER: - ZERO_STRUCT(Printer[pnum].dev.printerservername); - strncpy(Printer[pnum].dev.printerservername, printername, strlen(printername)); - return True; - break; - default: - return False; - break; - } - } - else - { - DEBUG(0,("Error setting printer name=%s (pnum=%x)\n", - printername , pnum)); - return False; - } -} - -/**************************************************************************** - return the snum of a printer corresponding to an handle -****************************************************************************/ -static BOOL get_printer_snum(POLICY_HND *hnd, int *number) -{ - int snum; - int pnum = find_printer_index_by_hnd(hnd); - int n_services=lp_numservices(); - - if (OPEN_HANDLE(pnum)) - { - switch (Printer[pnum].printer_type) - { - case PRINTER_HANDLE_IS_PRINTER: - DEBUG(4,("short name:%s\n", Printer[pnum].dev.printername)); - for (snum=0;snum<n_services; snum++) - { - if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) - { - DEBUG(4,("share:%s\n",lp_servicename(snum))); - if ( ( strlen(lp_servicename(snum)) == strlen( Printer[pnum].dev.printername ) ) - && ( !strncasecmp(lp_servicename(snum), - Printer[pnum].dev.printername, - strlen( lp_servicename(snum) ))) - ) - { - DEBUG(4,("Printer found: %s[%x]\n",lp_servicename(snum),snum)); - *number=snum; - return True; - break; - } - } - } - return False; - break; - case PRINTER_HANDLE_IS_PRINTSERVER: - return False; - break; - default: - return False; - break; - } - } - else - { - DEBUG(3,("Error getting printer - take a nap quickly !\n")); - return False; - } -} - -/******************************************************************** - ********************************************************************/ -static BOOL handle_is_printserver(POLICY_HND *handle) -{ - int pnum=find_printer_index_by_hnd(handle); - - if (OPEN_HANDLE(pnum)) - { - switch (Printer[pnum].printer_type) - { - case PRINTER_HANDLE_IS_PRINTSERVER: - return True; - break; - case PRINTER_HANDLE_IS_PRINTER: - return False; - break; - } - } - return False; -} - -/******************************************************************** - ********************************************************************/ -/* -static BOOL handle_is_printer(POLICY_HND *handle) -{ - return (!handle_is_printserver(handle)); -} -*/ - -/******************************************************************** - * api_spoolss_open_printer - * - * called from the spoolss dispatcher - ********************************************************************/ -static void spoolss_reply_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *rdata) -{ - SPOOL_R_OPEN_PRINTER_EX r_u; - BOOL printer_open = False; - fstring name; - - /* some sanity check because you can open a printer or a print server */ - /* aka: \\server\printer or \\server */ - unistr2_to_ascii(name, &(q_u->printername), sizeof(name)-1); - - DEBUGADD(3,("checking name: %s\n",name)); - - /* now the response */ - r_u.status=0x00000000; - - printer_open = open_printer_hnd(&(r_u.handle)); - set_printer_hnd_printertype(&(r_u.handle), name); - - if ( !set_printer_hnd_printername(&(r_u.handle), name) ) - { - r_u.status=0xC0000000|NT_STATUS_ACCESS_DENIED; - } - - set_printer_hnd_accesstype(&(r_u.handle), q_u->access_required); - - - /* if there is a error free the printer entry */ - - if (r_u.status != 0x00000000) - { - int pnum; - - pnum = find_printer_index_by_hnd(&(r_u.handle)); - Printer[pnum].open=False; - clear_handle(&(r_u.handle)); - } - - spoolss_io_r_open_printer_ex("",&r_u,rdata,0); -} - -/******************************************************************** - * api_spoolss_open_printer - * - * called from the spoolss dispatcher - ********************************************************************/ -static void api_spoolss_open_printer_ex(rpcsrv_struct *p, prs_struct *data, prs_struct *rdata) -{ - SPOOL_Q_OPEN_PRINTER_EX q_u; - - /* grab the spoolss open policy */ - spoolss_io_q_open_printer_ex("", &q_u, data, 0); - - /* construct reply. always indicate success */ - spoolss_reply_open_printer_ex(&q_u, rdata); -} - -/******************************************************************** - ********************************************************************/ -static BOOL getprinterdata_printer_server(fstring value, uint32 size, uint32 *type, - uint32 *numeric_data, uint8 **data, uint32 *needed) -{ - int i; - - if (!strcmp(value, "BeepEnabled")) - { - *type = 0x4; - *data = (uint8 *)malloc( 4*sizeof(uint8) ); - ZERO_STRUCTP(*data); - (*data)[0]=0x01; - (*data)[1]=0x00; - (*data)[2]=0x00; - (*data)[3]=0x00; - *numeric_data = 0x1; /* beep enabled */ - *needed = 0x4; - return True; - } - - if (!strcmp(value, "EventLog")) - { - *type = 0x4; - *data = (uint8 *)malloc( 4*sizeof(uint8) ); - ZERO_STRUCTP(*data); - (*data)[0]=0x1B; - (*data)[1]=0x00; - (*data)[2]=0x00; - (*data)[3]=0x00; - *numeric_data = 0x1B; /* Don't know ??? */ - *needed = 0x4; - return True; - } - - if (!strcmp(value, "NetPopup")) - { - *type = 0x4; - *data = (uint8 *)malloc( 4*sizeof(uint8) ); - ZERO_STRUCTP(*data); - (*data)[0]=0x01; - (*data)[1]=0x00; - (*data)[2]=0x00; - (*data)[3]=0x00; - *numeric_data = 0x1; /* popup enabled */ - *needed = 0x4; - return True; - } - - if (!strcmp(value, "MajorVersion")) - { - *type = 0x4; - *data = (uint8 *)malloc( 4*sizeof(uint8) ); - (*data)[0]=0x02; - (*data)[1]=0x00; - (*data)[2]=0x00; - (*data)[3]=0x00; - *numeric_data = 0x2; /* it's 2, period. */ - *needed = 0x4; - return True; - } - - if (!strcmp(value, "DefaultSpoolDirectory")) - { - pstring directory="You are using a Samba server"; - *type = 0x1; - *data = (uint8 *)malloc( size*sizeof(uint8) ); - ZERO_STRUCTP(*data); - - /* it's done by hand ready to go on the wire */ - for (i=0; i<strlen(directory); i++) - { - (*data)[2*i]=directory[i]; - (*data)[2*i+1]='\0'; - } - *needed = 2*(strlen(directory)+1); - return True; - } - - if (!strcmp(value, "Architecture")) - { - pstring directory="Windows NT x86"; - *type = 0x1; - *data = (uint8 *)malloc( size*sizeof(uint8) ); - ZERO_STRUCTP(*data); - for (i=0; i<strlen(directory); i++) - { - (*data)[2*i]=directory[i]; - (*data)[2*i+1]='\0'; - } - *needed = 2*(strlen(directory)+1); - return True; - } - - return False; -} - -/******************************************************************** - ********************************************************************/ -static BOOL getprinterdata_printer(POLICY_HND *handle, fstring value, uint32 size, uint32 *type, - uint32 *numeric_data, uint8 **data, uint32 *needed ) -{ - NT_PRINTER_INFO_LEVEL printer; - int pnum=0; - int snum=0; - uint8 *idata=NULL; - uint32 len; - - DEBUG(5,("getprinterdata_printer\n")); - - pnum = find_printer_index_by_hnd(handle); - if (OPEN_HANDLE(pnum)) - { - get_printer_snum(handle, &snum); - get_a_printer(&printer, 2, lp_servicename(snum)); - - if (get_specific_param(printer, 2, value, &idata, type, &len)) - { - /*switch (*type) - { - case 1: - case 3: - case 4:*/ - *data = (uint8 *)malloc( size*sizeof(uint8) ); - bzero(*data, sizeof(uint8)*size); - memcpy(*data, idata, len>size?size:len); - *needed = len; - if (idata) free(idata); - /*break;*/ - /*case 4: - *numeric_data=atoi(idata); - break;*/ - /*}*/ - return (True); - } - free_a_printer(printer, 2); - } - - return (False); -} - -/******************************************************************** - * api_spoolss_reply_getprinterdata - * - * called from api_spoolss_getprinterdata - ********************************************************************/ -static void spoolss_reply_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *rdata) -{ - SPOOL_R_GETPRINTERDATA r_u; - fstring value; - BOOL found; - int pnum = find_printer_index_by_hnd(&(q_u->handle)); - - /* - * Reminder: when it's a string, the length is in BYTES - * even if UNICODE is negociated. - * - * r_u.type is the kind of data - * 1 is a string - * 4 is a uint32 - * - * I think it's documented in MSDN somewhere in - * the registry data type (yep it's linked ...) - * - * JFM, 4/19/1999 - */ - - if (OPEN_HANDLE(pnum)) - { - r_u.size = q_u->size; - r_u.status = 0x0; - r_u.type = 0x4; - r_u.needed = 0x0; - r_u.data = NULL; - r_u.numeric_data=0x0; - - unistr2_to_ascii(value, &(q_u->valuename), sizeof(value)-1); - - if (handle_is_printserver(&(q_u->handle))) - { - found=getprinterdata_printer_server(value, r_u.size, - &(r_u.type), &(r_u.numeric_data), - &(r_u.data), &(r_u.needed)); - } - else - { - found=getprinterdata_printer(&(q_u->handle), value, r_u.size, - &(r_u.type), &(r_u.numeric_data), - &(r_u.data), &(r_u.needed)); - } - - if (found==False) - { - /* reply this param doesn't exist */ - r_u.type = 0x4; - r_u.size = 0x0; - r_u.data = NULL; - r_u.numeric_data=0x0; - r_u.needed = 0x0; - r_u.status = ERROR_INVALID_PARAMETER; - } - - spoolss_io_r_getprinterdata("", &r_u, rdata, 0); - DEBUG(3,("freeing memory\n")); - if (r_u.data) free(r_u.data); - DEBUG(3,("freeing memory:ok\n")); - } -} - -/******************************************************************** - * api_spoolss_getprinterdata - * - * called from the spoolss dispatcher - ********************************************************************/ -static void api_spoolss_getprinterdata(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_GETPRINTERDATA q_u; - - /* read the stream and fill the struct */ - spoolss_io_q_getprinterdata("", &q_u, data, 0); - - spoolss_reply_getprinterdata(&q_u,rdata); -} - -/******************************************************************** - * api_spoolss_reply_closeprinter - * - * called from api_spoolss_closeprinter - ********************************************************************/ -static void spoolss_reply_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *rdata) -{ - SPOOL_R_CLOSEPRINTER r_u; - - int pnum = find_printer_index_by_hnd(&(q_u->handle)); - - clear_handle(&(r_u.handle)); - - if (OPEN_HANDLE(pnum)) - { - Printer[pnum].open=False; - r_u.status=0x0; - } - else - { - r_u.status= 0xC0000000 | NT_STATUS_INVALID_HANDLE; - DEBUG(3,("Error closing printer handle (pnum=%x)\n", pnum)); - } - - spoolss_io_r_closeprinter("",&r_u,rdata,0); -} - -/******************************************************************** - * api_spoolss_closeprinter - * - * called from the spoolss dispatcher - ********************************************************************/ -static void api_spoolss_closeprinter(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_CLOSEPRINTER q_u; - - spoolss_io_q_closeprinter("", &q_u, data, 0); - - spoolss_reply_closeprinter(&q_u,rdata); -} - -/******************************************************************** - * api_spoolss_reply_rffpcnex - * - * called from api_spoolss_rffpcnex (see this to understand) - ********************************************************************/ -static void spoolss_reply_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, prs_struct *rdata) -{ - SPOOL_R_RFFPCNEX r_u; - - r_u.status = 0x0000; - - spoolss_io_r_rffpcnex("",&r_u,rdata,0); -} - -/******************************************************************** - * api_spoolss_rffpcnex - * ReplyFindFirstPrinterChangeNotifyEx - * called from the spoolss dispatcher - * - * jfmxxxx: before replying OK: status=0 - * should do a rpc call to the workstation asking ReplyOpenPrinter - * have to code it, later. - * - * in fact ReplyOpenPrinter is the changenotify equivalent on the spoolss pipe - ********************************************************************/ -static void api_spoolss_rffpcnex(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_RFFPCNEX q_u; - - int i,j,k; - - spoolss_io_q_rffpcnex("", &q_u, data, 0); - - /* store the notify value in the printer struct */ - - i=find_printer_index_by_hnd(&(q_u.handle)); - - Printer[i].number_of_notify=q_u.option.count; - - DEBUG(3,("Copying %x notify option info\n",Printer[i].number_of_notify)); - - for (j=0;j<Printer[i].number_of_notify;j++) - { - Printer[i].notify_info[j].count=q_u.option.type[j].count; - Printer[i].notify_info[j].type=q_u.option.type[j].type ; - - DEBUG(4,("Copying %x info fields of type %x\n", - Printer[i].notify_info[j].count, - Printer[i].notify_info[j].type)); - for(k=0;k<Printer[i].notify_info[j].count;k++) - { - Printer[i].notify_info[j].fields[k]=q_u.option.type[j].fields[k]; - } - } - spoolss_reply_rffpcnex(&q_u,rdata); -} - -/******************************************************************* - * fill a notify_info_data with the servername - ********************************************************************/ -static void spoolss_notify_server_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - pstring temp_name; - - snprintf(temp_name, sizeof(temp_name), "\\\\%s", global_myname); - - data->notify_data.data.length=strlen(temp_name); - ascii_to_unistr(data->notify_data.data.string, temp_name, sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the servicename - * jfmxxxx: it's incorrect should be long_printername - ********************************************************************/ -static void spoolss_notify_printer_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ -/* - data->notify_data.data.length=strlen(lp_servicename(snum)); - ascii_to_unistr(data->notify_data.data.string, lp_servicename(snum), sizeof(data->notify_data.data.string)-1); -*/ - data->notify_data.data.length=strlen(printer->info_2->printername); - ascii_to_unistr(data->notify_data.data.string, - printer->info_2->printername, - sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the servicename - ********************************************************************/ -static void spoolss_notify_share_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen(lp_servicename(snum)); - ascii_to_unistr(data->notify_data.data.string, - lp_servicename(snum), - sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the port name - ********************************************************************/ -static void spoolss_notify_port_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - /* even if it's strange, that's consistant in all the code */ - - data->notify_data.data.length=strlen(lp_servicename(snum)); - ascii_to_unistr(data->notify_data.data.string, - lp_servicename(snum), - sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the printername - * jfmxxxx: it's incorrect, should be lp_printerdrivername() - * but it doesn't exist, have to see what to do - ********************************************************************/ -static void spoolss_notify_driver_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen(printer->info_2->drivername); - ascii_to_unistr(data->notify_data.data.string, - printer->info_2->drivername, - sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the comment - ********************************************************************/ -static void spoolss_notify_comment(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen(lp_comment(snum)); - ascii_to_unistr(data->notify_data.data.string, - lp_comment(snum), - sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the comment - * jfm:xxxx incorrect, have to create a new smb.conf option - * location = "Room 1, floor 2, building 3" - ********************************************************************/ -static void spoolss_notify_location(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen(printer->info_2->location); - ascii_to_unistr(data->notify_data.data.string, - printer->info_2->location, - sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the device mode - * jfm:xxxx don't to it for know but that's a real problem !!! - ********************************************************************/ -static void spoolss_notify_devmode(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ -} - -/******************************************************************* - * fill a notify_info_data with the separator file name - * jfm:xxxx just return no file could add an option to smb.conf - * separator file = "separator.txt" - ********************************************************************/ -static void spoolss_notify_sepfile(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen(printer->info_2->sepfile); - ascii_to_unistr(data->notify_data.data.string, - printer->info_2->sepfile, - sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the print processor - * jfm:xxxx return always winprint to indicate we don't do anything to it - ********************************************************************/ -static void spoolss_notify_print_processor(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen(printer->info_2->printprocessor); - ascii_to_unistr(data->notify_data.data.string, - printer->info_2->printprocessor, - sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the print processor options - * jfm:xxxx send an empty string - ********************************************************************/ -static void spoolss_notify_parameters(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen(printer->info_2->parameters); - ascii_to_unistr(data->notify_data.data.string, - printer->info_2->parameters, - sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the data type - * jfm:xxxx always send RAW as data type - ********************************************************************/ -static void spoolss_notify_datatype(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen(printer->info_2->datatype); - ascii_to_unistr(data->notify_data.data.string, - printer->info_2->datatype, - sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with the security descriptor - * jfm:xxxx send an null pointer to say no security desc - * have to implement security before ! - ********************************************************************/ -static void spoolss_notify_security_desc(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=0; - data->notify_data.data.string[0]=0x00; -} - -/******************************************************************* - * fill a notify_info_data with the attributes - * jfm:xxxx a samba printer is always shared - ********************************************************************/ -static void spoolss_notify_attributes(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.value[0] = PRINTER_ATTRIBUTE_SHARED \ - | PRINTER_ATTRIBUTE_NETWORK \ - | PRINTER_ATTRIBUTE_RAW_ONLY ; -} - -/******************************************************************* - * fill a notify_info_data with the priority - ********************************************************************/ -static void spoolss_notify_priority(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.value[0] = printer->info_2->priority; -} - -/******************************************************************* - * fill a notify_info_data with the default priority - ********************************************************************/ -static void spoolss_notify_default_priority(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.value[0] = printer->info_2->default_priority; -} - -/******************************************************************* - * fill a notify_info_data with the start time - ********************************************************************/ -static void spoolss_notify_start_time(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.value[0] = printer->info_2->starttime; -} - -/******************************************************************* - * fill a notify_info_data with the until time - ********************************************************************/ -static void spoolss_notify_until_time(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.value[0] = printer->info_2->untiltime; -} - -/******************************************************************* - * fill a notify_info_data with the status - ********************************************************************/ -static void spoolss_notify_status(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - int count; - print_queue_struct *q=NULL; - print_status_struct status; - - bzero(&status,sizeof(status)); - - count=get_printqueue(snum, NULL, &q, &status); - - data->notify_data.value[0]=(uint32) status.status; - if (q) free(q); -} - -/******************************************************************* - * fill a notify_info_data with the number of jobs queued - ********************************************************************/ -static void spoolss_notify_cjobs(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - print_queue_struct *q=NULL; - print_status_struct status; - - bzero(&status,sizeof(status)); - - data->notify_data.value[0]=get_printqueue(snum, NULL, &q, &status); - if (q) free(q); -} - -/******************************************************************* - * fill a notify_info_data with the average ppm - ********************************************************************/ -static void spoolss_notify_average_ppm(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - /* always respond 8 pages per minutes */ - /* a little hard ! */ - data->notify_data.value[0] = printer->info_2->averageppm; -} - -/******************************************************************* - * fill a notify_info_data with - ********************************************************************/ -static void spoolss_notify_username(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen(queue->user); - ascii_to_unistr(data->notify_data.data.string, queue->user, sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with - ********************************************************************/ -static void spoolss_notify_job_status(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.value[0]=queue->status; -} - -/******************************************************************* - * fill a notify_info_data with - ********************************************************************/ -static void spoolss_notify_job_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen(queue->file); - ascii_to_unistr(data->notify_data.data.string, queue->file, sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with - ********************************************************************/ -static void spoolss_notify_job_status_string(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.data.length=strlen("En attente"); - ascii_to_unistr(data->notify_data.data.string, "En attente", sizeof(data->notify_data.data.string)-1); -} - -/******************************************************************* - * fill a notify_info_data with - ********************************************************************/ -static void spoolss_notify_job_time(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.value[0]=0x0; -} - -/******************************************************************* - * fill a notify_info_data with - ********************************************************************/ -static void spoolss_notify_job_size(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.value[0]=queue->size; -} - -/******************************************************************* - * fill a notify_info_data with - ********************************************************************/ -static void spoolss_notify_job_position(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer) -{ - data->notify_data.value[0]=queue->job; -} - -#define END 65535 - -struct s_notify_info_data_table notify_info_data_table[] = -{ -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_SERVER_NAME, "PRINTER_NOTIFY_SERVER_NAME", POINTER, spoolss_notify_server_name }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_PRINTER_NAME, "PRINTER_NOTIFY_PRINTER_NAME", POINTER, spoolss_notify_printer_name }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_SHARE_NAME, "PRINTER_NOTIFY_SHARE_NAME", POINTER, spoolss_notify_share_name }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_PORT_NAME, "PRINTER_NOTIFY_PORT_NAME", POINTER, spoolss_notify_port_name }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_DRIVER_NAME, "PRINTER_NOTIFY_DRIVER_NAME", POINTER, spoolss_notify_driver_name }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_COMMENT, "PRINTER_NOTIFY_COMMENT", POINTER, spoolss_notify_comment }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_LOCATION, "PRINTER_NOTIFY_LOCATION", POINTER, spoolss_notify_location }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_DEVMODE, "PRINTER_NOTIFY_DEVMODE", POINTER, spoolss_notify_devmode }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_SEPFILE, "PRINTER_NOTIFY_SEPFILE", POINTER, spoolss_notify_sepfile }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_PRINT_PROCESSOR, "PRINTER_NOTIFY_PRINT_PROCESSOR", POINTER, spoolss_notify_print_processor }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_PARAMETERS, "PRINTER_NOTIFY_PARAMETERS", POINTER, spoolss_notify_parameters }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_DATATYPE, "PRINTER_NOTIFY_DATATYPE", POINTER, spoolss_notify_datatype }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_SECURITY_DESCRIPTOR, "PRINTER_NOTIFY_SECURITY_DESCRIPTOR", POINTER, spoolss_notify_security_desc }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_ATTRIBUTES, "PRINTER_NOTIFY_ATTRIBUTES", ONE_VALUE, spoolss_notify_attributes }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_PRIORITY, "PRINTER_NOTIFY_PRIORITY", ONE_VALUE, spoolss_notify_priority }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_DEFAULT_PRIORITY, "PRINTER_NOTIFY_DEFAULT_PRIORITY", ONE_VALUE, spoolss_notify_default_priority }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_START_TIME, "PRINTER_NOTIFY_START_TIME", ONE_VALUE, spoolss_notify_start_time }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_UNTIL_TIME, "PRINTER_NOTIFY_UNTIL_TIME", ONE_VALUE, spoolss_notify_until_time }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_STATUS, "PRINTER_NOTIFY_STATUS", ONE_VALUE, spoolss_notify_status }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_STATUS_STRING, "PRINTER_NOTIFY_STATUS_STRING", POINTER, NULL }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_CJOBS, "PRINTER_NOTIFY_CJOBS", ONE_VALUE, spoolss_notify_cjobs }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_AVERAGE_PPM, "PRINTER_NOTIFY_AVERAGE_PPM", ONE_VALUE, spoolss_notify_average_ppm }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_TOTAL_PAGES, "PRINTER_NOTIFY_TOTAL_PAGES", POINTER, NULL }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_PAGES_PRINTED, "PRINTER_NOTIFY_PAGES_PRINTED", POINTER, NULL }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_TOTAL_BYTES, "PRINTER_NOTIFY_TOTAL_BYTES", POINTER, NULL }, -{ PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_BYTES_PRINTED, "PRINTER_NOTIFY_BYTES_PRINTED", POINTER, NULL }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_PRINTER_NAME, "JOB_NOTIFY_PRINTER_NAME", POINTER, spoolss_notify_printer_name }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_MACHINE_NAME, "JOB_NOTIFY_MACHINE_NAME", POINTER, spoolss_notify_server_name }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_PORT_NAME, "JOB_NOTIFY_PORT_NAME", POINTER, spoolss_notify_port_name }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_USER_NAME, "JOB_NOTIFY_USER_NAME", POINTER, spoolss_notify_username }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_NOTIFY_NAME, "JOB_NOTIFY_NOTIFY_NAME", POINTER, spoolss_notify_username }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_DATATYPE, "JOB_NOTIFY_DATATYPE", POINTER, spoolss_notify_datatype }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_PRINT_PROCESSOR, "JOB_NOTIFY_PRINT_PROCESSOR", POINTER, spoolss_notify_print_processor }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_PARAMETERS, "JOB_NOTIFY_PARAMETERS", POINTER, spoolss_notify_parameters }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_DRIVER_NAME, "JOB_NOTIFY_DRIVER_NAME", POINTER, spoolss_notify_driver_name }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_DEVMODE, "JOB_NOTIFY_DEVMODE", POINTER, spoolss_notify_devmode }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_STATUS, "JOB_NOTIFY_STATUS", ONE_VALUE, spoolss_notify_job_status }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_STATUS_STRING, "JOB_NOTIFY_STATUS_STRING", POINTER, spoolss_notify_job_status_string }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_SECURITY_DESCRIPTOR, "JOB_NOTIFY_SECURITY_DESCRIPTOR", POINTER, NULL }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_DOCUMENT, "JOB_NOTIFY_DOCUMENT", POINTER, spoolss_notify_job_name }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_PRIORITY, "JOB_NOTIFY_PRIORITY", ONE_VALUE, spoolss_notify_priority }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_POSITION, "JOB_NOTIFY_POSITION", ONE_VALUE, spoolss_notify_job_position }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_SUBMITTED, "JOB_NOTIFY_SUBMITTED", POINTER, NULL }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_START_TIME, "JOB_NOTIFY_START_TIME", ONE_VALUE, spoolss_notify_start_time }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_UNTIL_TIME, "JOB_NOTIFY_UNTIL_TIME", ONE_VALUE, spoolss_notify_until_time }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_TIME, "JOB_NOTIFY_TIME", ONE_VALUE, spoolss_notify_job_time }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_TOTAL_PAGES, "JOB_NOTIFY_TOTAL_PAGES", ONE_VALUE, NULL }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_PAGES_PRINTED, "JOB_NOTIFY_PAGES_PRINTED", ONE_VALUE, NULL }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_TOTAL_BYTES, "JOB_NOTIFY_TOTAL_BYTES", ONE_VALUE, spoolss_notify_job_size }, -{ JOB_NOTIFY_TYPE, JOB_NOTIFY_BYTES_PRINTED, "JOB_NOTIFY_BYTES_PRINTED", ONE_VALUE, NULL }, -{ END, END, "", END, NULL } -}; - -/******************************************************************* -return the size of info_data structure -********************************************************************/ -uint32 size_of_notify_info_data(uint16 type, uint16 field) -{ - int i=0; - - while (notify_info_data_table[i].type != END) - { - if ( (notify_info_data_table[i].type == type ) && - (notify_info_data_table[i].field == field ) ) - { - return (notify_info_data_table[i].size); - continue; - } - i++; - } - return (65535); -} - -/******************************************************************* -return the type of notify_info_data -********************************************************************/ -BOOL type_of_notify_info_data(uint16 type, uint16 field) -{ - int i=0; - - while (notify_info_data_table[i].type != END) - { - if ( (notify_info_data_table[i].type == type ) && - (notify_info_data_table[i].field == field ) ) - { - if (notify_info_data_table[i].size == POINTER) - { - return (False); - } - else - { - return (True); - } - continue; - } - i++; - } - return (False); -} - -/**************************************************************************** -****************************************************************************/ -static int search_notify(uint16 type, uint16 field, int *value) -{ - int j; - BOOL found; - - DEBUG(4,("\tsearch_notify: in\n")); - for (j=0, found=False; found==False && notify_info_data_table[j].type != END ; j++) - { - if ( (notify_info_data_table[j].type == type ) && - (notify_info_data_table[j].field == field ) ) - { - found=True; - } - } - *value=--j; - - if ( found && (notify_info_data_table[j].fn != NULL) ) - { - DEBUG(4,("\tsearch_notify: out TRUE\n")); - return (True); - } - else - { - DEBUG(4,("\tsearch_notify: out FALSE\n")); - return (False); - } -} - -/**************************************************************************** -****************************************************************************/ -static void construct_info_data(SPOOL_NOTIFY_INFO_DATA *info_data, uint16 type, uint16 field, int id) -{ - DEBUG(4,("\tconstruct_info_data: in\n")); - info_data->type = type; - info_data->field = field; - info_data->id = id; - info_data->size = size_of_notify_info_data(type, field); - info_data->enc_type = type_of_notify_info_data(type, field); - DEBUG(4,("\tconstruct_info_data: out\n")); -} - - -/******************************************************************* - * - * fill a notify_info struct with info asked - * - ********************************************************************/ -static void construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int pnum, - int snum, int i, uint32 id) -{ - - int k,j; - uint16 type; - uint16 field; - - SPOOL_NOTIFY_INFO_DATA *info_data; - print_queue_struct *queue=NULL; - NT_PRINTER_INFO_LEVEL printer; - - DEBUG(4,("construct_notify_printer_info\n")); - - info_data=&(info->data[info->count]); - - type = Printer[pnum].notify_info[i].type; - - DEBUGADD(4,("Notify number %d -> number of notify info: %d\n",i,Printer[pnum].notify_info[i].count)); - - if (!get_a_printer(&printer, 2, lp_servicename(snum))) - { - - for(k=0; k<Printer[pnum].notify_info[i].count; k++) - { - field = Printer[pnum].notify_info[i].fields[k]; - DEBUGADD(4,("notify [%d]: type [%x], field [%x]\n", k, type, field)); - - if (search_notify(type, field, &j) ) - { - DEBUGADD(4,("j=[%d]:%s\n", j, notify_info_data_table[j].name)); - construct_info_data(info_data, type, field, id); - - DEBUGADD(4,("notify_info_data_table: in\n")); - notify_info_data_table[j].fn(snum, info_data, queue, &printer); - DEBUGADD(4,("notify_info_data_table: out\n")); - info->count++; - info_data=&(info->data[info->count]); - } - } - - free_a_printer(printer, 2); - } -} - -/******************************************************************* - * - * fill a notify_info struct with info asked - * - ********************************************************************/ -static void construct_notify_jobs_info(print_queue_struct *queue, SPOOL_NOTIFY_INFO *info, - int pnum, int snum, int i, uint32 id) -{ - - int k,j; - uint16 type; - uint16 field; - - SPOOL_NOTIFY_INFO_DATA *info_data; - NT_PRINTER_INFO_LEVEL printer; - - DEBUG(4,("construct_notify_jobs_info\n")); - info_data=&(info->data[info->count]); - - type = Printer[pnum].notify_info[i].type; - - DEBUGADD(4,("Notify number %d -> number of notify info: %d\n",i,Printer[pnum].notify_info[i].count)); - - if (!get_a_printer(&printer, 2, lp_servicename(snum))) - { - for(k=0; k<Printer[pnum].notify_info[i].count; k++) - { - field = Printer[pnum].notify_info[i].fields[k]; - DEBUGADD(4,("notify [%d]: type [%x], field [%x]\n",k, type, field)); - - if (search_notify(type, field, &j) ) - { - DEBUGADD(4,("j=[%d]:%s\n", j, notify_info_data_table[j].name)); - construct_info_data(info_data, type, field, id); - DEBUGADD(4,("notify_info_data_table: in\n")); - notify_info_data_table[j].fn(snum, info_data, queue, &printer); - DEBUGADD(4,("notify_info_data_table: out\n")); - info->count++; - info_data=&(info->data[info->count]); - } - } - free_a_printer(printer, 2); - } -} - - -/******************************************************************* - * - * enumerate all printers on the printserver - * fill a notify_info struct with info asked - * - ********************************************************************/ -static void printserver_notify_info(POLICY_HND *hnd, SPOOL_NOTIFY_INFO *info) -{ - int snum; - int pnum=find_printer_index_by_hnd(hnd); - int n_services=lp_numservices(); - int i=0; - uint32 id=1; - info->count=0; - - DEBUG(4,("Enumerating printers\n")); - - for (i=0; i<Printer[pnum].number_of_notify; i++) - { - if ( Printer[pnum].notify_info[i].type == PRINTER_NOTIFY_TYPE ) - { - for (snum=0; snum<n_services; snum++) - { - if ( lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) - { - construct_notify_printer_info(info, pnum, snum, i, id); - id++; - } - } - } - } - DEBUG(4,("All printers enumerated\n")); -} - -/******************************************************************* - * - * fill a notify_info struct with info asked - * - ********************************************************************/ -static void printer_notify_info(POLICY_HND *hnd, SPOOL_NOTIFY_INFO *info) -{ - int snum; - int pnum=find_printer_index_by_hnd(hnd); - int i=0, j; - uint32 id=0xFFFF; - - info->count=0; - - if (get_printer_snum(hnd, &snum) ) - { - for (i=0; i<Printer[pnum].number_of_notify; i++) - { - switch ( Printer[pnum].notify_info[i].type ) - { - case PRINTER_NOTIFY_TYPE: - { - construct_notify_printer_info(info, pnum, snum, i, id); - id--; - break; - } - case JOB_NOTIFY_TYPE: - { - int count; - print_queue_struct *queue=NULL; - print_status_struct status; - bzero(&status, sizeof(status)); - count=get_printqueue(snum, NULL, &queue, &status); - for (j=0; j<count; j++) - { - construct_notify_jobs_info(&(queue[j]), info, pnum, snum, i, queue[j].job); - } - if (queue) free(queue); - break; - } - } - } - } -} - -/******************************************************************** - * api_spoolss_reply_rfnpcnex - * - * called from api_spoolss_rfnpcnex (see this to understand) - ********************************************************************/ -static void spoolss_reply_rfnpcnex(SPOOL_Q_RFNPCNEX *q_u, prs_struct *rdata) -{ - SPOOL_R_RFNPCNEX r_u; - int pnum=find_printer_index_by_hnd(&(q_u->handle)); - - if (OPEN_HANDLE(pnum)) - { - DEBUG(4,("Printer %x of type %x\n",pnum,Printer[pnum].printer_type)); - switch (Printer[pnum].printer_type) - { - case PRINTER_HANDLE_IS_PRINTSERVER: - printserver_notify_info(&(q_u->handle), &(r_u.info)); - break; - case PRINTER_HANDLE_IS_PRINTER: - printer_notify_info(&(q_u->handle), &(r_u.info)); - break; - } - - spoolss_io_r_rfnpcnex("", &r_u, rdata, 0); - } -} - -/******************************************************************** - * api_spoolss_rfnpcnex - * ReplyFindNextPrinterChangeNotifyEx - * called from the spoolss dispatcher - * - ********************************************************************/ -static void api_spoolss_rfnpcnex(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_RFNPCNEX q_u; - - spoolss_io_q_rfnpcnex("", &q_u, data, 0); - - spoolss_reply_rfnpcnex(&q_u, rdata); -} - -/******************************************************************** - * construct_printer_info_0 - * fill a printer_info_1 struct - ********************************************************************/ -static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer,int snum, pstring servername) -{ - pstring chaine; - int count; - NT_PRINTER_INFO_LEVEL ntprinter; - - print_queue_struct *queue=NULL; - print_status_struct status; - bzero(&status,sizeof(status)); - - if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) != 0) - { - return (False); - } - - count=get_printqueue(snum, NULL, &queue, &status); - - /* the description and the name are of the form \\server\share */ - slprintf(chaine,sizeof(chaine)-1,"\\\\%s\\%s",servername, ntprinter.info_2->printername); - - make_unistr(&(printer->printername), chaine); - - slprintf(chaine,sizeof(chaine)-1,"\\\\%s", servername); - make_unistr(&(printer->servername), chaine); - - printer->cjobs = count; - printer->attributes = PRINTER_ATTRIBUTE_SHARED \ - | PRINTER_ATTRIBUTE_NETWORK \ - | PRINTER_ATTRIBUTE_RAW_ONLY ; - printer->unknown0 = 0x1; /* pointer */ - printer->unknown1 = 0x000A07CE; /* don't known */ - printer->unknown2 = 0x00020005; - printer->unknown3 = 0x0006000D; - printer->unknown4 = 0x02180026; - printer->unknown5 = 0x09; - printer->unknown6 = 0x36; - printer->majorversion = 0x0004; /* NT 4 */ - printer->buildversion = 0x0565; /* build 1381 */ - printer->unknown7 = 0x1; - printer->unknown8 = 0x0; - printer->unknown9 = 0x2; - printer->unknown10 = 0x3; - printer->unknown11 = 0x0; - printer->unknown12 = 0x0; - printer->unknown13 = 0x0; - printer->unknown14 = 0x1; - printer->unknown15 = 0x024a; /*586 Pentium ? */ - printer->unknown16 = 0x0; - printer->unknown17 = 0x423ed444; - printer->unknown18 = 0x0; - printer->status = status.status; - printer->unknown20 = 0x0; - printer->unknown21 = 0x0648; - printer->unknown22 = 0x0; - printer->unknown23 = 0x5; - - if (queue) free(queue); - - free_a_printer(ntprinter, 2); - return (True); -} - -/******************************************************************** - * construct_printer_info_1 - * fill a printer_info_1 struct - ********************************************************************/ -static BOOL construct_printer_info_1(PRINTER_INFO_1 *printer,int snum, pstring servername) -{ - pstring chaine; - NT_PRINTER_INFO_LEVEL ntprinter; - - if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) != 0) - { - return (False); - } - - printer->flags=PRINTER_ENUM_NAME; - - /* the description and the name are of the form \\server\share */ - slprintf(chaine,sizeof(chaine)-1,"\\\\%s\\%s,%s,%s",servername, - ntprinter.info_2->printername, - ntprinter.info_2->drivername, - lp_comment(snum)); - make_unistr(&(printer->description), chaine); - - slprintf(chaine,sizeof(chaine)-1,"\\\\%s\\%s", servername, ntprinter.info_2->printername); - make_unistr(&(printer->name), chaine); - - make_unistr(&(printer->comment), lp_comment(snum)); - - free_a_printer(ntprinter, 2); - return (True); -} - -/**************************************************************************** -****************************************************************************/ -static void construct_dev_mode(DEVICEMODE *devmode, int snum, char *servername) -{ - char adevice[32]; - char aform[32]; - NT_PRINTER_INFO_LEVEL printer; - NT_DEVICEMODE *ntdevmode; - - DEBUG(7,("construct_dev_mode\n")); - - bzero(&(devmode->devicename), 2*sizeof(adevice)); - bzero(&(devmode->formname), 2*sizeof(aform)); - - DEBUGADD(8,("getting printer characteristics\n")); - - get_a_printer(&printer, 2, lp_servicename(snum)); - ntdevmode=(printer.info_2)->devmode; - - DEBUGADD(8,("loading DEVICEMODE\n")); - snprintf(adevice, sizeof(adevice), "\\\\%s\\%s", global_myname, - printer.info_2->printername); - make_unistr(&(devmode->devicename), adevice); - - snprintf(aform, sizeof(aform), ntdevmode->formname); - make_unistr(&(devmode->formname), aform); - - devmode->specversion = ntdevmode->specversion; - devmode->driverversion = ntdevmode->driverversion; - devmode->size = ntdevmode->size; - devmode->driverextra = ntdevmode->driverextra; - devmode->fields = ntdevmode->fields; - - devmode->orientation = ntdevmode->orientation; - devmode->papersize = ntdevmode->papersize; - devmode->paperlength = ntdevmode->paperlength; - devmode->paperwidth = ntdevmode->paperwidth; - devmode->scale = ntdevmode->scale; - devmode->copies = ntdevmode->copies; - devmode->defaultsource = ntdevmode->defaultsource; - devmode->printquality = ntdevmode->printquality; - devmode->color = ntdevmode->color; - devmode->duplex = ntdevmode->duplex; - devmode->yresolution = ntdevmode->yresolution; - devmode->ttoption = ntdevmode->ttoption; - devmode->collate = ntdevmode->collate; - devmode->icmmethod = ntdevmode->icmmethod; - devmode->icmintent = ntdevmode->icmintent; - devmode->mediatype = ntdevmode->mediatype; - devmode->dithertype = ntdevmode->dithertype; - - if (ntdevmode->private != NULL) - { - devmode->private=(uint8 *)malloc(devmode->driverextra*sizeof(uint8)); - memcpy(devmode->private, ntdevmode->private, devmode->driverextra); - } - - free_a_printer(printer, 2); -} - -/******************************************************************** - * construct_printer_info_2 - * fill a printer_info_2 struct - ********************************************************************/ -static BOOL construct_printer_info_2(PRINTER_INFO_2 *printer, int snum, pstring servername) -{ - pstring chaine; - int count; - DEVICEMODE *devmode; - NT_PRINTER_INFO_LEVEL ntprinter; - - print_queue_struct *queue=NULL; - print_status_struct status; - bzero(&status, sizeof(status)); - count=get_printqueue(snum, NULL, &queue, &status); - - if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) !=0 ) - { - return (False); - } - - snprintf(chaine, sizeof(chaine)-1, "\\\\%s", servername); - make_unistr(&(printer->servername), chaine); /* servername*/ - - snprintf(chaine, sizeof(chaine)-1, "\\\\%s\\%s", servername, ntprinter.info_2->printername); - make_unistr(&(printer->printername), chaine); /* printername*/ - - make_unistr(&(printer->sharename), lp_servicename(snum)); /* sharename */ - - make_unistr(&(printer->portname), lp_servicename(snum)); /* port */ - make_unistr(&(printer->drivername), ntprinter.info_2->drivername); /* drivername */ - - make_unistr(&(printer->comment), ntprinter.info_2->comment); /* comment */ - make_unistr(&(printer->location), ntprinter.info_2->location); /* location */ - make_unistr(&(printer->sepfile), ntprinter.info_2->sepfile); /* separator file */ - make_unistr(&(printer->printprocessor), ntprinter.info_2->printprocessor);/* print processor */ - make_unistr(&(printer->datatype), ntprinter.info_2->datatype); /* datatype */ - make_unistr(&(printer->parameters), ntprinter.info_2->parameters); /* parameters (of print processor) */ - - printer->attributes = PRINTER_ATTRIBUTE_SHARED \ - | PRINTER_ATTRIBUTE_NETWORK \ - | PRINTER_ATTRIBUTE_RAW_ONLY ; /* attributes */ - - printer->priority = ntprinter.info_2->priority; /* priority */ - printer->defaultpriority = ntprinter.info_2->default_priority; /* default priority */ - printer->starttime = ntprinter.info_2->starttime; /* starttime */ - printer->untiltime = ntprinter.info_2->untiltime; /* untiltime */ - printer->status = status.status; /* status */ - printer->cjobs = count; /* jobs */ - printer->averageppm = ntprinter.info_2->averageppm; /* average pages per minute */ - - devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE)); - ZERO_STRUCTP(devmode); - construct_dev_mode(devmode, snum, servername); - printer->devmode=devmode; - - if (queue) free(queue); - free_a_printer(ntprinter, 2); - return (True); -} - -/******************************************************************** - * enum_printer_info_1 - * glue between spoolss_reply_enumprinters and construct_printer_info_1 - ********************************************************************/ -static BOOL enum_printer_info_1(PRINTER_INFO_1 **printer, int snum, int number) -{ - pstring servername; - - *printer=(PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1)); - DEBUG(4,("Allocated memory for ONE PRINTER_INFO_1 at [%p]\n", *printer)); - pstrcpy(servername, global_myname); - if (!construct_printer_info_1(*printer, snum, servername)) - { - free(*printer); - return (False); - } - else - { - return (True); - } -} - -/******************************************************************** - * enum_printer_info_2 - * glue between spoolss_reply_enumprinters and construct_printer_info_2 - ********************************************************************/ -static BOOL enum_printer_info_2(PRINTER_INFO_2 **printer, int snum, int number) -{ - pstring servername; - - *printer=(PRINTER_INFO_2 *)malloc(sizeof(PRINTER_INFO_2)); - DEBUG(4,("Allocated memory for ONE PRINTER_INFO_2 at [%p]\n", *printer)); - pstrcpy(servername, global_myname); - if (!construct_printer_info_2(*printer, snum, servername)) - { - free(*printer); - return (False); - } - else - { - return (True); - } -} - -/******************************************************************** - * api_spoolss_reply_enumprinters - * - * called from api_spoolss_enumprinters (see this to understand) - ********************************************************************/ -static void enum_all_printers_info_1(PRINTER_INFO_1 ***printers, uint32 *number) -{ - int snum; - int n_services=lp_numservices(); - *printers=NULL; - *number=0; - - for (snum=0;snum<n_services; snum++) - { - if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) - { - DEBUG(4,("Found a printer: %s[%x]\n",lp_servicename(snum),snum)); - *printers=Realloc(*printers, (*number+1)*sizeof(PRINTER_INFO_1 *)); - DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1 pointers at [%p]\n", *number+1, *printers)); - if (enum_printer_info_1( &((*printers)[*number]), snum, *number) ) - { - (*number)++; - } - } - } -} - -/******************************************************************** - * api_spoolss_reply_enumprinters - * - * called from api_spoolss_enumprinters (see this to understand) - ********************************************************************/ -static void enum_all_printers_info_2(PRINTER_INFO_2 ***printers, uint32 *number) -{ - int snum; - int n_services=lp_numservices(); - *printers=NULL; - *number=0; - - for (snum=0;snum<n_services; snum++) - { - if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) - { - DEBUG(4,("Found a printer: %s[%x]\n",lp_servicename(snum),snum)); - *printers=Realloc(*printers, (*number+1)*sizeof(PRINTER_INFO_2 *)); - DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2 pointers at [%p]\n", *number+1, *printers)); - if (enum_printer_info_2( &((*printers)[*number]), snum, *number) ) - { - (*number)++; - } - } - } -} - -/******************************************************************** - * api_spoolss_reply_enumprinters - * - * called from api_spoolss_enumprinters (see this to understand) - ********************************************************************/ -static void spoolss_reply_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *rdata) -{ - SPOOL_R_ENUMPRINTERS r_u; - - DEBUG(4,("Enumerating printers\n")); - - memcpy(r_u.servername.buffer,q_u->servername.buffer,2*q_u->servername.uni_str_len); - r_u.servername.buffer[q_u->servername.uni_str_len]=0x0000; - r_u.returned=0; - - switch (q_u->level) - { - case 1: - if ( (q_u->flags==PRINTER_ENUM_NAME) || (q_u->flags==PRINTER_ENUM_NETWORK) ) - /*if (is_a_printerserver(q_u->servername))*/ - enum_all_printers_info_1(&(r_u.printer.printers_1), &(r_u.returned) ); - /*else - enum_one_printer_info_1(&r_u);*/ - break; - case 2: - if ( (q_u->flags==PRINTER_ENUM_NAME) || (q_u->flags==PRINTER_ENUM_NETWORK) ) - /*if (is_a_printerserver(q_u->servername))*/ - enum_all_printers_info_2(&(r_u.printer.printers_2), &(r_u.returned) ); - /*else - enum_one_printer_info_2(&r_u);*/ - break; - case 3: /* doesn't exist */ - break; - case 4: /* can't, always on local machine */ - break; - case 5: - break; - - } - DEBUG(4,("%d printers enumerated\n", r_u.returned)); - r_u.offered=q_u->buffer.size; - r_u.level=q_u->level; - r_u.status=0x0000; - - spoolss_io_r_enumprinters("",&r_u,rdata,0); -} - -/******************************************************************** - * api_spoolss_enumprinters - * called from the spoolss dispatcher - * - ********************************************************************/ -static void api_spoolss_enumprinters(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ENUMPRINTERS q_u; - - spoolss_io_q_enumprinters("", &q_u, data, 0); - - spoolss_reply_enumprinters(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_getprinter(SPOOL_Q_GETPRINTER *q_u, prs_struct *rdata) -{ - SPOOL_R_GETPRINTER r_u; - int snum; - pstring servername; - - pstrcpy(servername, global_myname); - - get_printer_snum(&(q_u->handle),&snum); - - switch (q_u->level) - { - case 0: - { - PRINTER_INFO_0 *printer; - - printer=(PRINTER_INFO_0 *)malloc(sizeof(PRINTER_INFO_0)); - - construct_printer_info_0(printer, snum, servername); - r_u.printer.info0=printer; - r_u.status=0x0000; - r_u.offered=q_u->offered; - r_u.level=q_u->level; - - spoolss_io_r_getprinter("",&r_u,rdata,0); - - free(printer); - - break; - } - case 1: - { - PRINTER_INFO_1 *printer; - - printer=(PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1)); - - construct_printer_info_1(printer, snum, servername); - - r_u.printer.info1=printer; - r_u.status=0x0000; - r_u.offered=q_u->offered; - r_u.level=q_u->level; - spoolss_io_r_getprinter("",&r_u,rdata,0); - - free(printer); - - break; - } - case 2: - { - PRINTER_INFO_2 *printer; - - printer=(PRINTER_INFO_2 *)malloc(sizeof(PRINTER_INFO_2)); - construct_printer_info_2(printer, snum, servername); - - r_u.printer.info2=printer; - r_u.status=0x0000; - r_u.offered=q_u->offered; - r_u.level=q_u->level; - spoolss_io_r_getprinter("",&r_u,rdata,0); - - free_printer_info_2(printer); - - break; - } - } -} - -/******************************************************************** - * api_spoolss_getprinter - * called from the spoolss dispatcher - * - ********************************************************************/ -static void api_spoolss_getprinter(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_GETPRINTER q_u; - - spoolss_io_q_getprinter("", &q_u, data, 0); - - spoolss_reply_getprinter(&q_u, rdata); -} - -/******************************************************************** - * construct_printer_driver_info_1 - * fill a construct_printer_driver_info_1 struct - ********************************************************************/ -static void fill_printer_driver_info_1(DRIVER_INFO_1 *info, - NT_PRINTER_DRIVER_INFO_LEVEL driver, - pstring servername, fstring architecture) -{ - make_unistr( &(info->name), driver.info_3->name); -} - -static void construct_printer_driver_info_1(DRIVER_INFO_1 *info, int snum, - pstring servername, fstring architecture) -{ - NT_PRINTER_INFO_LEVEL printer; - NT_PRINTER_DRIVER_INFO_LEVEL driver; - - get_a_printer(&printer, 2, lp_servicename(snum) ); - get_a_printer_driver(&driver, 3, printer.info_2->drivername, architecture); - - fill_printer_driver_info_1(info, driver, servername, architecture); - - free_a_printer_driver(driver, 3); - free_a_printer(printer, 2); -} - -/******************************************************************** - * construct_printer_driver_info_2 - * fill a printer_info_2 struct - ********************************************************************/ -static void fill_printer_driver_info_2(DRIVER_INFO_2 *info, - NT_PRINTER_DRIVER_INFO_LEVEL driver, - pstring servername, fstring architecture) -{ - pstring where; - pstring temp_driverpath; - pstring temp_datafile; - pstring temp_configfile; - fstring short_archi; - - get_short_archi(short_archi,architecture); - - snprintf(where,sizeof(where)-1,"\\\\%s\\print$\\%s\\", servername, short_archi); - - info->version=driver.info_3->cversion; - - make_unistr( &(info->name), driver.info_3->name ); - make_unistr( &(info->architecture), architecture ); - - snprintf(temp_driverpath, sizeof(temp_driverpath)-1, "%s%s", where, - driver.info_3->driverpath); - make_unistr( &(info->driverpath), temp_driverpath ); - - snprintf(temp_datafile, sizeof(temp_datafile)-1, "%s%s", where, - driver.info_3->datafile); - make_unistr( &(info->datafile), temp_datafile ); - - snprintf(temp_configfile, sizeof(temp_configfile)-1, "%s%s", where, - driver.info_3->configfile); - make_unistr( &(info->configfile), temp_configfile ); -} - -/******************************************************************** - * construct_printer_driver_info_2 - * fill a printer_info_2 struct - ********************************************************************/ -static void construct_printer_driver_info_2(DRIVER_INFO_2 *info, int snum, - pstring servername, fstring architecture) -{ - NT_PRINTER_INFO_LEVEL printer; - NT_PRINTER_DRIVER_INFO_LEVEL driver; - - get_a_printer(&printer, 2, lp_servicename(snum) ); - get_a_printer_driver(&driver, 3, printer.info_2->drivername, architecture); - - fill_printer_driver_info_2(info, driver, servername, architecture); - - free_a_printer_driver(driver, 3); - free_a_printer(printer, 2); -} - -/******************************************************************** - * copy a strings array and convert to UNICODE - ********************************************************************/ -static void make_unistr_array(UNISTR ***uni_array, char **char_array, char *where) -{ - int i=0; - char *v; - pstring line; - - DEBUG(6,("make_unistr_array\n")); - - for (v=char_array[i]; *v!='\0'; v=char_array[i]) - { - DEBUGADD(6,("i:%d:", i)); - DEBUGADD(6,("%s:%d:", v, strlen(v))); - - *uni_array=(UNISTR **)Realloc(*uni_array, sizeof(UNISTR *)*(i+1)); - DEBUGADD(7,("realloc:[%p],", *uni_array)); - - (*uni_array)[i]=(UNISTR *)malloc( sizeof(UNISTR) ); - DEBUGADD(7,("alloc:[%p],", (*uni_array)[i])); - - snprintf(line, sizeof(line)-1, "%s%s", where, v); - make_unistr( (*uni_array)[i], line ); - DEBUGADD(7,("copy\n")); - - i++; - } - DEBUGADD(7,("last one\n")); - - *uni_array=(UNISTR **)Realloc(*uni_array, sizeof(UNISTR *)*(i+1)); - (*uni_array)[i]=0x0000; - DEBUGADD(6,("last one:done\n")); -} - -/******************************************************************** - * construct_printer_info_3 - * fill a printer_info_3 struct - ********************************************************************/ -static void fill_printer_driver_info_3(DRIVER_INFO_3 *info, - NT_PRINTER_DRIVER_INFO_LEVEL driver, - pstring servername, fstring architecture) -{ - pstring where; - pstring temp_driverpath; - pstring temp_datafile; - pstring temp_configfile; - pstring temp_helpfile; - fstring short_archi; - - get_short_archi(short_archi, architecture); - - snprintf(where,sizeof(where)-1,"\\\\%s\\print$\\%s\\", servername, short_archi); - - info->version=driver.info_3->cversion; - - make_unistr( &(info->name), driver.info_3->name ); - make_unistr( &(info->architecture), architecture ); - - snprintf(temp_driverpath, sizeof(temp_driverpath)-1, "%s%s", where, driver.info_3->driverpath); - make_unistr( &(info->driverpath), temp_driverpath ); - - snprintf(temp_datafile, sizeof(temp_datafile)-1, "%s%s", where, driver.info_3->datafile); - make_unistr( &(info->datafile), temp_datafile ); - - snprintf(temp_configfile, sizeof(temp_configfile)-1, "%s%s", where, driver.info_3->configfile); - make_unistr( &(info->configfile), temp_configfile ); - - snprintf(temp_helpfile, sizeof(temp_helpfile)-1, "%s%s", where, driver.info_3->helpfile); - make_unistr( &(info->helpfile), temp_helpfile ); - - make_unistr( &(info->monitorname), driver.info_3->monitorname ); - make_unistr( &(info->defaultdatatype), driver.info_3->defaultdatatype ); - - info->dependentfiles=NULL; - make_unistr_array(&(info->dependentfiles), driver.info_3->dependentfiles, where); -} - -/******************************************************************** - * construct_printer_info_3 - * fill a printer_info_3 struct - ********************************************************************/ -static void construct_printer_driver_info_3(DRIVER_INFO_3 *info, int snum, - pstring servername, fstring architecture) -{ - NT_PRINTER_INFO_LEVEL printer; - NT_PRINTER_DRIVER_INFO_LEVEL driver; - - get_a_printer(&printer, 2, lp_servicename(snum) ); - get_a_printer_driver(&driver, 3, printer.info_2->drivername, architecture); - - fill_printer_driver_info_3(info, driver, servername, architecture); - - free_a_printer_driver(driver, 3); - free_a_printer(printer, 2); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *rdata) -{ - SPOOL_R_GETPRINTERDRIVER2 r_u; - pstring servername; - fstring architecture; - int snum; - DRIVER_INFO_1 *info1=NULL; - DRIVER_INFO_2 *info2=NULL; - DRIVER_INFO_3 *info3=NULL; - - pstrcpy(servername, global_myname); - get_printer_snum(&(q_u->handle),&snum); - - r_u.offered=q_u->buf_size; - r_u.level=q_u->level; - r_u.status=0x0000; - - unistr2_to_ascii(architecture, &(q_u->architecture), sizeof(architecture) ); - - DEBUG(1,("spoolss_reply_getprinterdriver2:[%d]\n", q_u->level)); - - switch (q_u->level) - { - case 1: - { - info1=(DRIVER_INFO_1 *)malloc(sizeof(DRIVER_INFO_1)); - construct_printer_driver_info_1(info1, snum, servername, architecture); - r_u.printer.info1=info1; - break; - } - case 2: - { - info2=(DRIVER_INFO_2 *)malloc(sizeof(DRIVER_INFO_2)); - construct_printer_driver_info_2(info2, snum, servername, architecture); - r_u.printer.info2=info2; - break; - } - case 3: - { - info3=(DRIVER_INFO_3 *)malloc(sizeof(DRIVER_INFO_3)); - construct_printer_driver_info_3(info3, snum, servername, architecture); - r_u.printer.info3=info3; - break; - } - } - - spoolss_io_r_getprinterdriver2("",&r_u,rdata,0); - - if (info1!=NULL) free(info1); - if (info2!=NULL) free(info2); - if (info3!=NULL) - { - UNISTR **dependentfiles; - int j=0; - dependentfiles=info3->dependentfiles; - while ( dependentfiles[j] != NULL ) - { - free(dependentfiles[j]); - j++; - } - free(dependentfiles); - - free(info3); - } -} - -/******************************************************************** - * api_spoolss_getprinter - * called from the spoolss dispatcher - * - ********************************************************************/ -static void api_spoolss_getprinterdriver2(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_GETPRINTERDRIVER2 q_u; - - spoolss_io_q_getprinterdriver2("", &q_u, data, 0); - - spoolss_reply_getprinterdriver2(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *rdata) -{ - SPOOL_R_STARTPAGEPRINTER r_u; - int pnum = find_printer_index_by_hnd(&(q_u->handle)); - - if (OPEN_HANDLE(pnum)) - { - Printer[pnum].page_started=True; - r_u.status=0x0; - - spoolss_io_r_startpageprinter("",&r_u,rdata,0); - } - else - { - DEBUG(3,("Error in startpageprinter printer handle (pnum=%x)\n",pnum)); - } -} - -/******************************************************************** - * api_spoolss_getprinter - * called from the spoolss dispatcher - * - ********************************************************************/ -static void api_spoolss_startpageprinter(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_STARTPAGEPRINTER q_u; - - spoolss_io_q_startpageprinter("", &q_u, data, 0); - - spoolss_reply_startpageprinter(&q_u, rdata); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *rdata) -{ - SPOOL_R_ENDPAGEPRINTER r_u; - int pnum = find_printer_index_by_hnd(&(q_u->handle)); - - if (OPEN_HANDLE(pnum)) - { - Printer[pnum].page_started=False; - r_u.status=0x0; - - spoolss_io_r_endpageprinter("",&r_u,rdata,0); - } - else - { - DEBUG(3,("Error in endpageprinter printer handle (pnum=%x)\n",pnum)); - } -} - -/******************************************************************** - * api_spoolss_getprinter - * called from the spoolss dispatcher - * - ********************************************************************/ -static void api_spoolss_endpageprinter(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ENDPAGEPRINTER q_u; - - spoolss_io_q_endpageprinter("", &q_u, data, 0); - - spoolss_reply_endpageprinter(&q_u, rdata); -} - -/******************************************************************** - * api_spoolss_getprinter - * called from the spoolss dispatcher - * - ********************************************************************/ -static void api_spoolss_startdocprinter(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_STARTDOCPRINTER q_u; - SPOOL_R_STARTDOCPRINTER r_u; - DOC_INFO_1 *info_1; - - pstring fname; - pstring tempname; - pstring datatype; - int fd = -1; - int snum; - int pnum; - - /* decode the stream and fill the struct */ - spoolss_io_q_startdocprinter("", &q_u, data, 0); - - info_1=&(q_u.doc_info_container.docinfo.doc_info_1); - r_u.status=0x0; - pnum = find_printer_index_by_hnd(&(q_u.handle)); - - /* - * a nice thing with NT is it doesn't listen to what you tell it. - * when asked to send _only_ RAW datas, it tries to send datas - * in EMF format. - * - * So I add checks like in NT Server ... - */ - - if (info_1->p_datatype != 0) - { - unistr2_to_ascii(datatype, &(info_1->docname), sizeof(datatype)); - if (strcmp(datatype, "RAW") != 0) - { - r_u.jobid=0; - r_u.status=1804; - } - } - - if (r_u.status==0 && OPEN_HANDLE(pnum)) - { - /* get the share number of the printer */ - get_printer_snum(&(q_u.handle),&snum); - - /* Create a temporary file in the printer spool directory - * and open it - */ - - slprintf(tempname,sizeof(tempname)-1, "%s/smb_print.XXXXXX",lp_pathname(snum)); - pstrcpy(fname, (char *)mktemp(tempname)); - - fd=open(fname, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR ); - DEBUG(4,("Temp spool file created: [%s]\n", fname)); - - Printer[pnum].current_jobid=fd; - pstrcpy(Printer[pnum].document_name,fname); - - unistr2_to_ascii(Printer[pnum].job_name, - &(q_u.doc_info_container.docinfo.doc_info_1.docname), - sizeof(Printer[pnum].job_name)); - - Printer[pnum].document_fd=fd; - Printer[pnum].document_started=True; - r_u.jobid=Printer[pnum].current_jobid; - r_u.status=0x0; - - } - - spoolss_io_r_startdocprinter("",&r_u,rdata,0); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_enddocprinter(SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *rdata) -{ - SPOOL_R_ENDDOCPRINTER r_u; - int pnum = find_printer_index_by_hnd(&(q_u->handle)); - - if (OPEN_HANDLE(pnum)) - { - r_u.status=0x0; - - spoolss_io_r_enddocprinter("",&r_u,rdata,0); - } - else - { - DEBUG(3,("Error in enddocprinter printer handle (pnum=%x)\n",pnum)); - } -} - -/******************************************************************** - * api_spoolss_getprinter - * called from the spoolss dispatcher - * - ********************************************************************/ -static void api_spoolss_enddocprinter(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ENDDOCPRINTER q_u; - int pnum; - int snum; - pstring filename; - pstring filename1; - pstring job_name; - pstring syscmd; - char *tstr; - - spoolss_io_q_enddocprinter("", &q_u, data, 0); - - *syscmd=0; - - pnum = find_printer_index_by_hnd(&(q_u.handle)); - - if (OPEN_HANDLE(pnum)) - { - Printer[pnum].document_started=False; - close(Printer[pnum].document_fd); - DEBUG(4,("Temp spool file closed, printing now ...\n")); - - pstrcpy(filename1, Printer[pnum].document_name); - pstrcpy(job_name, Printer[pnum].job_name); - - get_printer_snum(&(q_u.handle),&snum); - - /* copy the command into the buffer for extensive meddling. */ - StrnCpy(syscmd, lp_printcommand(snum), sizeof(pstring) - 1); - - /* look for "%s" in the string. If there is no %s, we cannot print. */ - if (!strstr(syscmd, "%s") && !strstr(syscmd, "%f")) - { - DEBUG(2,("WARNING! No placeholder for the filename in the print command for service %s!\n", SERVICE(snum))); - } - - if (strstr(syscmd,"%s")) - { - pstrcpy(filename,filename1); - string_sub(syscmd, "%s", filename); - } - - string_sub(syscmd, "%f", filename1); - - /* Does the service have a printername? If not, make a fake and empty */ - /* printer name. That way a %p is treated sanely if no printer */ - /* name was specified to replace it. This eventuality is logged. */ - tstr = lp_printername(snum); - if (tstr == NULL || tstr[0] == '\0') - { - DEBUG(3,( "No printer name - using %s.\n", SERVICE(snum))); - tstr = SERVICE(snum); - } - - string_sub(syscmd, "%p", tstr); - - /* If the lpr command support the 'Job' option replace here */ - string_sub(syscmd, "%j", job_name); - - if ( *syscmd != '\0') - { - int ret = smbrun(syscmd, NULL, False); - DEBUG(3,("Running the command `%s' gave %d\n", syscmd, ret)); - } - else - DEBUG(0,("Null print command?\n")); - - lpq_reset(snum); - } - - spoolss_reply_enddocprinter(&q_u, rdata); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_writeprinter(SPOOL_Q_WRITEPRINTER *q_u, prs_struct *rdata) -{ - SPOOL_R_WRITEPRINTER r_u; - int pnum = find_printer_index_by_hnd(&(q_u->handle)); - - if (OPEN_HANDLE(pnum)) - { - r_u.buffer_written=Printer[pnum].document_lastwritten; - r_u.status=0x0; - - spoolss_io_r_writeprinter("",&r_u,rdata,0); - } - else - { - DEBUG(3,("Error in writeprinter printer handle (pnum=%x)\n",pnum)); - } -} - -/******************************************************************** - * api_spoolss_getprinter - * called from the spoolss dispatcher - * - ********************************************************************/ -static void api_spoolss_writeprinter(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_WRITEPRINTER q_u; - int pnum; - int fd; - int size; - spoolss_io_q_writeprinter("", &q_u, data, 0); - - pnum = find_printer_index_by_hnd(&(q_u.handle)); - - if (OPEN_HANDLE(pnum)) - { - fd=Printer[pnum].document_fd; - size=write(fd, q_u.buffer, q_u.buffer_size); - if (q_u.buffer) free(q_u.buffer); - Printer[pnum].document_lastwritten=size; - } - - spoolss_reply_writeprinter(&q_u, rdata); -} - -/******************************************************************** - * api_spoolss_getprinter - * called from the spoolss dispatcher - * - ********************************************************************/ -static void control_printer(POLICY_HND handle, uint32 command) -{ - int pnum; - int snum; - pnum = find_printer_index_by_hnd(&(handle)); - - if ( get_printer_snum(&handle, &snum) ) - { - switch (command) - { - case PRINTER_CONTROL_PAUSE: - /* pause the printer here */ - status_printqueue(NULL, snum, LPSTAT_STOPPED); - break; - - case PRINTER_CONTROL_RESUME: - case PRINTER_CONTROL_UNPAUSE: - /* UN-pause the printer here */ - status_printqueue(NULL, snum, LPSTAT_OK); - break; - case PRINTER_CONTROL_PURGE: - /* Envoi des dragées FUCA dans l'imprimante */ - break; - } - } -} - -/******************************************************************** - * called by spoolss_api_setprinter - * when updating a printer description - ********************************************************************/ -static void update_printer(POLICY_HND handle, uint32 level, - SPOOL_PRINTER_INFO_LEVEL info, DEVICEMODE *devmode) -{ - int pnum; - int snum; - NT_PRINTER_INFO_LEVEL printer; - NT_DEVICEMODE *nt_devmode; - - nt_devmode=NULL; - - DEBUG(8,("update_printer\n")); - - if (level!=2) - { - DEBUG(0,("Send a mail to samba-bugs@samba.org\n")); - DEBUGADD(0,("with the following message: update_printer: level!=2\n")); - return; - } - - pnum = find_printer_index_by_hnd(&handle); - - if ( get_printer_snum(&handle, &snum) ) - { - get_a_printer(&printer, level, lp_servicename(snum)); - - DEBUGADD(8,("Converting info_2 struct\n")); - convert_printer_info(info, &printer, level); - - if ((info.info_2)->devmode_ptr != 0) - { - /* we have a valid devmode - convert it and link it*/ - - /* the nt_devmode memory is already alloced - * while doing the get_a_printer call - * but the devmode private part is not - * it's done by convert_devicemode - */ - DEBUGADD(8,("Converting the devicemode struct\n")); - nt_devmode=printer.info_2->devmode; - - init_devicemode(nt_devmode); - - convert_devicemode(*devmode, nt_devmode); - - /* now clear the memory used in - * the RPC parsing routine - */ - if (devmode->private != NULL) - free(devmode->private); - free(devmode); - } - else - { - if (printer.info_2->devmode != NULL) - { - free(printer.info_2->devmode); - } - printer.info_2->devmode=NULL; - } - - add_a_printer(printer, level); - free_a_printer(printer, level); - } -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_setprinter(SPOOL_Q_SETPRINTER *q_u, prs_struct *rdata) -{ - SPOOL_R_SETPRINTER r_u; - - /* - Let's the sun shine !!! - Always respond everything is alright - */ - - r_u.status=0x0; - - spoolss_io_r_setprinter("",&r_u,rdata,0); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_setprinter(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_SETPRINTER q_u; - int pnum; - spoolss_io_q_setprinter("", &q_u, data, 0); - - pnum = find_printer_index_by_hnd(&(q_u.handle)); - - if (OPEN_HANDLE(pnum)) - { - /* check the level */ - switch (q_u.level) - { - case 0: - control_printer(q_u.handle, q_u.command); - break; - case 2: - update_printer(q_u.handle, q_u.level, q_u.info, q_u.devmode); - break; - } - } - spoolss_reply_setprinter(&q_u, rdata); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_fcpn(SPOOL_Q_FCPN *q_u, prs_struct *rdata) -{ - SPOOL_R_FCPN r_u; - - r_u.status=0x0; - - spoolss_io_r_fcpn("",&r_u,rdata,0); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_fcpn(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_FCPN q_u; - - spoolss_io_q_fcpn("", &q_u, data, 0); - - spoolss_reply_fcpn(&q_u, rdata); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_addjob(SPOOL_Q_ADDJOB *q_u, prs_struct *rdata) -{ - SPOOL_R_ADDJOB r_u; - - r_u.status=0x0; - - spoolss_io_r_addjob("",&r_u,rdata,0); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_addjob(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ADDJOB q_u; - - spoolss_io_q_addjob("", &q_u, data, 0); - - spoolss_reply_addjob(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - -/**************************************************************************** -****************************************************************************/ -static void fill_job_info_1(JOB_INFO_1 *job_info, print_queue_struct *queue, - int position, int snum) -{ - pstring temp_name; - - struct tm *t; - time_t unixdate = time(NULL); - - t=gmtime(&unixdate); - snprintf(temp_name, sizeof(temp_name), "\\\\%s", global_myname); - - job_info->jobid=queue->job; - make_unistr(&(job_info->printername), lp_servicename(snum)); - make_unistr(&(job_info->machinename), temp_name); - make_unistr(&(job_info->username), queue->user); - make_unistr(&(job_info->document), queue->file); - make_unistr(&(job_info->datatype), "RAW"); - make_unistr(&(job_info->text_status), ""); - job_info->status=queue->status; - job_info->priority=queue->priority; - job_info->position=position; - job_info->totalpages=0; - job_info->pagesprinted=0; - - make_systemtime(&(job_info->submitted), t); -} - -/**************************************************************************** -****************************************************************************/ -static BOOL fill_job_info_2(JOB_INFO_2 *job_info, print_queue_struct *queue, - int position, int snum) -{ - pstring temp_name; - DEVICEMODE *devmode; - NT_PRINTER_INFO_LEVEL ntprinter; - pstring chaine; - - struct tm *t; - time_t unixdate = time(NULL); - - if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) !=0 ) - { - return (False); - } - - t=gmtime(&unixdate); - snprintf(temp_name, sizeof(temp_name), "\\\\%s", global_myname); - - job_info->jobid=queue->job; - - snprintf(chaine, sizeof(chaine)-1, "\\\\%s\\%s", global_myname, ntprinter.info_2->printername); - make_unistr(&(job_info->printername), chaine); - - make_unistr(&(job_info->machinename), temp_name); - make_unistr(&(job_info->username), queue->user); - make_unistr(&(job_info->document), queue->file); - make_unistr(&(job_info->notifyname), queue->user); - make_unistr(&(job_info->datatype), "RAW"); - make_unistr(&(job_info->printprocessor), "winprint"); - make_unistr(&(job_info->parameters), ""); - make_unistr(&(job_info->text_status), ""); - -/* and here the security descriptor */ - - job_info->status=queue->status; - job_info->priority=queue->priority; - job_info->position=position; - job_info->starttime=0; - job_info->untiltime=0; - job_info->totalpages=0; - job_info->size=queue->size; - make_systemtime(&(job_info->submitted), t); - job_info->timeelapsed=0; - job_info->pagesprinted=0; - - devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE)); - ZERO_STRUCTP(devmode); - construct_dev_mode(devmode, snum, global_myname); - job_info->devmode=devmode; - - free_a_printer(ntprinter, 2); - return (True); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_enumjobs(SPOOL_Q_ENUMJOBS *q_u, prs_struct *rdata) -{ - SPOOL_R_ENUMJOBS r_u; - int snum; - int count; - int i; - print_queue_struct *queue=NULL; - print_status_struct status; - JOB_INFO_1 *job_info_1=NULL; - JOB_INFO_2 *job_info_2=NULL; - - DEBUG(4,("spoolss_reply_enumjobs\n")); - - bzero(&status,sizeof(status)); - - r_u.offered=q_u->buf_size; - - - if (get_printer_snum(&(q_u->handle), &snum)) - { - count=get_printqueue(snum, NULL, &queue, &status); - r_u.numofjobs=0; - - r_u.level=q_u->level; - - DEBUG(4,("count:[%d], status:[%d], [%s]\n", count, status.status, status.message)); - - switch (r_u.level) - { - case 1: - { - for (i=0; i<count; i++) - { - job_info_1=(JOB_INFO_1 *)malloc(count*sizeof(JOB_INFO_1)); - add_job1_to_array(&r_u.numofjobs, - &r_u.job.job_info_1, - job_info_1); - - fill_job_info_1(r_u.job.job_info_1[i], &(queue[i]), i, snum); - } - break; - } - case 2: - { - for (i=0; i<count; i++) - { - job_info_2=(JOB_INFO_2 *)malloc(count*sizeof(JOB_INFO_2)); - add_job2_to_array(&r_u.numofjobs, - &r_u.job.job_info_2, - job_info_2); - - fill_job_info_2(r_u.job.job_info_2[i], &(queue[i]), i, snum); - } - break; - } - } - } - - r_u.status = 0x0; - - spoolss_io_r_enumjobs("",&r_u,rdata,0); - - if (queue) free(queue); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_enumjobs(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ENUMJOBS q_u; - - spoolss_io_q_enumjobs("", &q_u, data, 0); - - spoolss_reply_enumjobs(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_schedulejob(SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *rdata) -{ - SPOOL_R_SCHEDULEJOB r_u; - - r_u.status=0x0; - - spoolss_io_r_schedulejob("",&r_u,rdata,0); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_schedulejob(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_SCHEDULEJOB q_u; - - spoolss_io_q_schedulejob("", &q_u, data, 0); - - spoolss_reply_schedulejob(&q_u, rdata); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_setjob(SPOOL_Q_SETJOB *q_u, prs_struct *rdata) -{ - SPOOL_R_SETJOB r_u; - int snum; - print_queue_struct *queue=NULL; - print_status_struct status; - int i=0; - BOOL found=False; - int count; - - bzero(&status,sizeof(status)); - - if (get_printer_snum(&(q_u->handle), &snum)) - { - count=get_printqueue(snum, NULL, &queue, &status); - while ( (i<count) && found==False ) - { - if ( q_u->jobid == queue[i].job ) - { - found=True; - } - i++; - } - - if (found==True) - { - switch (q_u->command) - { - case JOB_CONTROL_CANCEL: - case JOB_CONTROL_DELETE: - { - del_printqueue(NULL, snum, q_u->jobid); - break; - } - case JOB_CONTROL_PAUSE: - { - status_printjob(NULL, snum, q_u->jobid, LPQ_PAUSED); - break; - } - case JOB_CONTROL_RESUME: - { - status_printjob(NULL, snum, q_u->jobid, LPQ_QUEUED); - break; - } - } - } - } - r_u.status=0x0; - spoolss_io_r_setjob("",&r_u,rdata,0); - if (queue) free(queue); - -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_setjob(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_SETJOB q_u; - - spoolss_io_q_setjob("", &q_u, data, 0); - - spoolss_reply_setjob(&q_u, rdata); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *rdata) -{ - SPOOL_R_ENUMPRINTERDRIVERS r_u; - NT_PRINTER_DRIVER_INFO_LEVEL driver; - int count; - int i; - fstring *list; - DRIVER_INFO_1 *driver_info_1=NULL; - DRIVER_INFO_2 *driver_info_2=NULL; - DRIVER_INFO_3 *driver_info_3=NULL; - fstring servername; - fstring architecture; - - DEBUG(4,("spoolss_reply_enumdrivers\n")); - fstrcpy(servername, global_myname); - - unistr2_to_ascii(architecture, &(q_u->environment), sizeof(architecture)); - count=get_ntdrivers(&list, architecture); - - DEBUGADD(4,("we have: [%d] drivers on archi [%s]\n",count, architecture)); - for (i=0; i<count; i++) - { - DEBUGADD(5,("driver [%s]\n",list[i])); - } - - r_u.offered=q_u->buf_size; - r_u.numofdrivers=count; - r_u.level=q_u->level; - - switch (r_u.level) - { - case 1: - { - driver_info_1=(DRIVER_INFO_1 *)malloc(count*sizeof(DRIVER_INFO_1)); - - for (i=0; i<count; i++) - { - get_a_printer_driver(&driver, 3, list[i], architecture); - fill_printer_driver_info_1(&(driver_info_1[i]), driver, servername, architecture ); - free_a_printer_driver(driver, 3); - } - r_u.driver.driver_info_1=driver_info_1; - break; - } - case 2: - { - driver_info_2=(DRIVER_INFO_2 *)malloc(count*sizeof(DRIVER_INFO_2)); - - for (i=0; i<count; i++) - { - get_a_printer_driver(&driver, 3, list[i], architecture); - fill_printer_driver_info_2(&(driver_info_2[i]), driver, servername, architecture ); - free_a_printer_driver(driver, 3); - } - r_u.driver.driver_info_2=driver_info_2; - break; - } - case 3: - { - driver_info_3=(DRIVER_INFO_3 *)malloc(count*sizeof(DRIVER_INFO_3)); - - for (i=0; i<count; i++) - { - get_a_printer_driver(&driver, 3, list[i], architecture); - fill_printer_driver_info_3(&(driver_info_3[i]), driver, servername, architecture ); - free_a_printer_driver(driver, 3); - } - r_u.driver.driver_info_3=driver_info_3; - break; - } - } - - r_u.status=0x0; - - spoolss_io_r_enumdrivers("",&r_u,rdata,0); - - switch (r_u.level) - { - case 1: - { - free(driver_info_1); - break; - } - case 2: - { - free(driver_info_2); - break; - } - case 3: - { - UNISTR **dependentfiles; - - for (i=0; i<count; i++) - { - int j=0; - dependentfiles=(driver_info_3[i]).dependentfiles; - while ( dependentfiles[j] != NULL ) - { - free(dependentfiles[j]); - j++; - } - - free(dependentfiles); - } - free(driver_info_3); - break; - } - } -} - -/**************************************************************************** -****************************************************************************/ - -static void api_spoolss_enumprinterdrivers(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ENUMPRINTERDRIVERS q_u; - - spoolss_io_q_enumprinterdrivers("", &q_u, data, 0); - - spoolss_reply_enumprinterdrivers(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - - -/**************************************************************************** -****************************************************************************/ -static void fill_form_1(FORM_1 *form, nt_forms_struct *list, int position) -{ - form->flag=list->flag; - make_unistr(&(form->name), list->name); - form->width=list->width; - form->length=list->length; - form->left=list->left; - form->top=list->top; - form->right=list->right; - form->bottom=list->bottom; -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_enumforms(SPOOL_Q_ENUMFORMS *q_u, prs_struct *rdata) -{ - SPOOL_R_ENUMFORMS r_u; - int count; - int i; - nt_forms_struct *list=NULL; - FORM_1 *forms_1=NULL; - - DEBUG(4,("spoolss_reply_enumforms\n")); - - count=get_ntforms(&list); - r_u.offered=q_u->buf_size; - r_u.numofforms=count; - r_u.level=q_u->level; - r_u.status=0x0; - - DEBUGADD(5,("Offered buffer size [%d]\n", r_u.offered)); - DEBUGADD(5,("Number of forms [%d]\n", r_u.numofforms)); - DEBUGADD(5,("Info level [%d]\n", r_u.level)); - - switch (r_u.level) - { - case 1: - { - forms_1=(FORM_1 *)malloc(count*sizeof(FORM_1)); - for (i=0; i<count; i++) - { - DEBUGADD(6,("Filling form number [%d]\n",i)); - fill_form_1(&(forms_1[i]), &(list[i]), i); - } - r_u.forms_1=forms_1; - break; - } - } - spoolss_io_r_enumforms("",&r_u,rdata,0); - switch (r_u.level) - { - case 1: - { - free(forms_1); - break; - } - } - free(list); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_enumforms(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ENUMFORMS q_u; - - spoolss_io_q_enumforms("", &q_u, data, 0); - - spoolss_reply_enumforms(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - -/**************************************************************************** -****************************************************************************/ -static void fill_port_2(PORT_INFO_2 *port, char *name) -{ - make_unistr(&(port->port_name), name); - make_unistr(&(port->monitor_name), "Moniteur Local"); - make_unistr(&(port->description), "Local Port"); -#define PORT_TYPE_WRITE 1 - port->port_type=PORT_TYPE_WRITE; - port->reserved=0x0; -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_enumports(SPOOL_Q_ENUMPORTS *q_u, prs_struct *rdata) -{ - SPOOL_R_ENUMPORTS r_u; - int i=0; - PORT_INFO_2 *ports_2=NULL; - int n_services=lp_numservices(); - int snum; - - DEBUG(4,("spoolss_reply_enumports\n")); - - r_u.offered=q_u->buf_size; - r_u.level=q_u->level; - r_u.status=0x0; - - switch (r_u.level) - { - case 2: - { - ports_2=(PORT_INFO_2 *)malloc(n_services*sizeof(PORT_INFO_2)); - for (snum=0; snum<n_services; snum++) - { - if ( lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) - { - DEBUGADD(6,("Filling port number [%d]\n",i)); - fill_port_2(&(ports_2[i]), lp_servicename(snum)); - i++; - } - } - r_u.port.port_info_2=ports_2; - break; - } - } - r_u.numofports=i; - spoolss_io_r_enumports("",&r_u,rdata,0); - switch (r_u.level) - { - case 2: - { - free(ports_2); - break; - } - } -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_enumports(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ENUMPORTS q_u; - - spoolss_io_q_enumports("", &q_u, data, 0); - - spoolss_reply_enumports(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_addprinterex(SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *rdata) -{ - SPOOL_R_ADDPRINTEREX r_u; - BOOL printer_open = False; - fstring ascii_name; - fstring server_name; - fstring share_name; - UNISTR2 *portname; - SPOOL_PRINTER_INFO_LEVEL_2 *info2; - SPOOL_PRINTER_INFO_LEVEL *info; - - info=&(q_u->info); - info2=info->info_2; - portname=&(info2->portname); - - r_u.status=0x0; /* everything is always nice in this world */ - - StrnCpy(server_name, global_myname, strlen(global_myname) ); - unistr2_to_ascii(share_name, portname, sizeof(share_name)-1); - - slprintf(ascii_name, sizeof(ascii_name)-1, "\\\\%s\\%s", - server_name, share_name); - - printer_open = open_printer_hnd(&(r_u.handle)); - set_printer_hnd_printertype(&(r_u.handle), ascii_name); - set_printer_hnd_printername(&(r_u.handle), ascii_name); - - spoolss_io_r_addprinterex("", &r_u, rdata, 0); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_addprinterex(rpcsrv_struct *p, prs_struct *data, prs_struct *rdata) -{ - SPOOL_Q_ADDPRINTEREX q_u; - NT_PRINTER_INFO_LEVEL printer; - - /* read the stream and decode */ - spoolss_io_q_addprinterex("", &q_u, data, 0); - - /* NULLify info_2 here */ - /* don't put it in convert_printer_info as it's used also with non-NULL values */ - printer.info_2=NULL; - - /* convert from UNICODE to ASCII */ - convert_printer_info(q_u.info, &printer, q_u.level); - - /* write the ASCII on disk */ - add_a_printer(printer, q_u.level); - - spoolss_reply_addprinterex(&q_u, rdata); - /* free mem used in q_u and r_u */ - - /* free_add_printer(q_u, r_u); */ -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_addprinterdriver(SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *rdata) -{ - SPOOL_R_ADDPRINTERDRIVER r_u; - - r_u.status=0x0; /* everything is always nice in this world */ - - spoolss_io_r_addprinterdriver("", &r_u, rdata, 0); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_addprinterdriver(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ADDPRINTERDRIVER q_u; - NT_PRINTER_DRIVER_INFO_LEVEL driver; - - spoolss_io_q_addprinterdriver("", &q_u, data, 0); - - convert_printer_driver_info(q_u.info, &driver, q_u.level); - - add_a_printer_driver(driver, q_u.level); - - spoolss_reply_addprinterdriver(&q_u, rdata); - /* free mem used in q_u and r_u */ -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_getprinterdriverdirectory(SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *rdata) -{ - SPOOL_R_GETPRINTERDRIVERDIR r_u; - pstring chaine; - pstring long_archi; - pstring archi; - - r_u.offered=q_u->buf_size; - r_u.level=q_u->level; - r_u.status=0x0; - - unistr2_to_ascii(long_archi, &(q_u->environment), sizeof(long_archi)-1); - get_short_archi(archi, long_archi); - - slprintf(chaine,sizeof(chaine)-1,"\\\\%s\\print$\\%s", global_myname, archi); - - DEBUG(4,("printer driver directory: [%s]\n", chaine)); - - make_unistr(&(r_u.driver.driver_info_1.name), chaine); - - spoolss_io_r_getprinterdriverdir("", &r_u, rdata, 0); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_getprinterdriverdirectory(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_GETPRINTERDRIVERDIR q_u; - - spoolss_io_q_getprinterdriverdir("", &q_u, data, 0); - - spoolss_reply_getprinterdriverdirectory(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *rdata) -{ - SPOOL_R_ENUMPRINTERDATA r_u; - NT_PRINTER_INFO_LEVEL printer; - - uint32 type; - fstring value; - uint8 *data=NULL; - - uint32 param_index; - uint32 biggest_valuesize; - uint32 biggest_datasize; - uint32 data_len; - - int pnum = find_printer_index_by_hnd(&(q_u->handle)); - int snum; - - DEBUG(5,("spoolss_reply_enumprinterdata\n")); - - if (OPEN_HANDLE(pnum)) - { - get_printer_snum(&(q_u->handle), &snum); - get_a_printer(&printer, 2, lp_servicename(snum)); - - /* The NT machine wants to know the biggest size of value and data */ - if ( (q_u->valuesize==0) && (q_u->datasize==0) ) - { - DEBUGADD(6,("Activating NT mega-hack to find sizes\n")); - - r_u.valuesize=0; - r_u.realvaluesize=0; - r_u.type=0; - r_u.datasize=0; - r_u.realdatasize=0; - r_u.status=0; - - param_index=0; - biggest_valuesize=0; - biggest_datasize=0; - - while (get_specific_param_by_index(printer, 2, param_index, value, &data, &type, &data_len)) - { - if (strlen(value) > biggest_valuesize) biggest_valuesize=strlen(value); - if (data_len > biggest_datasize) biggest_datasize=data_len; - - param_index++; - } - - /* I wrote it, I didn't designed the protocol */ - if (biggest_valuesize!=0) - { - SIVAL(&(r_u.value),0, 2*(biggest_valuesize+1) ); - } - r_u.data=(uint8 *)malloc(4*sizeof(uint8)); - SIVAL(r_u.data, 0, biggest_datasize ); - } - else - { - /* - * the value len is wrong in NT sp3 - * that's the number of bytes not the number of unicode chars - */ - - r_u.valuesize=q_u->valuesize; - r_u.datasize=q_u->datasize; - - if (get_specific_param_by_index(printer, 2, q_u->index, value, &data, &type, &data_len)) - { - make_unistr(&(r_u.value), value); - r_u.data=data; - - r_u.type=type; - - /* the length are in bytes including leading NULL */ - r_u.realvaluesize=2*(strlen(value)+1); - r_u.realdatasize=data_len; - - r_u.status=0; - } - else - { - r_u.valuesize=0; - r_u.realvaluesize=0; - r_u.datasize=0; - r_u.realdatasize=0; - r_u.type=0; - r_u.status=0x0103; /* ERROR_NO_MORE_ITEMS */ - } - } - - free_a_printer(printer, 2); - } - spoolss_io_r_enumprinterdata("", &r_u, rdata, 0); - if (r_u.data!=NULL) free(r_u.data); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_enumprinterdata(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ENUMPRINTERDATA q_u; - - spoolss_io_q_enumprinterdata("", &q_u, data, 0); - - spoolss_reply_enumprinterdata(&q_u, rdata); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *rdata) -{ - SPOOL_R_SETPRINTERDATA r_u; - NT_PRINTER_INFO_LEVEL printer; - NT_PRINTER_PARAM *param = NULL; - - int pnum=0; - int snum=0; - - DEBUG(5,("spoolss_reply_setprinterdata\n")); - - pnum = find_printer_index_by_hnd(&(q_u->handle)); - - if (OPEN_HANDLE(pnum)) - { - get_printer_snum(&(q_u->handle), &snum); - get_a_printer(&printer, 2, lp_servicename(snum)); - convert_specific_param(¶m, q_u->value , q_u->type, q_u->data, q_u->real_len); - - unlink_specific_param_if_exist(printer.info_2, param); - - add_a_specific_param(printer.info_2, param); - - add_a_printer(printer, 2); - - free_a_printer(printer, 2); - } - - r_u.status = 0x0; - spoolss_io_r_setprinterdata("", &r_u, rdata, 0); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_setprinterdata(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_SETPRINTERDATA q_u; - - spoolss_io_q_setprinterdata("", &q_u, data, 0); - - spoolss_reply_setprinterdata(&q_u, rdata); - - free(q_u.data); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_addform(SPOOL_Q_ADDFORM *q_u, prs_struct *rdata) -{ - SPOOL_R_ADDFORM r_u; - int pnum=0; - int count=0; - nt_forms_struct *list=NULL; - - DEBUG(5,("spoolss_reply_addform\n")); - - pnum = find_printer_index_by_hnd(&(q_u->handle)); - - if (OPEN_HANDLE(pnum)) - { - count=get_ntforms(&list); - - add_a_form(&list, q_u->form, &count); - - write_ntforms(&list, count); - - free(list); - } - - r_u.status = 0x0; - spoolss_io_r_addform("", &r_u, rdata, 0); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_addform(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ADDFORM q_u; - - spoolss_io_q_addform("", &q_u, data, 0); - - spoolss_reply_addform(&q_u, rdata); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_setform(SPOOL_Q_SETFORM *q_u, prs_struct *rdata) -{ - SPOOL_R_SETFORM r_u; - int pnum=0; - int count=0; - nt_forms_struct *list=NULL; - - DEBUG(5,("spoolss_reply_setform\n")); - - pnum = find_printer_index_by_hnd(&(q_u->handle)); - - if (OPEN_HANDLE(pnum)) - { - count=get_ntforms(&list); - - update_a_form(&list, q_u->form, count); - - write_ntforms(&list, count); - - free(list); - } - r_u.status = 0x0; - spoolss_io_r_setform("", &r_u, rdata, 0); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_setform(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_SETFORM q_u; - - spoolss_io_q_setform("", &q_u, data, 0); - - spoolss_reply_setform(&q_u, rdata); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_enumprintprocessors(SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *rdata) -{ - SPOOL_R_ENUMPRINTPROCESSORS r_u; - PRINTPROCESSOR_1 *info_1; - - DEBUG(5,("spoolss_reply_enumprintprocessors\n")); - - /* - * Enumerate the print processors ... - * - * Just reply with "winprint", to keep NT happy - * and I can use my nice printer checker. - */ - - r_u.status = 0x0; - r_u.offered = q_u->buf_size; - r_u.level = q_u->level; - - r_u.numofprintprocessors = 0x1; - - info_1 = (PRINTPROCESSOR_1 *)malloc(sizeof(PRINTPROCESSOR_1)); - - make_unistr(&(info_1->name), "winprint"); - - r_u.info_1=info_1; - - spoolss_io_r_enumprintprocessors("", &r_u, rdata, 0); - - free(info_1); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_enumprintprocessors(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ENUMPRINTPROCESSORS q_u; - - spoolss_io_q_enumprintprocessors("", &q_u, data, 0); - - spoolss_reply_enumprintprocessors(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_enumprintmonitors(SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *rdata) -{ - SPOOL_R_ENUMPRINTMONITORS r_u; - PRINTMONITOR_1 *info_1; - - DEBUG(5,("spoolss_reply_enumprintmonitors\n")); - - /* - * Enumerate the print monitors ... - * - * Just reply with "Local Port", to keep NT happy - * and I can use my nice printer checker. - */ - - r_u.status = 0x0; - r_u.offered = q_u->buf_size; - r_u.level = q_u->level; - - r_u.numofprintmonitors = 0x1; - - info_1 = (PRINTMONITOR_1 *)malloc(sizeof(PRINTMONITOR_1)); - - make_unistr(&(info_1->name), "Local Port"); - - r_u.info_1=info_1; - - spoolss_io_r_enumprintmonitors("", &r_u, rdata, 0); - - free(info_1); -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_enumprintmonitors(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_ENUMPRINTMONITORS q_u; - - spoolss_io_q_enumprintmonitors("", &q_u, data, 0); - - spoolss_reply_enumprintmonitors(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - -/**************************************************************************** -****************************************************************************/ -static void spoolss_reply_getjob(SPOOL_Q_GETJOB *q_u, prs_struct *rdata) -{ - SPOOL_R_GETJOB r_u; - int snum; - int count; - int i; - print_queue_struct *queue=NULL; - print_status_struct status; - JOB_INFO_1 *job_info_1=NULL; - JOB_INFO_2 *job_info_2=NULL; - - DEBUG(4,("spoolss_reply_getjob\n")); - - bzero(&status,sizeof(status)); - - r_u.offered=q_u->buf_size; - - if (get_printer_snum(&(q_u->handle), &snum)) - { - count=get_printqueue(snum, NULL, &queue, &status); - - r_u.level=q_u->level; - - DEBUGADD(4,("count:[%d], status:[%d], [%s]\n", count, status.status, status.message)); - - switch (r_u.level) - { - case 1: - { - job_info_1=(JOB_INFO_1 *)malloc(sizeof(JOB_INFO_1)); - - for (i=0; i<count; i++) - { - if (queue[i].job==(int)q_u->jobid) - { - fill_job_info_1(job_info_1, &(queue[i]), i, snum); - } - } - r_u.job.job_info_1=job_info_1; - break; - } - case 2: - { - job_info_2=(JOB_INFO_2 *)malloc(sizeof(JOB_INFO_2)); - - for (i=0; i<count; i++) - { - if (queue[i].job==(int)q_u->jobid) - { - fill_job_info_2(job_info_2, &(queue[i]), i, snum); - } - } - r_u.job.job_info_2=job_info_2; - break; - } - } - } - - r_u.status=0x0; - - spoolss_io_r_getjob("",&r_u,rdata,0); - switch (r_u.level) - { - case 1: - { - free(job_info_1); - break; - } - case 2: - { - free_devmode(job_info_2->devmode); - free(job_info_2); - break; - } - } - if (queue) free(queue); - -} - -/**************************************************************************** -****************************************************************************/ -static void api_spoolss_getjob(rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata) -{ - SPOOL_Q_GETJOB q_u; - - spoolss_io_q_getjob("", &q_u, data, 0); - - spoolss_reply_getjob(&q_u, rdata); - - spoolss_io_free_buffer(&(q_u.buffer)); -} - -/******************************************************************* -\pipe\spoolss commands -********************************************************************/ -struct api_struct api_spoolss_cmds[] = -{ - {"SPOOLSS_OPENPRINTEREX", SPOOLSS_OPENPRINTEREX, api_spoolss_open_printer_ex }, - {"SPOOLSS_GETPRINTERDATA", SPOOLSS_GETPRINTERDATA, api_spoolss_getprinterdata }, - {"SPOOLSS_CLOSEPRINTER", SPOOLSS_CLOSEPRINTER, api_spoolss_closeprinter }, - {"SPOOLSS_RFFPCNEX", SPOOLSS_RFFPCNEX, api_spoolss_rffpcnex }, - {"SPOOLSS_RFNPCNEX", SPOOLSS_RFNPCNEX, api_spoolss_rfnpcnex }, - {"SPOOLSS_ENUMPRINTERS", SPOOLSS_ENUMPRINTERS, api_spoolss_enumprinters }, - {"SPOOLSS_GETPRINTER", SPOOLSS_GETPRINTER, api_spoolss_getprinter }, - {"SPOOLSS_GETPRINTERDRIVER2", SPOOLSS_GETPRINTERDRIVER2, api_spoolss_getprinterdriver2 }, - {"SPOOLSS_STARTPAGEPRINTER", SPOOLSS_STARTPAGEPRINTER, api_spoolss_startpageprinter }, - {"SPOOLSS_ENDPAGEPRINTER", SPOOLSS_ENDPAGEPRINTER, api_spoolss_endpageprinter }, - {"SPOOLSS_STARTDOCPRINTER", SPOOLSS_STARTDOCPRINTER, api_spoolss_startdocprinter }, - {"SPOOLSS_ENDDOCPRINTER", SPOOLSS_ENDDOCPRINTER, api_spoolss_enddocprinter }, - {"SPOOLSS_WRITEPRINTER", SPOOLSS_WRITEPRINTER, api_spoolss_writeprinter }, - {"SPOOLSS_SETPRINTER", SPOOLSS_SETPRINTER, api_spoolss_setprinter }, - {"SPOOLSS_FCPN", SPOOLSS_FCPN, api_spoolss_fcpn }, - {"SPOOLSS_ADDJOB", SPOOLSS_ADDJOB, api_spoolss_addjob }, - {"SPOOLSS_ENUMJOBS", SPOOLSS_ENUMJOBS, api_spoolss_enumjobs }, - {"SPOOLSS_SCHEDULEJOB", SPOOLSS_SCHEDULEJOB, api_spoolss_schedulejob }, - {"SPOOLSS_SETJOB", SPOOLSS_SETJOB, api_spoolss_setjob }, - {"SPOOLSS_ENUMFORMS", SPOOLSS_ENUMFORMS, api_spoolss_enumforms }, - {"SPOOLSS_ENUMPORTS", SPOOLSS_ENUMPORTS, api_spoolss_enumports }, - {"SPOOLSS_ENUMPRINTERDRIVERS", SPOOLSS_ENUMPRINTERDRIVERS, api_spoolss_enumprinterdrivers }, - {"SPOOLSS_ADDPRINTEREX", SPOOLSS_ADDPRINTEREX, api_spoolss_addprinterex }, - {"SPOOLSS_ADDPRINTERDRIVER", SPOOLSS_ADDPRINTERDRIVER, api_spoolss_addprinterdriver }, - {"SPOOLSS_GETPRINTERDRIVERDIRECTORY", SPOOLSS_GETPRINTERDRIVERDIRECTORY, api_spoolss_getprinterdriverdirectory }, - {"SPOOLSS_ENUMPRINTERDATA", SPOOLSS_ENUMPRINTERDATA, api_spoolss_enumprinterdata }, - {"SPOOLSS_SETPRINTERDATA", SPOOLSS_SETPRINTERDATA, api_spoolss_setprinterdata }, - {"SPOOLSS_ADDFORM", SPOOLSS_ADDFORM, api_spoolss_addform }, - {"SPOOLSS_SETFORM", SPOOLSS_SETFORM, api_spoolss_setform }, - {"SPOOLSS_ENUMPRINTPROCESSORS", SPOOLSS_ENUMPRINTPROCESSORS, api_spoolss_enumprintprocessors }, - {"SPOOLSS_ENUMMONITORS", SPOOLSS_ENUMMONITORS, api_spoolss_enumprintmonitors }, - {"SPOOLSS_GETJOB", SPOOLSS_GETJOB, api_spoolss_getjob }, - { NULL, 0, NULL } -}; - -/******************************************************************* -receives a spoolss pipe and responds. -********************************************************************/ -BOOL api_spoolss_rpc(rpcsrv_struct *p, prs_struct *data) -{ - return api_rpcTNP(p, "api_spoolss_rpc", api_spoolss_cmds, data); -} - diff --git a/source3/rpc_server/srv_svcctl.c b/source3/rpc_server/srv_svcctl.c deleted file mode 100644 index 12f0bdf3b3..0000000000 --- a/source3/rpc_server/srv_svcctl.c +++ /dev/null @@ -1,388 +0,0 @@ - -/* - * Unix SMB/Netbios implementation. - * Version 1.9. - * RPC Pipe client / server routines - * 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 "nterr.h" - -extern int DEBUGLEVEL; - - -/******************************************************************* - svc_reply_unknown_1 - ********************************************************************/ -static void svc_reply_close(SVC_Q_CLOSE *q_r, - prs_struct *rdata) -{ - SVC_R_CLOSE r_u; - - /* set up the REG unknown_1 response */ - bzero(r_u.pol.data, POL_HND_SIZE); - - /* close the policy handle */ - if (close_policy_hnd(&(q_r->pol))) - { - r_u.status = 0; - } - else - { - r_u.status = 0xC0000000 | NT_STATUS_OBJECT_NAME_INVALID; - } - - DEBUG(5,("svc_unknown_1: %d\n", __LINE__)); - - /* store the response in the SMB stream */ - svc_io_r_close("", &r_u, rdata, 0); - - DEBUG(5,("svc_unknown_1: %d\n", __LINE__)); -} - -/******************************************************************* - api_svc_close - ********************************************************************/ -static void api_svc_close( rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata ) -{ - SVC_Q_CLOSE q_r; - svc_io_q_close("", &q_r, data, 0); - svc_reply_close(&q_r, rdata); -} - - -/******************************************************************* - svc_reply_open_service - ********************************************************************/ -static void svc_reply_open_service(SVC_Q_OPEN_SERVICE *q_u, - prs_struct *rdata) -{ - uint32 status = 0; - POLICY_HND pol; - SVC_R_OPEN_SERVICE r_u; - fstring name; - - DEBUG(5,("svc_open_service: %d\n", __LINE__)); - - if (status == 0x0 && find_policy_by_hnd(&q_u->scman_pol) == -1) - { - status = 0xC000000 | NT_STATUS_INVALID_HANDLE; - } - - if (status == 0x0 && !open_policy_hnd(&pol)) - { - status = 0xC000000 | NT_STATUS_TOO_MANY_SECRETS; /* ha ha very droll */ - } - - unistr2_to_ascii(name, &q_u->uni_svc_name, sizeof(name)-1); - - if (status == 0x0) - { - DEBUG(5,("svc_open_service: %s\n", name)); - /* lkcl XXXX do a check on the name, here */ - } - - if (status == 0x0 && !set_policy_reg_name(&pol, name)) - { - status = 0xC000000 | NT_STATUS_TOO_MANY_SECRETS; /* ha ha very droll */ - } - - make_svc_r_open_service(&r_u, &pol, status); - - /* store the response in the SMB stream */ - svc_io_r_open_service("", &r_u, rdata, 0); - - DEBUG(5,("svc_open_service: %d\n", __LINE__)); -} - -/******************************************************************* - api_svc_open_service - ********************************************************************/ -static void api_svc_open_service( rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata ) -{ - SVC_Q_OPEN_SERVICE q_u; - svc_io_q_open_service("", &q_u, data, 0); - svc_reply_open_service(&q_u, rdata); -} - -/******************************************************************* - svc_reply_start_service - ********************************************************************/ -static void svc_reply_start_service(SVC_Q_START_SERVICE *q_s, - prs_struct *rdata) -{ - SVC_R_START_SERVICE r_s; - - DEBUG(5,("svc_start_service: %d\n", __LINE__)); - - r_s.status = 0x0; - - if (find_policy_by_hnd(&q_s->pol) == -1) - { - r_s.status = 0xC000000 | NT_STATUS_INVALID_HANDLE; - } - - /* start the service here */ - - /* store the response in the SMB stream */ - svc_io_r_start_service("", &r_s, rdata, 0); - - DEBUG(5,("svc_start_service: %d\n", __LINE__)); -} - -/******************************************************************* - api_svc_start_service - ********************************************************************/ -static void api_svc_start_service( rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata ) -{ - SVC_Q_START_SERVICE q_u; - svc_io_q_start_service("", &q_u, data, 0); - svc_reply_start_service(&q_u, rdata); -} - -/******************************************************************* - svc_reply_open_sc_man - ********************************************************************/ -static void svc_reply_open_sc_man(SVC_Q_OPEN_SC_MAN *q_u, - prs_struct *rdata) -{ - uint32 status = 0; - POLICY_HND pol; - SVC_R_OPEN_SC_MAN r_u; - fstring name; - - DEBUG(5,("svc_open_sc_man: %d\n", __LINE__)); - - if (status == 0x0 && !open_policy_hnd(&pol)) - { - status = 0xC000000 | NT_STATUS_TOO_MANY_SECRETS; /* ha ha very droll */ - } - - unistr2_to_ascii(name, &q_u->uni_srv_name, sizeof(name)-1); - - if (status == 0x0) - { - DEBUG(5,("svc_open_sc_man: %s\n", name)); - /* lkcl XXXX do a check on the name, here */ - } - - if (status == 0x0 && !set_policy_reg_name(&pol, name)) - { - status = 0xC000000 | NT_STATUS_TOO_MANY_SECRETS; /* ha ha very droll */ - } - - make_svc_r_open_sc_man(&r_u, &pol, status); - - /* store the response in the SMB stream */ - svc_io_r_open_sc_man("", &r_u, rdata, 0); - - DEBUG(5,("svc_open_sc_man: %d\n", __LINE__)); -} - -/******************************************************************* - api_svc_open_sc_man - ********************************************************************/ -static void api_svc_open_sc_man( rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata ) -{ - SVC_Q_OPEN_SC_MAN q_u; - svc_io_q_open_sc_man("", &q_u, data, 0); - svc_reply_open_sc_man(&q_u, rdata); -} - -static char *dummy_services[] = -{ - "imapd", - "popd", - "smbd", - "nmbd", - "httpd", - "inetd", - "syslogd", - NULL -}; - -/******************************************************************* - svc_reply_enum_svcs_status - ********************************************************************/ -static void svc_reply_enum_svcs_status(SVC_Q_ENUM_SVCS_STATUS *q_u, - prs_struct *rdata) -{ - uint32 dos_status = 0; - SVC_R_ENUM_SVCS_STATUS r_u; - ENUM_SRVC_STATUS *svcs = NULL; - int num_svcs = 0; - int buf_size = 0; - int i = get_enum_hnd(&q_u->resume_hnd); - uint32 resume_hnd = 0; - int max_buf_size = 0x10000; - - ZERO_STRUCT(r_u); - - DEBUG(5,("svc_enum_svcs_status: %d\n", __LINE__)); - - if (dos_status == 0x0 && find_policy_by_hnd(&q_u->pol) == -1) - { - dos_status = 0xC000000 | NT_STATUS_INVALID_HANDLE; - } - - if (dos_status == 0x0) - { - DEBUG(5,("svc_enum_svcs_status:\n")); - while (dummy_services[i] != NULL) - { - ENUM_SRVC_STATUS *svc = NULL; - - buf_size += strlen(dummy_services[i] + 1) * 2; - buf_size += 9 * sizeof(uint32); - - DEBUG(10,("buf_size: %d q_u->buf_size: %d\n", - buf_size, q_u->buf_size)); - - if (buf_size >= max_buf_size) - { - resume_hnd = i; - break; - } - - if (buf_size > q_u->buf_size) - { - dos_status = ERRmoredata; - break; - } - - num_svcs++; - svcs = Realloc(svcs, num_svcs * sizeof(ENUM_SRVC_STATUS)); - if (svcs == NULL) - { - dos_status = ERRnomem; - num_svcs = 0; - break; - } - - svc = &svcs[num_svcs-1]; - ZERO_STRUCTP(svc); - - make_unistr(&svc->uni_srvc_name, dummy_services[i]); - make_unistr(&svc->uni_disp_name, dummy_services[i]); - - DEBUG(10,("show service: %s\n", dummy_services[i])); - i++; - } - } - - /* - * check for finished condition: no resume handle and last buffer fits - */ - - if (resume_hnd == 0 && buf_size <= q_u->buf_size) - { - /* this indicates, along with resume_hnd of 0, an end. */ - max_buf_size = 0; - } - - make_svc_r_enum_svcs_status(&r_u, svcs, max_buf_size, num_svcs, resume_hnd, dos_status); - - /* store the response in the SMB stream */ - svc_io_r_enum_svcs_status("", &r_u, rdata, 0); - - if (svcs != NULL) - { - free(svcs); - } - - DEBUG(5,("svc_enum_svcs_status: %d\n", __LINE__)); -} - -/******************************************************************* - api_svc_enum_svcs_status - ********************************************************************/ -static void api_svc_enum_svcs_status( rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata ) -{ - SVC_Q_ENUM_SVCS_STATUS q_u; - svc_io_q_enum_svcs_status("", &q_u, data, 0); - svc_reply_enum_svcs_status(&q_u, rdata); -} - -/******************************************************************* - svc_reply_query_disp_name - ********************************************************************/ -static void svc_reply_query_disp_name(SVC_Q_QUERY_DISP_NAME *q_u, - prs_struct *rdata) -{ - SVC_R_QUERY_DISP_NAME r_u; - fstring svc_name; - uint32 status = 0; - - DEBUG(5,("svc_query_disp_name: %d\n", __LINE__)); - - if (find_policy_by_hnd(&q_u->scman_pol) == -1) - { - status = 0xC000000 | NT_STATUS_INVALID_HANDLE; - } - - /* for now display name = service name */ - unistr2_to_ascii(svc_name, &q_u->uni_svc_name, sizeof(svc_name)-1); - make_svc_r_query_disp_name(&r_u, svc_name, status); - - /* store the response in the SMB stream */ - svc_io_r_query_disp_name("", &r_u, rdata, 0); - - DEBUG(5,("svc_query_disp_name: %d\n", __LINE__)); -} - -/******************************************************************* - api_svc_query_disp_name - ********************************************************************/ -static void api_svc_query_disp_name( rpcsrv_struct *p, prs_struct *data, - prs_struct *rdata ) -{ - SVC_Q_QUERY_DISP_NAME q_u; - svc_io_q_query_disp_name("", &q_u, data, 0); - svc_reply_query_disp_name(&q_u, rdata); -} - -/******************************************************************* - array of \PIPE\svcctl operations - ********************************************************************/ -static struct api_struct api_svc_cmds[] = -{ - { "SVC_CLOSE" , SVC_CLOSE , api_svc_close }, - { "SVC_OPEN_SC_MAN" , SVC_OPEN_SC_MAN , api_svc_open_sc_man }, - { "SVC_OPEN_SERVICE" , SVC_OPEN_SERVICE , api_svc_open_service }, - { "SVC_ENUM_SVCS_STATUS", SVC_ENUM_SVCS_STATUS, api_svc_enum_svcs_status }, - { "SVC_QUERY_DISP_NAME" , SVC_QUERY_DISP_NAME , api_svc_query_disp_name }, - { "SVC_START_SERVICE" , SVC_START_SERVICE , api_svc_start_service }, - { NULL , 0 , NULL } -}; - -/******************************************************************* - receives a svcctl pipe and responds. - ********************************************************************/ -BOOL api_svcctl_rpc(rpcsrv_struct *p, prs_struct *data) -{ - return api_rpcTNP(p, "api_svc_rpc", api_svc_cmds, data); -} - diff --git a/source3/rpcclient/cmd_atsvc.c b/source3/rpcclient/cmd_atsvc.c deleted file mode 100644 index 547ca96053..0000000000 --- a/source3/rpcclient/cmd_atsvc.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2.1. - MSRPC client: scheduler service - Copyright (C) Matthew Chapman 1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - Copyright (C) Andrew Tridgell 1994-1999 - - 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. -*/ - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" -#include "nterr.h" - -extern int DEBUGLEVEL; - -#define DEBUG_TESTING - -extern FILE* out_hnd; - - -/**************************************************************************** -checks for a /OPTION:param style option -****************************************************************************/ -static BOOL checkopt(char *input, char *optname, char **params) -{ - char *inend; - - if (*input++ != '/') - return False; - - for (inend = input; *inend != 0 && *inend != ':'; inend++); - - if (params != NULL) - { - *inend = 0; - *params = inend; - } - - while(input < inend) - { - if (toupper(*input++) != *optname++) - return False; - } - - return True; -} - -extern char *daynames_short[]; -extern char *daynames[]; - -/**************************************************************************** -parses a list of days of the week and month -****************************************************************************/ -static BOOL at_parse_days(char *str, uint32 *monthdays, uint8 *weekdays) -{ - char *tok; - char *nexttok = str; - int day; - - do { - tok = nexttok; - - if ((nexttok = strchr(tok, ',')) != NULL) - { - *nexttok++ = 0; - } - - if (isdigit((int)*tok)) - { - day = strtol(tok, NULL, 10); - if (day == 0 || day > 31) - { - printf("\tInvalid day of month.\n\n"); - return False; - } - - *monthdays |= (1 << (day-1)); - } - else - { - if (strlen(tok) < 3) - { - for (day = 0; day < 7; day++) - { - if (!strcasecmp(tok, daynames_short[day])) - break; - } - } - else - { - for (day = 0; day < 7; day++) - { - if (!strncasecmp(tok, daynames[day], 3)) - break; - } - } - - if (day < 7) - { - *weekdays |= (1 << day); - } - else - { - printf("\tInvalid day of week\n\n"); - return False; - } - } - - } while (nexttok != NULL); - - return True; -} - -#define SOON_OFFSET 2 /* seconds */ - -/**************************************************************************** -schedule the job 'soon' -****************************************************************************/ -static BOOL at_soon(char *dest_srv, uint32 *hours, uint32 *minutes, uint32 *seconds) -{ - TIME_OF_DAY_INFO tod; - BOOL res = True; - - /* enumerate files on server */ - res = res ? srv_net_remote_tod(dest_srv, &tod) : False; - - if (res) - { - *hours = (tod.hours - ((int)tod.zone/60)) % 24; - *minutes = tod.mins; - *seconds = (tod.secs + SOON_OFFSET) % 60; - return True; - } - - return False; -} - - -/**************************************************************************** -scheduler add job -****************************************************************************/ -void cmd_at(struct client_info *info, int argc, char *argv[]) -{ - fstring dest_wks; - BOOL add = False; - BOOL del = False; - char *p; - - uint32 jobid = -1; - unsigned int hours, minutes, seconds = 0; - uint32 monthdays = 0; - uint8 weekdays = 0; - uint8 flags = JOB_NONINTERACTIVE; - pstring command; - - safe_strcpy(dest_wks, "\\\\", sizeof(dest_wks)); - safe_strcat(dest_wks, info->dest_host, sizeof(dest_wks)); - strupper(dest_wks); - - while (argc > 1) - { - argc--; - argv++; - - if (checkopt(argv[0], "DELETE", NULL)) - { - del = True; - continue; - } - else if (checkopt(argv[0], "YES", NULL)) - { - /* Compatibility */ - continue; - } - - jobid = strtol(argv[0], &p, 10); - if (*p == 0) /* Entirely numeric field */ - continue; - - if (!strcasecmp(argv[0], "NOW")) - { - if (!at_soon(dest_wks, &hours, &minutes, &seconds)) - { - return; - } - } - else if (sscanf(argv[0], "%d:%d:%d", &hours, &minutes, &seconds) >= 2) - { - p = strchr(argv[0], 0); - - if (!strcasecmp(p-2, "AM")) - { - hours = (hours == 12) ? 0 : hours; - } - - if (!strcasecmp(p-2, "PM")) - { - hours = (hours == 12) ? 12 : hours + 12; - } - - if (hours > 23 || minutes > 59 || seconds > 59) - { - printf("\tInvalid time.\n\n"); - return; - } - } - else - { - printf("at { {time | NOW} [/INTERACTIVE] [{/EVERY|/NEXT}:5,Sun,...] command\n\t| [/DEL] [jobid] }\n\n"); - return; - } - - add = True; - command[0] = 0; - p = NULL; - - if (argc <= 1) break; - argc--; - argv++; - - if (checkopt(argv[0], "INTERACTIVE", NULL)) - { - flags &= ~JOB_NONINTERACTIVE; - - if (argc <= 1) break; - argc--; - argv++; - } - - if (checkopt(argv[0], "EVERY", &p)) - { - flags |= JOB_PERIODIC; - } - else - { - checkopt(argv[0], "NEXT", &p); - } - - if (p != NULL) - { - if (*p == ':') - { - if (!at_parse_days(p, &monthdays, &weekdays)) - return; - } - else - { - weekdays = 0x7F; - } - - if (argc <= 1) break; - argc--; - argv++; - } - - while (True) - { - safe_strcat(command, argv[0], sizeof(command)); - - if (argc <= 1) break; - argc--; - argv++; - - safe_strcat(command, " ", sizeof(command)); - } - - break; - } - - if (add && !command[0]) - { - printf("\tNo command specified.\n\n"); - return; - } - - if (add) /* add job */ - { - AT_JOB_INFO job; - - job.time = ((((hours * 60) + minutes) * 60) + seconds) * 1000; - job.monthdays = monthdays; - job.weekdays = weekdays; - job.flags = flags; - job.ptr_command = 1; - - display_at_job_info(out_hnd, ACTION_HEADER , &job, command); - display_at_job_info(out_hnd, ACTION_ENUMERATE, &job, command); - display_at_job_info(out_hnd, ACTION_FOOTER , &job, command); - - if (at_add_job(dest_wks, &job, command, &jobid)) - { - fprintf(out_hnd, "\tJob ID: %d\n\n", jobid); - } - } - else if (del) /* delete */ - { - if (jobid == -1) - { - fprintf(out_hnd, "\tDeleting all jobs.\n\n"); - at_del_job(dest_wks, 0, 0xffffffff); - } - else - { - fprintf(out_hnd, "\tDeleting job %d.\n\n", jobid); - at_del_job(dest_wks, jobid, jobid); - } - - } - else if (jobid == -1) /* enumerate */ - { - AT_ENUM_INFO jobs[AT_MAX_JOBS]; - char **commands; - uint32 num_jobs; - - if (at_enum_jobs(dest_wks, &num_jobs, jobs, &commands)) - { - display_at_enum_info(out_hnd, ACTION_HEADER , num_jobs, jobs, commands); - display_at_enum_info(out_hnd, ACTION_ENUMERATE, num_jobs, jobs, commands); - display_at_enum_info(out_hnd, ACTION_FOOTER , num_jobs, jobs, commands); - } - - free_char_array(num_jobs, commands); - } - else /* job info */ - { - AT_JOB_INFO job; - - if (at_query_job(dest_wks, jobid, &job, command)) - { - display_at_job_info(out_hnd, ACTION_HEADER , &job, command); - display_at_job_info(out_hnd, ACTION_ENUMERATE, &job, command); - display_at_job_info(out_hnd, ACTION_FOOTER , &job, command); - } - } -} diff --git a/source3/rpcclient/cmd_brs.c b/source3/rpcclient/cmd_brs.c deleted file mode 100644 index ca1dbe036c..0000000000 --- a/source3/rpcclient/cmd_brs.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - NT Domain Authentication SMB / MSRPC client - Copyright (C) Andrew Tridgell 1994-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" -#include "nterr.h" - -extern int DEBUGLEVEL; - -#define DEBUG_TESTING - -extern FILE* out_hnd; - - -/**************************************************************************** -Browser get info query -****************************************************************************/ -void cmd_brs_query_info(struct client_info *info, int argc, char *argv[]) -{ - fstring dest_brs; - BRS_INFO_100 ctr; - uint32 info_level = 100; - - BOOL res = True; - - bzero(&ctr, sizeof(ctr)); - - fstrcpy(dest_brs, "\\\\"); - fstrcat(dest_brs, info->dest_host); - strupper(dest_brs); - - if (argc > 1) - { - info_level = (uint32)strtol(argv[1], (char**)NULL, 10); - } - - DEBUG(4,("cmd_brs_query_info: server:%s info level: %d\n", - dest_brs, info_level)); - - /* send info level: receive requested info. hopefully. */ - res = res ? brs_query_info( dest_brs, info_level, &ctr) : False; - - if (res) - { - DEBUG(5,("cmd_brs_query_info: query succeeded\n")); - -#if 0 - display_brs_info_100(out_hnd, ACTION_HEADER , &ctr); - display_brs_info_100(out_hnd, ACTION_ENUMERATE, &ctr); - display_brs_info_100(out_hnd, ACTION_FOOTER , &ctr); -#endif - - } - else - { - DEBUG(5,("cmd_brs_query_info: query failed\n")); - } -} - diff --git a/source3/rpcclient/cmd_eventlog.c b/source3/rpcclient/cmd_eventlog.c deleted file mode 100644 index 3e86f5bb28..0000000000 --- a/source3/rpcclient/cmd_eventlog.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2.1. - Copyright (C) Luke Kenneth Casson Leighton 1996-1999, - Copyright (C) Andrew Tridgell 1994-1999, - Copyright (C) Jean Francois Micouleau 1998-1999. - - 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. -*/ - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" -#include "nterr.h" - -extern int DEBUGLEVEL; - -#define DEBUG_TESTING - -extern FILE* out_hnd; - - -/**************************************************************************** -****************************************************************************/ -void cmd_eventlog(struct client_info *info, int argc, char *argv[]) -{ - BOOL res1 = True; - BOOL res = True; - POLICY_HND hnd; - uint32 number = 0; - uint32 flags; - uint32 offset; - uint32 num_of_bytes; - EVENTLOGRECORD ev; - - char *journal = NULL; - - fstring srv_name; - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, info->dest_host); - strupper(srv_name); - - flags = EVENTLOG_READ_SEQUENTIAL|EVENTLOG_READ_BACKWARD; - - if (argc > 1) - { - journal = argv[1]; - } - - res = res ? event_open(srv_name, journal, &hnd) : False; - res1 = res ? event_numofeventlogrec(&hnd, &number) : False; - - fprintf(out_hnd, "Number of events: %d\n", number); - - display_eventlog_eventrecord(out_hnd, ACTION_HEADER, &ev); - - for (offset = 0; offset < number && res1; offset++) - { - num_of_bytes=0; - - /* try once with a empty buffer */ - res1 = res1 ? event_readeventlog(&hnd, number, - flags, offset, - &num_of_bytes, &ev) : False; - - /* and try again with the correct size */ - res1 = res1 ? event_readeventlog(&hnd, number, - flags, offset, - &num_of_bytes, &ev) : False; - - display_eventlog_eventrecord(out_hnd, ACTION_ENUMERATE, &ev); - } - - display_eventlog_eventrecord(out_hnd, ACTION_FOOTER, &ev); - - res = res ? event_close(&hnd): False; -} diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c deleted file mode 100644 index 43fa9900d4..0000000000 --- a/source3/rpcclient/cmd_spoolss.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - NT Domain Authentication SMB / MSRPC client - Copyright (C) Andrew Tridgell 1994-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996-1999 - - 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. -*/ - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" -#include "nterr.h" - -extern int DEBUGLEVEL; - -#define DEBUG_TESTING - -extern FILE* out_hnd; - -extern struct ntuser_creds *usr_creds; - -/**************************************************************************** -nt spoolss query -****************************************************************************/ -BOOL msrpc_spoolss_enum_printers( const char* srv_name, - uint32 level, - uint32 *num, - void ***ctr, - PRINT_INFO_FN(fn)) -{ - BOOL res = True; - - if (spoolss_enum_printers( 0x40, srv_name, level, num, ctr) && - fn != NULL) - { - fn(srv_name, level, *num, *ctr); - } - - return res; -} - -static void spool_print_info_ctr(const char* srv_name, uint32 level, - uint32 num, void *const *const ctr) -{ - display_printer_info_ctr(out_hnd, ACTION_HEADER , level, num, ctr); - display_printer_info_ctr(out_hnd, ACTION_ENUMERATE, level, num, ctr); - display_printer_info_ctr(out_hnd, ACTION_FOOTER , level, num, ctr); -} - -/**************************************************************************** -nt spoolss query -****************************************************************************/ -void cmd_spoolss_enum_printers(struct client_info *info, int argc, char *argv[]) -{ - void **ctr = NULL; - uint32 num = 0; - uint32 level = 1; - - fstring srv_name; - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, info->dest_host); - strupper(srv_name); - - if (msrpc_spoolss_enum_printers(srv_name, level, &num, &ctr, - spool_print_info_ctr)) - { - DEBUG(5,("cmd_spoolss_enum_printer: query succeeded\n")); - } - else - { - report(out_hnd, "FAILED\n"); - } - - free_void_array(num, ctr, free); -} - -/**************************************************************************** -nt spoolss query -****************************************************************************/ -void cmd_spoolss_open_printer_ex(struct client_info *info, int argc, char *argv[]) -{ - fstring srv_name; - fstring station; - char *printer_name; - POLICY_HND hnd; - - BOOL res = True; - - if (argc < 2) - { - report(out_hnd, "spoolopen <printer name>\n"); - return; - } - - printer_name = argv[1]; - - fstrcpy(station, "\\\\"); - fstrcat(station, info->myhostname); - strupper(station); - - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, info->dest_host); - strupper(srv_name); - - if (!strnequal("\\\\", printer_name, 2)) - { - fstrcat(srv_name, "\\"); - fstrcat(srv_name, printer_name); - printer_name = srv_name; - } - - DEBUG(4,("spoolopen - printer: %s server: %s user: %s\n", - printer_name, station, usr_creds->user_name)); - - res = res ? spoolss_open_printer_ex( printer_name, - 0, 0, 0, - station, usr_creds->user_name, - &hnd) : False; - - res = res ? spoolss_closeprinter(&hnd) : False; - - if (res) - { - DEBUG(5,("cmd_spoolss_open_printer_ex: query succeeded\n")); - report(out_hnd, "OK\n"); - } - else - { - DEBUG(5,("cmd_spoolss_open_printer_ex: query failed\n")); - } -} - -/**************************************************************************** -nt spoolss query -****************************************************************************/ -BOOL msrpc_spoolss_enum_jobs( const char* printer_name, - const char* station, const char* user_name, - uint32 level, - uint32 *num, - void ***ctr, - JOB_INFO_FN(fn)) -{ - POLICY_HND hnd; - uint32 buf_size = 0x0; - uint32 status = 0x0; - - BOOL res = True; - BOOL res1 = True; - - DEBUG(4,("spoolopen - printer: %s server: %s user: %s\n", - printer_name, station, user_name)); - - res = res ? spoolss_open_printer_ex( printer_name, - 0, 0, 0, - station, user_name, - &hnd) : False; - - if (status == 0x0) - { - status = spoolss_enum_jobs( &hnd, - 0, 1000, level, &buf_size, - num, ctr); - } - - if (status == ERROR_INSUFFICIENT_BUFFER) - { - status = spoolss_enum_jobs( &hnd, - 0, 1000, level, &buf_size, - num, ctr); - } - - res1 = (status == 0x0); - - res = res ? spoolss_closeprinter(&hnd) : False; - - if (res1 && fn != NULL) - { - fn(printer_name, station, level, *num, *ctr); - } - - return res1; -} - -static void spool_job_info_ctr( const char* printer_name, - const char* station, - uint32 level, - uint32 num, void *const *const ctr) -{ - display_job_info_ctr(out_hnd, ACTION_HEADER , level, num, ctr); - display_job_info_ctr(out_hnd, ACTION_ENUMERATE, level, num, ctr); - display_job_info_ctr(out_hnd, ACTION_FOOTER , level, num, ctr); -} - -/**************************************************************************** -nt spoolss query -****************************************************************************/ -void cmd_spoolss_enum_jobs(struct client_info *info, int argc, char *argv[]) -{ - fstring srv_name; - fstring station; - char *printer_name; - - void **ctr = NULL; - uint32 num = 0; - uint32 level = 1; - - if (argc < 2) - { - report(out_hnd, "spoolenum <printer name>\n"); - return; - } - - printer_name = argv[1]; - - fstrcpy(station, "\\\\"); - fstrcat(station, info->myhostname); - strupper(station); - - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, info->dest_host); - strupper(srv_name); - - if (!strnequal("\\\\", printer_name, 2)) - { - fstrcat(srv_name, "\\"); - fstrcat(srv_name, printer_name); - printer_name = srv_name; - } - - DEBUG(4,("spoolopen - printer: %s station: %s user: %s\n", - printer_name, station, usr_creds->user_name)); - - if (msrpc_spoolss_enum_jobs( printer_name, station, - usr_creds->user_name, - level, &num, &ctr, - spool_job_info_ctr)) - { - DEBUG(5,("cmd_spoolss_enum_jobs: query succeeded\n")); - } - else - { - report(out_hnd, "FAILED\n"); - } - - free_void_array(num, ctr, free); -} - diff --git a/source3/rpcclient/cmd_svcctl.c b/source3/rpcclient/cmd_svcctl.c deleted file mode 100644 index d118a7d15d..0000000000 --- a/source3/rpcclient/cmd_svcctl.c +++ /dev/null @@ -1,407 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - NT Domain Authentication SMB / MSRPC client - Copyright (C) Andrew Tridgell 1994-1997 - Copyright (C) Luke Kenneth Casson Leighton 1996-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. -*/ - - - -#ifdef SYSLOG -#undef SYSLOG -#endif - -#include "includes.h" -#include "nterr.h" - -extern int DEBUGLEVEL; - -extern FILE* out_hnd; - -void svc_display_query_svc_cfg(const QUERY_SERVICE_CONFIG *cfg) -{ - display_query_svc_cfg(out_hnd, ACTION_HEADER , cfg); - display_query_svc_cfg(out_hnd, ACTION_ENUMERATE, cfg); - display_query_svc_cfg(out_hnd, ACTION_FOOTER , cfg); -} - -BOOL svc_query_service( POLICY_HND *pol_scm, - const char *svc_name, - SVC_QUERY_FN(svc_query_fn)) -{ - BOOL res2 = True; - BOOL res3; - POLICY_HND pol_svc; - QUERY_SERVICE_CONFIG cfg; - uint32 svc_buf_size = 0x8000; - - res2 = res2 ? svc_open_service( pol_scm, - svc_name, 0x80000001, - &pol_svc) : False; - res3 = res2 ? svc_query_svc_cfg( &pol_svc, &cfg, - &svc_buf_size) : False; - - if (res3 && svc_query_fn != NULL) - { - svc_query_fn(&cfg); - } - - res2 = res2 ? svc_close(&pol_svc) : False; - - return res3; -} - -/**************************************************************************** -nt service info -****************************************************************************/ -void cmd_svc_info(struct client_info *info, int argc, char *argv[]) -{ - BOOL res = True; - BOOL res1 = True; - char *svc_name; - - POLICY_HND pol_scm; - - fstring srv_name; - - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, info->dest_host); - strupper(srv_name); - - DEBUG(4,("cmd_svc_info: server:%s\n", srv_name)); - - if (argc < 2) - { - report(out_hnd,"svcinfo <service name>\n"); - return; - } - - svc_name = argv[1]; - - /* open service control manager receive a policy handle */ - res = res ? svc_open_sc_man( srv_name, NULL, 0x80000004, - &pol_scm) : False; - - res1 = svc_query_service(&pol_scm, svc_name, - svc_display_query_svc_cfg); - - res = res ? svc_close(&pol_scm) : False; - - if (res && res1) - { - DEBUG(5,("cmd_svc_info: query succeeded\n")); - } - else - { - DEBUG(5,("cmd_svc_info: query failed\n")); - } -} - -static void svc_display_svc_info(const ENUM_SRVC_STATUS *svc) -{ - display_svc_info(out_hnd, ACTION_HEADER , svc); - display_svc_info(out_hnd, ACTION_ENUMERATE, svc); - display_svc_info(out_hnd, ACTION_FOOTER , svc); -} - -/**************************************************************************** -nt service enum -****************************************************************************/ -BOOL msrpc_svc_enum(const char* srv_name, - ENUM_SRVC_STATUS **svcs, - uint32 *num_svcs, - SVC_INFO_FN(info_fn), - SVC_QUERY_FN(query_fn)) -{ - BOOL res = True; - BOOL res1 = False; - int i; - uint32 resume_hnd = 0; - uint32 buf_size = 0; - uint32 dos_error = 0; - - POLICY_HND pol_scm; - - (*svcs) = NULL; - (*num_svcs) = 0; - - /* open service control manager receive a policy handle */ - res = res ? svc_open_sc_man( srv_name, NULL, 0x80000004, - &pol_scm) : False; - - do - { - if ((*svcs) != NULL) - { - free(*svcs); - (*svcs) = NULL; - (*num_svcs) = 0; - } - - buf_size += 0x800; - - /* enumerate services */ - res1 = res ? svc_enum_svcs( &pol_scm, - 0x00000030, 0x00000003, - &buf_size, &resume_hnd, &dos_error, - svcs, num_svcs) : False; - - } while (res1 && dos_error == ERRmoredata); - - for (i = 0; i < (*num_svcs) && (*svcs) != NULL && res1; i++) - { - fstring svc_name; - - unistr_to_ascii(svc_name, (*svcs)[i].uni_srvc_name.buffer, - sizeof(svc_name)-1); - - if (query_fn != NULL) - { - res1 = svc_query_service(&pol_scm, - svc_name, query_fn); - } - else if (info_fn != NULL) - { - info_fn(&(*svcs)[i]); - } - } - - res = res ? svc_close(&pol_scm) : False; - - return res1; -} - -/**************************************************************************** -nt service enum -****************************************************************************/ -void cmd_svc_enum(struct client_info *info, int argc, char *argv[]) -{ - ENUM_SRVC_STATUS *svcs = NULL; - uint32 num_svcs = 0; - BOOL request_info = False; - int opt; - fstring srv_name; - - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, info->dest_host); - strupper(srv_name); - - while ((opt = getopt(argc, argv,"i")) != EOF) - { - switch (opt) - { - case 'i': - { - request_info = True; - break; - } - } - } - - report(out_hnd,"Services\n"); - report(out_hnd,"--------\n"); - - msrpc_svc_enum(srv_name, &svcs, &num_svcs, - request_info ? NULL : svc_display_svc_info, - request_info ? svc_display_query_svc_cfg : NULL); - - if (svcs != NULL) - { - free(svcs); - } -} - -/**************************************************************************** -nt stop service -****************************************************************************/ -void cmd_svc_stop(struct client_info *info, int argc, char *argv[]) -{ - BOOL res = True; - BOOL res1 = True; - char *svc_name; - BOOL res2 = True; - POLICY_HND pol_svc; - POLICY_HND pol_scm; - - fstring srv_name; - - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, info->dest_host); - strupper(srv_name); - - DEBUG(4,("cmd_svc_stop: server:%s\n", srv_name)); - - if (argc < 2) - { - report(out_hnd,"svcstop <service name>\n"); - return; - } - - svc_name = argv[1]; - - /* open service control manager receive a policy handle */ - res = res ? svc_open_sc_man( srv_name, NULL, 0x80000000, - &pol_scm) : False; - - res1 = res ? svc_open_service( &pol_scm, - svc_name, 0x00000020, - &pol_svc) : False; - res2 = res1 ? svc_stop_service(&pol_svc, 0x1) : False; - - res1 = res1 ? svc_close(&pol_svc) : False; - res = res ? svc_close(&pol_scm) : False; - - if (res2) - { - report(out_hnd,"Stopped Service %s\n", svc_name); - DEBUG(5,("cmd_svc_stop: succeeded\n")); - } - else - report(out_hnd,"Failed Service Stopped (%s)\n", svc_name); - { - DEBUG(5,("cmd_svc_stop: failed\n")); - } -} - -/**************************************************************************** -nt start service -****************************************************************************/ -void cmd_svc_start(struct client_info *info, int argc, char *argv[]) -{ - BOOL res = True; - BOOL res1 = True; - char *svc_name; - BOOL res2 = True; - POLICY_HND pol_svc; - POLICY_HND pol_scm; - - fstring srv_name; - - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, info->dest_host); - strupper(srv_name); - - DEBUG(4,("cmd_svc_start: server:%s\n", srv_name)); - - if (argc < 2) - { - report(out_hnd,"svcstart <service name> [arg 0] [arg 1]...]\n"); - return; - } - - argv++; - argc--; - - svc_name = argv[0]; - - argv++; - argc--; - - /* open service control manager receive a policy handle */ - res = res ? svc_open_sc_man( srv_name, NULL, 0x80000000, - &pol_scm) : False; - - res1 = res ? svc_open_service( &pol_scm, - svc_name, 0x80000010, - &pol_svc) : False; - res2 = res1 ? svc_start_service( &pol_svc, argc, argv) : False; - - res1 = res1 ? svc_close(&pol_svc) : False; - res = res ? svc_close(&pol_scm) : False; - - if (res2) - { - report(out_hnd,"Started Service %s\n", svc_name); - DEBUG(5,("cmd_svc_start: succeeded\n")); - } - else - report(out_hnd,"Failed Service Startup (%s)\n", svc_name); - { - DEBUG(5,("cmd_svc_start: failed\n")); - } -} - -/**************************************************************************** -nt service set -****************************************************************************/ -void cmd_svc_set(struct client_info *info, int argc, char *argv[]) -{ - BOOL res = True; - BOOL res2 = True; - BOOL res3; - POLICY_HND pol_svc; - QUERY_SERVICE_CONFIG cfg; - uint32 svc_buf_size = 0x8000; - - char *svc_name; - - POLICY_HND pol_scm; - - fstring srv_name; - - fstrcpy(srv_name, "\\\\"); - fstrcat(srv_name, info->dest_host); - strupper(srv_name); - - DEBUG(4,("cmd_svc_set: server:%s\n", srv_name)); - - if (argc < 2) - { - report(out_hnd,"svcset <service name>\n"); - return; - } - - svc_name = argv[1]; - - /* open service control manager receive a policy handle */ - res = res ? svc_open_sc_man( srv_name, NULL, 0x80000004, - &pol_scm) : False; - - res2 = res ? svc_open_service( &pol_scm, - svc_name, 0x80000001, - &pol_svc) : False; - res3 = res2 ? svc_query_svc_cfg( &pol_svc, &cfg, - &svc_buf_size) : False; - - if (res3) - { - res3 = svc_change_svc_cfg(&pol_svc, - cfg.service_type, - cfg.start_type, - 0xffffffff, - 0, - NULL, NULL, - cfg.tag_id, - NULL, "administrator", NULL, NULL); - - } - - res2 = res2 ? svc_close(&pol_svc) : False; - - res = res ? svc_close(&pol_scm) : False; - - if (res3) - { - DEBUG(5,("cmd_svc_set: change succeeded\n")); - } - else - { - DEBUG(5,("cmd_svc_set: change failed\n")); - } -} - diff --git a/source3/rpcclient/display_at.c b/source3/rpcclient/display_at.c deleted file mode 100644 index 29daf9f333..0000000000 --- a/source3/rpcclient/display_at.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1999 - - 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" - -static char *get_at_time_str(uint32 t) -{ - static fstring timestr; - unsigned int hours, minutes, seconds; - - hours = t / 1000; - seconds = hours % 60; - hours /= 60; - minutes = hours % 60; - hours /= 60; - - slprintf(timestr, sizeof(timestr)-1, "%2d:%02d:%02d", - hours, minutes, seconds); - - return timestr; -} - -extern char *daynames_short[]; - -static char *get_at_days_str(uint32 monthdays, uint8 weekdays, uint8 flags) -{ - static fstring days; - fstring numstr; - int day, bit; - BOOL first = True; - - if (monthdays == 0 && weekdays == 0) - return "Once"; - - if (flags & JOB_PERIODIC) - { - if (IS_BITS_SET_ALL(weekdays, 0x7F)) - return "Every Day"; - - fstrcpy(days, "Every "); - } - else - { - fstrcpy(days, "Next "); - } - - for (day = 1, bit = 1; day < 32; day++, bit <<= 1) - { - if (monthdays & bit) - { - if (first) - first = False; - else - fstrcat(days, ", "); - - slprintf(numstr, sizeof(numstr)-1, "%d", day); - fstrcat(days, numstr); - } - } - - for (day = 0, bit = 1; day < 7; day++, bit <<= 1) - { - if (weekdays & bit) - { - if (first) - first = False; - else - fstrcat(days, ", "); - - fstrcat(days, daynames_short[day]); - } - } - - return days; -} - -/**************************************************************************** - display scheduled jobs - ****************************************************************************/ -void display_at_enum_info(FILE *out_hnd, enum action_type action, - uint32 num_jobs, const AT_ENUM_INFO *const jobs, - char *const *const commands) -{ - switch (action) - { - case ACTION_HEADER: - { - if (num_jobs == 0) - { - report(out_hnd, "\tNo Jobs.\n"); - } - else - { - report(out_hnd, "\tJobs:\n"); - report(out_hnd, "\t-----\n"); - } - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < num_jobs; i++) - { - const AT_JOB_INFO *const job = &jobs[i].info; - - report(out_hnd, "\t%d\t%s\t%s\t%s\n", - jobs[i].jobid, - get_at_time_str(job->time), - get_at_days_str(job->monthdays, - job->weekdays, - job->flags), - commands[i]); - } - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - -/**************************************************************************** - display information about a scheduled job - ****************************************************************************/ -void display_at_job_info(FILE *out_hnd, enum action_type action, - AT_JOB_INFO *const job, fstring command) -{ - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "\tJob Information:\n"); - report(out_hnd, "\t----------------\n"); - break; - } - case ACTION_ENUMERATE: - { - report(out_hnd, "\tTime: %s\n", - get_at_time_str(job->time)); - - report(out_hnd, "\tSchedule: %s\n", - get_at_days_str(job->monthdays, job->weekdays, - job->flags)); - - report(out_hnd, "\tStatus: %s", - (job->flags & JOB_EXEC_ERR) ? "Failed" : "OK"); - - if (job->flags & JOB_RUNS_TODAY) - { - report(out_hnd, ", Runs Today"); - } - - report(out_hnd, "\n\tInteractive: %s\n", - (job->flags & JOB_NONINTERACTIVE) ? "No" - : "Yes"); - - report(out_hnd, "\tCommand: %s\n", command); - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - diff --git a/source3/rpcclient/display_event.c b/source3/rpcclient/display_event.c deleted file mode 100644 index cd941851ac..0000000000 --- a/source3/rpcclient/display_event.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1999 - - 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" - - -/**************************************************************************** - display structure - ****************************************************************************/ -void display_eventlog_eventrecord(FILE *out_hnd, enum action_type action, EVENTLOGRECORD *const ev) -{ - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "\tevent log records\n"); - report(out_hnd, "\t-----------------\n"); - break; - } - case ACTION_ENUMERATE: - { - fstring temp; - report(out_hnd, "\t\trecord n.:\t%d\n", ev->recordnumber); - - report(out_hnd, "\t\tsource\teventnumber\teventtype\tcategory\n"); - unistr_to_ascii(temp, ev->sourcename.buffer, sizeof(temp)-1); - - report(out_hnd, "\t\t%s", temp); - - report(out_hnd, "\t%d\t\t", ev->eventnumber&0x0000FFFF); - - switch (ev->eventtype) - { - case EVENTLOG_OK: - report(out_hnd, "Normal"); - break; - - case EVENTLOG_ERROR: - report(out_hnd, "Error"); - break; - - case EVENTLOG_WARNING: - report(out_hnd, "Warning"); - break; - - case EVENTLOG_INFORMATION: - report(out_hnd, "Information"); - break; - - case EVENTLOG_AUDIT_OK: - report(out_hnd, "Audit Normal"); - break; - - case EVENTLOG_AUDIT_ERROR: - report(out_hnd, "Audit Error\n"); - break; - } - - report(out_hnd, "\t%d\n", ev->category); - report(out_hnd, "\t\tcreationtime:\t%s\n", http_timestring(ev->creationtime)); - report(out_hnd, "\t\twritetime:\t%s\n", http_timestring(ev->writetime)); - - unistr_to_ascii(temp, ev->computername.buffer, sizeof(temp)-1); - report(out_hnd, "\t\tcomputer:\t%s\n", temp); - - if (ev->num_of_strings!=0) - { - unistr_to_ascii(temp, ev->strings.buffer, sizeof(temp)-1); - report(out_hnd, "\t\tdescription:\t%s\n", temp); - } - - report(out_hnd, "\n"); - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - diff --git a/source3/rpcclient/display_reg.c b/source3/rpcclient/display_reg.c deleted file mode 100644 index d832d1bffb..0000000000 --- a/source3/rpcclient/display_reg.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1999 - - 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" - - -/**************************************************************************** -convert a security permissions into a string -****************************************************************************/ -char *get_reg_val_type_str(uint32 type) -{ - static fstring typestr; - - switch (type) - { - case 0x01: - { - fstrcpy(typestr, "string"); - return typestr; - } - - case 0x03: - { - fstrcpy(typestr, "bytes"); - return typestr; - } - - case 0x04: - { - fstrcpy(typestr, "uint32"); - return typestr; - } - - case 0x07: - { - fstrcpy(typestr, "multi"); - return typestr; - } - default: - { - break; - } - } - slprintf(typestr, sizeof(typestr)-1, "[%d]", type); - return typestr; -} - - -static void print_reg_value(FILE *out_hnd, const char *val_name, - uint32 val_type, const BUFFER2 *value) -{ - fstring type; - fstring valstr; - - fstrcpy(type, get_reg_val_type_str(val_type)); - - switch (val_type) - { - case 0x01: /* unistr */ - { - unibuf_to_ascii(valstr, value->buffer, - MIN(value->buf_len, sizeof(valstr)-1)); - report(out_hnd, "\t%s:\t%s:\t%s\n", val_name, type, valstr); - break; - } - - default: /* unknown */ - case 0x03: /* bytes */ - { - if (value->buf_len <= 8) - { - report(out_hnd, "\t%s:\t%s:\t", val_name, type); - out_data(out_hnd, (const char*)value->buffer, - value->buf_len, 8); - } - else - { - report(out_hnd, "\t%s:\t%s:\n", val_name, type); - out_data(out_hnd, (const char*)value->buffer, - value->buf_len, 16); - } - break; - } - - case 0x04: /* uint32 */ - { - report(out_hnd, "\t%s:\t%s:\t0x%08x\n", val_name, type, buffer2_to_uint32(value)); - break; - } - - case 0x07: /* multiunistr */ - { - buffer2_to_multistr(valstr, value, sizeof(valstr)-1); - report(out_hnd, "\t%s:\t%s:\t%s\n", val_name, type, valstr); - break; - } - } -} - -/**************************************************************************** - display structure - ****************************************************************************/ -void display_reg_value_info(FILE *out_hnd, enum action_type action, - const char *val_name, - uint32 val_type, const BUFFER2 *value) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - print_reg_value(out_hnd, val_name, val_type, value); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** - display structure - ****************************************************************************/ -void display_reg_key_info(FILE *out_hnd, enum action_type action, - const char *key_name, time_t key_mod_time) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - report(out_hnd, "\t%s\t(%s)\n", - key_name, http_timestring(key_mod_time)); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - diff --git a/source3/rpcclient/display_sam.c b/source3/rpcclient/display_sam.c deleted file mode 100644 index 59bb2bfa54..0000000000 --- a/source3/rpcclient/display_sam.c +++ /dev/null @@ -1,685 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1999 - - 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" - -/**************************************************************************** - display alias members - ****************************************************************************/ -void display_alias_members(FILE *out_hnd, enum action_type action, - uint32 num_mem, char *const *const sid_mem, - uint8 *const type) -{ - switch (action) - { - case ACTION_HEADER: - { - if (num_mem == 0) - { - report(out_hnd, "\tNo Alias Members\n"); - } - else - { - report(out_hnd, "\tAlias Members:\n"); - report(out_hnd, "\t-------------\n"); - } - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < num_mem; i++) - { - if (sid_mem[i] != NULL) - { - report(out_hnd, "\tMember Name:\t%s\tType:\t%s\n", - sid_mem[i], - get_sid_name_use_str(type[i])); - } - } - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - - -/**************************************************************************** - display alias rid info - ****************************************************************************/ -void display_alias_rid_info(FILE *out_hnd, enum action_type action, - DOM_SID *const sid, - uint32 num_rids, uint32 *const rid) -{ - switch (action) - { - case ACTION_HEADER: - { - fstring sid_str; - sid_to_string(sid_str, sid); - if (num_rids == 0) - { - report(out_hnd, "\tNo Aliases:\tSid %s\n", sid_str); - } - else - { - report(out_hnd, "\tAlias Info:\tSid %s\n", sid_str); - report(out_hnd, "\t----------\n"); - } - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < num_rids; i++) - { - report(out_hnd, "\tAlias RID:\t%8x\n", rid[i]); - } - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - -/**************************************************************************** - display group members - ****************************************************************************/ -void display_group_members(FILE *out_hnd, enum action_type action, - uint32 num_mem, char *const *const name, uint32 *const type) -{ - switch (action) - { - case ACTION_HEADER: - { - if (num_mem == 0) - { - report(out_hnd, "\tNo Members\n"); - } - else - { - report(out_hnd, "\tMembers:\n"); - report(out_hnd, "\t-------\n"); - } - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < num_mem; i++) - { - report(out_hnd, "\tMember Name:\t%s\tType:\t%s\n", - name[i], get_sid_name_use_str(type[i])); - } - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - - -/**************************************************************************** - display group info - ****************************************************************************/ -void display_group_info1(FILE *out_hnd, enum action_type action, GROUP_INFO1 *const info1) - -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fstring temp; - - unistr2_to_ascii(temp, &info1->uni_acct_name, sizeof(temp)-1); - report(out_hnd, "\tGroup Name:\t%s\n", temp); - unistr2_to_ascii(temp, &info1->uni_acct_desc, sizeof(temp)-1); - report(out_hnd, "\tDescription:\t%s\n", temp); - report(out_hnd, "\tunk1:%d\n", info1->unknown_1); - report(out_hnd, "\tNum Members:%d\n", info1->num_members); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** - display group info - ****************************************************************************/ -void display_group_info4(FILE *out_hnd, enum action_type action, GROUP_INFO4 *const info4) - -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fstring desc; - - unistr2_to_ascii(desc, &info4->uni_acct_desc, sizeof(desc)-1); - report(out_hnd, "\tGroup Description:%s\n", - desc); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** - display sam sync structure - ****************************************************************************/ -void display_group_info_ctr(FILE *out_hnd, enum action_type action, - GROUP_INFO_CTR *const ctr) -{ - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "\tSAM Group Info\n"); - report(out_hnd, "\t--------------\n"); - - break; - } - case ACTION_ENUMERATE: - { - switch (ctr->switch_value1) - { - case 1: - { - display_group_info1(out_hnd, ACTION_HEADER , &ctr->group.info1); - display_group_info1(out_hnd, ACTION_ENUMERATE, &ctr->group.info1); - display_group_info1(out_hnd, ACTION_FOOTER , &ctr->group.info1); - break; - } - case 4: - { - display_group_info4(out_hnd, ACTION_HEADER , &ctr->group.info4); - display_group_info4(out_hnd, ACTION_ENUMERATE, &ctr->group.info4); - display_group_info4(out_hnd, ACTION_FOOTER , &ctr->group.info4); - break; - } - } - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - -/**************************************************************************** - display group rid info - ****************************************************************************/ -void display_group_rid_info(FILE *out_hnd, enum action_type action, - uint32 num_gids, DOM_GID *const gid) -{ - switch (action) - { - case ACTION_HEADER: - { - if (num_gids == 0) - { - report(out_hnd, "\tNo Groups\n"); - } - else - { - report(out_hnd, "\tGroup Info\n"); - report(out_hnd, "\t----------\n"); - } - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < num_gids; i++) - { - report(out_hnd, "\tGroup RID:\t%8x attr:\t%x\n", - gid[i].g_rid, gid[i].attr); - } - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - - -/**************************************************************************** - display alias name info - ****************************************************************************/ -void display_alias_name_info(FILE *out_hnd, enum action_type action, - uint32 num_aliases, fstring *const alias_name, const uint32 *const num_als_usrs) -{ - switch (action) - { - case ACTION_HEADER: - { - if (num_aliases == 0) - { - report(out_hnd, "\tNo Aliases\n"); - } - else - { - report(out_hnd, "\tAlias Names\n"); - report(out_hnd, "\t----------- \n"); - } - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < num_aliases; i++) - { - report(out_hnd, "\tAlias Name:\t%s Attributes:\t%3d\n", - alias_name[i], num_als_usrs[i]); - } - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - -/**************************************************************************** - display alias info - ****************************************************************************/ -void display_alias_info3(FILE *out_hnd, enum action_type action, ALIAS_INFO3 *const info3) - -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fstring temp; - - unistr2_to_ascii(temp, &info3->uni_acct_desc, sizeof(temp)-1); - report(out_hnd, "\tDescription:\t%s\n", temp); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** - display sam sync structure - ****************************************************************************/ -void display_alias_info_ctr(FILE *out_hnd, enum action_type action, - ALIAS_INFO_CTR *const ctr) -{ - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "\tSAM Group Info\n"); - report(out_hnd, "\t--------------\n"); - - break; - } - case ACTION_ENUMERATE: - { - switch (ctr->switch_value1) - { - case 3: - { - display_alias_info3(out_hnd, ACTION_HEADER , &ctr->alias.info3); - display_alias_info3(out_hnd, ACTION_ENUMERATE, &ctr->alias.info3); - display_alias_info3(out_hnd, ACTION_FOOTER , &ctr->alias.info3); - break; - } - } - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - - -/**************************************************************************** - display sam_user_info_21 structure - ****************************************************************************/ -void display_sam_user_info_21(FILE *out_hnd, enum action_type action, SAM_USER_INFO_21 *const usr) -{ - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "\tUser Info, Level 0x15\n"); - report(out_hnd, "\t---------------------\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring temp; - - unistr2_to_ascii(temp, &usr->uni_user_name, sizeof(temp)-1); - report(out_hnd, "\t\tUser Name :\t%s\n", temp); - - unistr2_to_ascii(temp, &usr->uni_full_name, sizeof(temp)-1); - report(out_hnd, "\t\tFull Name :\t%s\n", temp); - - unistr2_to_ascii(temp, &usr->uni_home_dir, sizeof(temp)-1); - report(out_hnd, "\t\tHome Drive :\t%s\n", temp); - - unistr2_to_ascii(temp, &usr->uni_dir_drive, sizeof(temp)-1); - report(out_hnd, "\t\tDir Drive :\t%s\n", temp); - - unistr2_to_ascii(temp, &usr->uni_profile_path, sizeof(temp)-1); - report(out_hnd, "\t\tProfile Path:\t%s\n", temp); - - unistr2_to_ascii(temp, &usr->uni_logon_script, sizeof(temp)-1); - report(out_hnd, "\t\tLogon Script:\t%s\n", temp); - - unistr2_to_ascii(temp, &usr->uni_acct_desc, sizeof(temp)-1); - report(out_hnd, "\t\tDescription :\t%s\n", temp); - - unistr2_to_ascii(temp, &usr->uni_workstations, sizeof(temp)-1); - report(out_hnd, "\t\tWorkstations:\t%s\n", temp); - - unistr2_to_ascii(temp, &usr->uni_unknown_str, sizeof(temp)-1); - report(out_hnd, "\t\tUnknown Str :\t%s\n", temp); - - unistr2_to_ascii(temp, &usr->uni_munged_dial, sizeof(temp)-1); - report(out_hnd, "\t\tRemote Dial :\t%s\n", temp); - - report(out_hnd, "\t\tLogon Time :\t%s\n", http_timestring(nt_time_to_unix(&(usr->logon_time )))); - report(out_hnd, "\t\tLogoff Time :\t%s\n", http_timestring(nt_time_to_unix(&(usr->logoff_time )))); - report(out_hnd, "\t\tKickoff Time :\t%s\n", http_timestring(nt_time_to_unix(&(usr->kickoff_time )))); - report(out_hnd, "\t\tPassword last set Time :\t%s\n", http_timestring(nt_time_to_unix(&(usr->pass_last_set_time )))); - report(out_hnd, "\t\tPassword can change Time :\t%s\n", http_timestring(nt_time_to_unix(&(usr->pass_can_change_time )))); - report(out_hnd, "\t\tPassword must change Time:\t%s\n", http_timestring(nt_time_to_unix(&(usr->pass_must_change_time)))); - - report(out_hnd, "\t\tunknown_2[0..31]...\n"); /* user passwords? */ - - report(out_hnd, "\t\tuser_rid :\t%x\n" , usr->user_rid ); /* User ID */ - report(out_hnd, "\t\tgroup_rid:\t%x\n" , usr->group_rid); /* Group ID */ - report(out_hnd, "\t\tacb_info :\t%04x\n", usr->acb_info ); /* Account Control Info */ - - report(out_hnd, "\t\tunknown_3:\t%08x\n", usr->unknown_3); /* 0x00ff ffff */ - report(out_hnd, "\t\tlogon_divs:\t%d\n", usr->logon_divs); /* 0x0000 00a8 which is 168 which is num hrs in a week */ - report(out_hnd, "\t\tunknown_5:\t%08x\n", usr->unknown_5); /* 0x0002 0000 */ - - report(out_hnd, "\t\tpadding1[0..7]...\n"); - - if (usr->ptr_logon_hrs) - { - report(out_hnd, "\t\tlogon_hrs[0..%d]...\n", usr->logon_hrs.len); - } - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - - -/**************************************************************************** - display sam sync structure - ****************************************************************************/ -void display_sam_unk_info_2(FILE *out_hnd, enum action_type action, - SAM_UNK_INFO_2 *const info2) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fstring name; - unistr2_to_ascii(name, &(info2->uni_domain), sizeof(name)-1); - report(out_hnd, "Domain:\t%s\n", name); - - unistr2_to_ascii(name, &(info2->uni_server), sizeof(name)-1); - report(out_hnd, "Server:\t%s\n", name); - - report(out_hnd, "Total Users:\t%d\n", info2->num_domain_usrs); - report(out_hnd, "Total Groups:\t%d\n", info2->num_domain_grps); - report(out_hnd, "Total Aliases:\t%d\n", info2->num_local_grps); - - report(out_hnd, "Sequence No:\t%d\n", info2->seq_num); - - report(out_hnd, "Unknown 0:\t0x%x\n", info2->unknown_0); - report(out_hnd, "Unknown 1:\t0x%x\n", info2->unknown_1); - report(out_hnd, "Unknown 2:\t0x%x\n", info2->unknown_2); - report(out_hnd, "Unknown 3:\t0x%x\n", info2->unknown_3); - report(out_hnd, "Unknown 4:\t0x%x\n", info2->unknown_4); - report(out_hnd, "Unknown 5:\t0x%x\n", info2->unknown_5); - report(out_hnd, "Unknown 6:\t0x%x\n", info2->unknown_6); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - -/**************************************************************************** - display sam sync structure - ****************************************************************************/ -void display_sam_unk_ctr(FILE *out_hnd, enum action_type action, - uint32 switch_value, SAM_UNK_CTR *const ctr) -{ - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "\tSAM Domain Info\n"); - report(out_hnd, "\t---------------\n"); - - break; - } - case ACTION_ENUMERATE: - { - switch (switch_value) - { - case 2: - { - display_sam_unk_info_2(out_hnd, ACTION_HEADER , &ctr->info.inf2); - display_sam_unk_info_2(out_hnd, ACTION_ENUMERATE, &ctr->info.inf2); - display_sam_unk_info_2(out_hnd, ACTION_FOOTER , &ctr->info.inf2); - break; - } - } - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - -/**************************************************************************** -sam info level 1 display function -****************************************************************************/ -void display_sam_info_1(FILE *out_hnd, enum action_type action, - SAM_ENTRY1 *const e1, SAM_STR1 *const s1) -{ - if (e1 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Sam Level 1:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring tmp; - - report(out_hnd, "\tIndex:\t%d\n", e1->user_idx); - report(out_hnd, "\tRID:\t0x%x\n", e1->rid_user); - report(out_hnd, "\tACB:\t%s\n", - pwdb_encode_acct_ctrl(e1->acb_info, - NEW_PW_FORMAT_SPACE_PADDED_LEN)); - - unistr_to_ascii(tmp, s1->uni_acct_name.buffer, sizeof(tmp)-1); - report(out_hnd, "\tAccount Name:\t%s\n", tmp); - unistr_to_ascii(tmp, s1->uni_full_name.buffer, sizeof(tmp)-1); - report(out_hnd, "\tFull Name:\t%s\n", tmp); - unistr_to_ascii(tmp, s1->uni_acct_desc.buffer, sizeof(tmp)-1); - report(out_hnd, "\tUser Description:\t%s\n", tmp); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -connection info level 1 container display function -****************************************************************************/ -void display_sam_info_1_ctr(FILE *out_hnd, enum action_type action, - uint32 count, SAM_DISPINFO_1 *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_sam_info_1_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < count; i++) - { - display_sam_info_1(out_hnd, ACTION_HEADER , &ctr->sam[i], &ctr->str[i]); - display_sam_info_1(out_hnd, ACTION_ENUMERATE, &ctr->sam[i], &ctr->str[i]); - display_sam_info_1(out_hnd, ACTION_FOOTER , &ctr->sam[i], &ctr->str[i]); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_sam_disp_info_ctr(FILE *out_hnd, enum action_type action, - uint16 level, uint32 count, - SAM_DISPINFO_CTR *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_sam_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (level) - { - case 1: - { - display_sam_info_1_ctr(out_hnd, action, - count, ctr->sam.info1); - break; - } - default: - { - report(out_hnd, "display_sam_info_ctr: Unknown Info Level\n"); - break; - } - } -} - diff --git a/source3/rpcclient/display_sec.c b/source3/rpcclient/display_sec.c deleted file mode 100644 index b29a27fefa..0000000000 --- a/source3/rpcclient/display_sec.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1999 - - 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" - - -/**************************************************************************** -convert a security permissions into a string -****************************************************************************/ -char *get_sec_mask_str(uint32 type) -{ - static fstring typestr; - int i; - - switch (type) - { - case SEC_RIGHTS_FULL_CONTROL: - { - fstrcpy(typestr, "Full Control"); - return typestr; - } - - case SEC_RIGHTS_READ: - { - fstrcpy(typestr, "Read"); - return typestr; - } - default: - { - break; - } - } - - typestr[0] = 0; - for (i = 0; i < 32; i++) - { - if (IS_BITS_SET_ALL(type, 1 << i)) - { - switch (1 << i) - { - case SEC_RIGHTS_QUERY_VALUE : fstrcat(typestr, "Query " ); break; - case SEC_RIGHTS_SET_VALUE : fstrcat(typestr, "Set " ); break; - case SEC_RIGHTS_CREATE_SUBKEY : fstrcat(typestr, "Create "); break; - case SEC_RIGHTS_ENUM_SUBKEYS : fstrcat(typestr, "Enum "); break; - case SEC_RIGHTS_NOTIFY : fstrcat(typestr, "Notify "); break; - case SEC_RIGHTS_CREATE_LINK : fstrcat(typestr, "CreateLink "); break; - case SEC_RIGHTS_DELETE : fstrcat(typestr, "Delete "); break; - case SEC_RIGHTS_READ_CONTROL : fstrcat(typestr, "ReadControl "); break; - case SEC_RIGHTS_WRITE_DAC : fstrcat(typestr, "WriteDAC "); break; - case SEC_RIGHTS_WRITE_OWNER : fstrcat(typestr, "WriteOwner "); break; - } - type &= ~(1 << i); - } - } - - /* remaining bits get added on as-is */ - if (type != 0) - { - fstring tmp; - slprintf(tmp, sizeof(tmp)-1, "[%08x]", type); - fstrcat(typestr, tmp); - } - - /* remove last space */ - i = strlen(typestr)-1; - if (typestr[i] == ' ') typestr[i] = 0; - - return typestr; -} - -/**************************************************************************** - display sec_access structure - ****************************************************************************/ -void display_sec_access(FILE *out_hnd, enum action_type action, SEC_ACCESS *const info) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - report(out_hnd, "\t\tPermissions:\t%s\n", - get_sec_mask_str(info->mask)); - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** - display sec_ace structure - ****************************************************************************/ -void display_sec_ace(FILE *out_hnd, enum action_type action, SEC_ACE *const ace) -{ - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "\tACE\n"); - break; - } - case ACTION_ENUMERATE: - { - fstring sid_str; - - display_sec_access(out_hnd, ACTION_HEADER , &ace->info); - display_sec_access(out_hnd, ACTION_ENUMERATE, &ace->info); - display_sec_access(out_hnd, ACTION_FOOTER , &ace->info); - - sid_to_string(sid_str, &ace->sid); - report(out_hnd, "\t\tSID:\t%s\n", sid_str); - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** - display sec_acl structure - ****************************************************************************/ -void display_sec_acl(FILE *out_hnd, enum action_type action, SEC_ACL *const sec_acl) -{ - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "\tACL\tNum ACEs:\t%d\trevision:\t%x\n", - sec_acl->num_aces, sec_acl->revision); - report(out_hnd, "\t---\n"); - - break; - } - case ACTION_ENUMERATE: - { - if (sec_acl->size != 0 && sec_acl->num_aces != 0) - { - int i; - for (i = 0; i < sec_acl->num_aces; i++) - { - display_sec_ace(out_hnd, ACTION_HEADER , &sec_acl->ace[i]); - display_sec_ace(out_hnd, ACTION_ENUMERATE, &sec_acl->ace[i]); - display_sec_ace(out_hnd, ACTION_FOOTER , &sec_acl->ace[i]); - } - } - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - -/**************************************************************************** - display sec_desc structure - ****************************************************************************/ -void display_sec_desc(FILE *out_hnd, enum action_type action, SEC_DESC *const sec) -{ - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "\tSecurity Descriptor\trevision:\t%x\ttype:\t%x\n", - sec->revision, sec->type); - report(out_hnd, "\t-------------------\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring sid_str; - - if (sec->off_sacl != 0) - { - display_sec_acl(out_hnd, ACTION_HEADER , sec->sacl); - display_sec_acl(out_hnd, ACTION_ENUMERATE, sec->sacl); - display_sec_acl(out_hnd, ACTION_FOOTER , sec->sacl); - } - if (sec->off_dacl != 0) - { - display_sec_acl(out_hnd, ACTION_HEADER , sec->dacl); - display_sec_acl(out_hnd, ACTION_ENUMERATE, sec->dacl); - display_sec_acl(out_hnd, ACTION_FOOTER , sec->dacl); - } - if (sec->off_owner_sid != 0) - { - sid_to_string(sid_str, sec->owner_sid); - report(out_hnd, "\tOwner SID:\t%s\n", sid_str); - } - if (sec->off_grp_sid != 0) - { - sid_to_string(sid_str, sec->grp_sid); - report(out_hnd, "\tParent SID:\t%s\n", sid_str); - } - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - diff --git a/source3/rpcclient/display_spool.c b/source3/rpcclient/display_spool.c deleted file mode 100644 index 252fc88156..0000000000 --- a/source3/rpcclient/display_spool.c +++ /dev/null @@ -1,457 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1999 - - 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" - -/**************************************************************************** -printer info level 0 display function -****************************************************************************/ -void display_print_info_0(FILE *out_hnd, enum action_type action, - PRINTER_INFO_0 *const i0) -{ - if (i0 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Printer Info Level 0:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring name; - fstring serv; - - unistr_to_ascii(name, i0->printername.buffer, sizeof(name)-1); - unistr_to_ascii(serv, i0->servername .buffer, sizeof(serv)-1); - - report(out_hnd, "\tprinter name:\t%s\n", name); - report(out_hnd, "\tserver name:\t%s\n", serv); - report(out_hnd, "\t[Other info not displayed]\n"); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -printer info level 1 display function -****************************************************************************/ -void display_print_info_1(FILE *out_hnd, enum action_type action, - PRINTER_INFO_1 *const i1) -{ - if (i1 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Printer Info Level 1:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring desc; - fstring name; - fstring comm; - - unistr_to_ascii(desc, i1->description.buffer, sizeof(desc)-1); - unistr_to_ascii(name, i1->name .buffer, sizeof(name)-1); - unistr_to_ascii(comm, i1->comment .buffer, sizeof(comm)-1); - - report(out_hnd, "\tflags:\t%d\n", i1->flags); - report(out_hnd, "\tname:\t%s\n", name); - report(out_hnd, "\tdescription:\t%s\n", desc); - report(out_hnd, "\tcomment:\t%s\n", comm); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -connection info level 0 container display function -****************************************************************************/ -void display_printer_info_0_ctr(FILE *out_hnd, enum action_type action, - uint32 count, PRINTER_INFO_0 *const *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_printer_info_0_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < count; i++) - { - display_print_info_0(out_hnd, ACTION_HEADER , ctr[i]); - display_print_info_0(out_hnd, ACTION_ENUMERATE, ctr[i]); - display_print_info_0(out_hnd, ACTION_FOOTER , ctr[i]); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info level 1 container display function -****************************************************************************/ -void display_printer_info_1_ctr(FILE *out_hnd, enum action_type action, - uint32 count, PRINTER_INFO_1 *const *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_printer_info_1_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < count; i++) - { - display_print_info_1(out_hnd, ACTION_HEADER , ctr[i]); - display_print_info_1(out_hnd, ACTION_ENUMERATE, ctr[i]); - display_print_info_1(out_hnd, ACTION_FOOTER , ctr[i]); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_printer_info_ctr(FILE *out_hnd, enum action_type action, - uint32 level, uint32 count, - void *const *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_printer_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (level) - { - case 0: - { - display_printer_info_0_ctr(out_hnd, action, - count, (PRINTER_INFO_0*const*const)ctr); - break; - } - case 1: - { - display_printer_info_1_ctr(out_hnd, action, - count, (PRINTER_INFO_1*const*const)ctr); - break; - } - default: - { - report(out_hnd, "display_printer_info_ctr: Unknown Info Level\n"); - break; - } - } -} - -/**************************************************************************** -job info level 2 display function -****************************************************************************/ -void display_job_info_2(FILE *out_hnd, enum action_type action, - JOB_INFO_2 *const i2) -{ - if (i2 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Job Info Level 2:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring tmp; - - report(out_hnd, "\tjob id:\t%d\n", i2->jobid); - unistr_to_ascii(tmp, i2->printername.buffer, sizeof(tmp)-1); - report(out_hnd, "\tprinter name:\t%s\n", tmp); - unistr_to_ascii(tmp, i2->machinename.buffer, sizeof(tmp)-1); - report(out_hnd, "\tmachine name:\t%s\n", tmp); - unistr_to_ascii(tmp, i2->username.buffer, sizeof(tmp)-1); - report(out_hnd, "\tusername:\t%s\n", tmp); - unistr_to_ascii(tmp, i2->document.buffer, sizeof(tmp)-1); - report(out_hnd, "\tdocument:\t%s\n", tmp); - unistr_to_ascii(tmp, i2->notifyname.buffer, sizeof(tmp)-1); - report(out_hnd, "\tnotify name:\t%s\n", tmp); - unistr_to_ascii(tmp, i2->datatype.buffer, sizeof(tmp)-1); - report(out_hnd, "\tdata type:\t%s\n", tmp); - unistr_to_ascii(tmp, i2->printprocessor.buffer, sizeof(tmp)-1); - report(out_hnd, "\tprint processor:\t%s\n", tmp); - unistr_to_ascii(tmp, i2->parameters.buffer, sizeof(tmp)-1); - report(out_hnd, "\tparameters:\t%s\n", tmp); - unistr_to_ascii(tmp, i2->drivername.buffer, sizeof(tmp)-1); - report(out_hnd, "\tdriver name:\t%s\n", tmp); - report(out_hnd, "\tDevice Mode:\tNOT DISPLAYED YET\n"); -/* - DEVICEMODE *devmode; -*/ - unistr_to_ascii(tmp, i2->text_status.buffer, sizeof(tmp)-1); - report(out_hnd, "\ttext status:\t%s\n", tmp); - /* SEC_DESC sec_desc;*/ - report(out_hnd, "\tstatus:\t%d\n", i2->status); - report(out_hnd, "\tpriority:\t%d\n", i2->priority); - report(out_hnd, "\tposition:\t%d\n", i2->position); - report(out_hnd, "\tstarttime:\t%d\n", i2->starttime); - report(out_hnd, "\tuntiltime:\t%d\n", i2->untiltime); - report(out_hnd, "\ttotalpages:\t%d\n", i2->totalpages); - report(out_hnd, "\tsize:\t%d\n", i2->size); -/* - SYSTEMTIME submitted; -*/ - report(out_hnd, "\tsubmitted:\tNOT DISPLAYED YET\n"); - report(out_hnd, "\ttimeelapsed:\t%d\n", i2->timeelapsed); - report(out_hnd, "\tpagesprinted:\t%d\n", i2->pagesprinted); - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -job info level 1 display function -****************************************************************************/ -void display_job_info_1(FILE *out_hnd, enum action_type action, - JOB_INFO_1 *const i1) -{ - if (i1 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Job Info Level 1:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring tmp; - - report(out_hnd, "\tjob id:\t%d\n", i1->jobid); - unistr_to_ascii(tmp, i1->printername.buffer, sizeof(tmp)-1); - report(out_hnd, "\tprinter name:\t%s\n", tmp); - unistr_to_ascii(tmp, i1->machinename.buffer, sizeof(tmp)-1); - report(out_hnd, "\tmachine name:\t%s\n", tmp); - unistr_to_ascii(tmp, i1->username.buffer, sizeof(tmp)-1); - report(out_hnd, "\tusername:\t%s\n", tmp); - unistr_to_ascii(tmp, i1->document.buffer, sizeof(tmp)-1); - report(out_hnd, "\tdocument:\t%s\n", tmp); - unistr_to_ascii(tmp, i1->datatype.buffer, sizeof(tmp)-1); - report(out_hnd, "\tdata type:\t%s\n", tmp); - unistr_to_ascii(tmp, i1->text_status.buffer, sizeof(tmp)-1); - report(out_hnd, "\ttext status:\t%s\n", tmp); - report(out_hnd, "\tstatus:\t%d\n", i1->status); - report(out_hnd, "\tpriority:\t%d\n", i1->priority); - report(out_hnd, "\tposition:\t%d\n", i1->position); - report(out_hnd, "\ttotalpages:\t%d\n", i1->totalpages); -/* - SYSTEMTIME submitted; -*/ - report(out_hnd, "\tsubmitted:\tNOT DISPLAYED YET\n"); - report(out_hnd, "\tpagesprinted:\t%d\n", i1->pagesprinted); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -connection info level 2 container display function -****************************************************************************/ -void display_job_info_2_ctr(FILE *out_hnd, enum action_type action, - uint32 count, JOB_INFO_2 *const *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_job_info_2_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < count; i++) - { - display_job_info_2(out_hnd, ACTION_HEADER , ctr[i]); - display_job_info_2(out_hnd, ACTION_ENUMERATE, ctr[i]); - display_job_info_2(out_hnd, ACTION_FOOTER , ctr[i]); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info level 1 container display function -****************************************************************************/ -void display_job_info_1_ctr(FILE *out_hnd, enum action_type action, - uint32 count, JOB_INFO_1 *const *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_job_info_1_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < count; i++) - { - display_job_info_1(out_hnd, ACTION_HEADER , ctr[i]); - display_job_info_1(out_hnd, ACTION_ENUMERATE, ctr[i]); - display_job_info_1(out_hnd, ACTION_FOOTER , ctr[i]); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_job_info_ctr(FILE *out_hnd, enum action_type action, - uint32 level, uint32 count, - void *const *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_job_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (level) - { - case 1: - { - display_job_info_1_ctr(out_hnd, action, - count, (JOB_INFO_1*const*const)ctr); - break; - } - case 2: - { - display_job_info_2_ctr(out_hnd, action, - count, (JOB_INFO_2*const*const)ctr); - break; - } - default: - { - report(out_hnd, "display_job_info_ctr: Unknown Info Level\n"); - break; - } - } -} diff --git a/source3/rpcclient/display_srv.c b/source3/rpcclient/display_srv.c deleted file mode 100644 index f0069c0d53..0000000000 --- a/source3/rpcclient/display_srv.c +++ /dev/null @@ -1,1198 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1999 - - 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" - - -struct field_info sid_name_info[] = -{ - { SID_NAME_UNKNOWN, "UNKNOWN" }, /* default */ - { SID_NAME_USER , "User" }, - { SID_NAME_DOM_GRP, "Domain Group" }, - { SID_NAME_DOMAIN , "Domain" }, - { SID_NAME_ALIAS , "Local Group" }, - { SID_NAME_WKN_GRP, "Well-known Group"}, - { SID_NAME_DELETED, "Deleted" }, - { SID_NAME_INVALID, "Invalid" }, - { 0 , NULL } -}; - -/**************************************************************************** -convert a SID_NAME_USE to a string -****************************************************************************/ -char *get_sid_name_use_str(uint8 sid_name_use) -{ - return enum_field_to_str((uint32)sid_name_use, sid_name_info, True); -} - -/**************************************************************************** -convert a share mode to a string -****************************************************************************/ -char *get_file_mode_str(uint32 share_mode) -{ - static fstring mode; - - switch ((share_mode>>4)&0xF) - { - case DENY_NONE : fstrcpy(mode, "DENY_NONE "); break; - case DENY_ALL : fstrcpy(mode, "DENY_ALL "); break; - case DENY_DOS : fstrcpy(mode, "DENY_DOS "); break; - case DENY_READ : fstrcpy(mode, "DENY_READ "); break; - case DENY_WRITE: fstrcpy(mode, "DENY_WRITE "); break; - default : fstrcpy(mode, "DENY_???? "); break; - } - - switch (share_mode & 0xF) - { - case 0 : fstrcat(mode, "RDONLY"); break; - case 1 : fstrcat(mode, "WRONLY"); break; - case 2 : fstrcat(mode, "RDWR "); break; - default: fstrcat(mode, "R??W??"); break; - } - - return mode; -} - -/**************************************************************************** -convert an oplock mode to a string -****************************************************************************/ -char *get_file_oplock_str(uint32 op_type) -{ - static fstring oplock; - BOOL excl = IS_BITS_SET_ALL(op_type, EXCLUSIVE_OPLOCK); - BOOL batch = IS_BITS_SET_ALL(op_type, BATCH_OPLOCK ); - - oplock[0] = 0; - - if (excl ) fstrcat(oplock, "EXCLUSIVE"); - if (excl && batch) fstrcat(oplock, "+"); - if ( batch) fstrcat(oplock, "BATCH"); - if (!excl && !batch) fstrcat(oplock, "NONE"); - - return oplock; -} - -/**************************************************************************** -convert a share type enum to a string -****************************************************************************/ -char *get_share_type_str(uint32 type) -{ - static fstring typestr; - - switch (type) - { - case STYPE_DISKTREE: fstrcpy(typestr, "Disk" ); break; - case STYPE_PRINTQ : fstrcpy(typestr, "Printer"); break; - case STYPE_DEVICE : fstrcpy(typestr, "Device" ); break; - case STYPE_IPC : fstrcpy(typestr, "IPC" ); break; - default : fstrcpy(typestr, "????" ); break; - } - return typestr; -} - -/**************************************************************************** -convert a server type enum to a string -****************************************************************************/ -char *get_server_type_str(uint32 type) -{ - static fstring typestr; - - if (type == SV_TYPE_ALL) - { - fstrcpy(typestr, "All"); - } - else - { - int i; - typestr[0] = 0; - for (i = 0; i < 32; i++) - { - if (IS_BITS_SET_ALL(type, 1 << i)) - { - switch (1 << i) - { - case SV_TYPE_WORKSTATION : fstrcat(typestr, "Wk " ); break; - case SV_TYPE_SERVER : fstrcat(typestr, "Sv " ); break; - case SV_TYPE_SQLSERVER : fstrcat(typestr, "Sql "); break; - case SV_TYPE_DOMAIN_CTRL : fstrcat(typestr, "PDC "); break; - case SV_TYPE_DOMAIN_BAKCTRL : fstrcat(typestr, "BDC "); break; - case SV_TYPE_TIME_SOURCE : fstrcat(typestr, "Tim "); break; - case SV_TYPE_AFP : fstrcat(typestr, "AFP "); break; - case SV_TYPE_NOVELL : fstrcat(typestr, "Nov "); break; - case SV_TYPE_DOMAIN_MEMBER : fstrcat(typestr, "Dom "); break; - case SV_TYPE_PRINTQ_SERVER : fstrcat(typestr, "PrQ "); break; - case SV_TYPE_DIALIN_SERVER : fstrcat(typestr, "Din "); break; - case SV_TYPE_SERVER_UNIX : fstrcat(typestr, "Unx "); break; - case SV_TYPE_NT : fstrcat(typestr, "NT " ); break; - case SV_TYPE_WFW : fstrcat(typestr, "Wfw "); break; - case SV_TYPE_SERVER_MFPN : fstrcat(typestr, "Mfp "); break; - case SV_TYPE_SERVER_NT : fstrcat(typestr, "SNT "); break; - case SV_TYPE_POTENTIAL_BROWSER: fstrcat(typestr, "PtB "); break; - case SV_TYPE_BACKUP_BROWSER : fstrcat(typestr, "BMB "); break; - case SV_TYPE_MASTER_BROWSER : fstrcat(typestr, "LMB "); break; - case SV_TYPE_DOMAIN_MASTER : fstrcat(typestr, "DMB "); break; - case SV_TYPE_SERVER_OSF : fstrcat(typestr, "OSF "); break; - case SV_TYPE_SERVER_VMS : fstrcat(typestr, "VMS "); break; - case SV_TYPE_WIN95_PLUS : fstrcat(typestr, "W95 "); break; - case SV_TYPE_ALTERNATE_XPORT : fstrcat(typestr, "Xpt "); break; - case SV_TYPE_LOCAL_LIST_ONLY : fstrcat(typestr, "Dom "); break; - case SV_TYPE_DOMAIN_ENUM : fstrcat(typestr, "Loc "); break; - } - } - } - i = strlen(typestr)-1; - if (typestr[i] == ' ') typestr[i] = 0; - - } - return typestr; -} - -/**************************************************************************** -server info level 101 display function -****************************************************************************/ -void display_srv_info_101(FILE *out_hnd, enum action_type action, - SRV_INFO_101 *const sv101) -{ - if (sv101 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Server Info Level 101:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring name; - fstring comment; - - unistr2_to_ascii(name, &sv101->uni_name, sizeof(name)-1); - unistr2_to_ascii(comment, &sv101->uni_comment, sizeof(comment)-1); - - display_server(out_hnd, action, name, sv101->srv_type, comment); - - report(out_hnd, "\tplatform_id :\t%d\n" , sv101->platform_id); - report(out_hnd, "\tos version :\t%d.%d\n" , sv101->ver_major, sv101->ver_minor); - - break; - } - case ACTION_FOOTER: - { - break; - } - } - -} - -/**************************************************************************** -server info level 102 display function -****************************************************************************/ -void display_srv_info_102(FILE *out_hnd, enum action_type action, SRV_INFO_102 *const sv102) -{ - if (sv102 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Server Info Level 102:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring name; - fstring comment; - fstring usr_path; - - unistr2_to_ascii(name, &sv102->uni_name, sizeof(name)-1); - unistr2_to_ascii(comment, &sv102->uni_comment, sizeof(comment)-1); - unistr2_to_ascii(usr_path, &sv102->uni_usr_path, - sizeof(usr_path)-1); - - display_server(out_hnd, action, name, sv102->srv_type, comment); - - report(out_hnd, "\tplatform_id :\t%d\n" , sv102->platform_id); - report(out_hnd, "\tos version :\t%d.%d\n" , sv102->ver_major, sv102->ver_minor); - - report(out_hnd, "\tusers :\t%x\n" , sv102->users ); - report(out_hnd, "\tdisc, hidden :\t%x, %x\n" , sv102->disc , sv102->hidden ); - report(out_hnd, "\tannounce, delta :\t%d, %d\n", sv102->announce , sv102->ann_delta); - report(out_hnd, "\tlicenses :\t%d\n" , sv102->licenses ); - report(out_hnd, "\tuser path :\t%s\n" , usr_path); - - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -server info container display function -****************************************************************************/ -void display_srv_info_ctr(FILE *out_hnd, enum action_type action, SRV_INFO_CTR *const ctr) -{ - if (ctr == NULL || ctr->ptr_srv_ctr == 0) - { - report(out_hnd, "Server Information: unavailable due to an error\n"); - return; - } - - switch (ctr->switch_value) - { - case 101: - { - display_srv_info_101(out_hnd, action, &(ctr->srv.sv101)); - break; - } - case 102: - { - display_srv_info_102(out_hnd, action, &(ctr->srv.sv102)); - break; - } - default: - { - report(out_hnd, "Server Information: Unknown Info Level\n"); - break; - } - } -} - -/**************************************************************************** -connection info level 0 display function -****************************************************************************/ -void display_conn_info_0(FILE *out_hnd, enum action_type action, - CONN_INFO_0 *const info0) -{ - if (info0 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Connection Info Level 0:\n"); - - break; - } - case ACTION_ENUMERATE: - { - report(out_hnd, "\tid:\t%d\n", info0->id); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -connection info level 1 display function -****************************************************************************/ -void display_conn_info_1(FILE *out_hnd, enum action_type action, - CONN_INFO_1 *const info1, CONN_INFO_1_STR *const str1) -{ - if (info1 == NULL || str1 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Connection Info Level 1:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring usr_name; - fstring net_name; - - unistr2_to_ascii(usr_name, &str1->uni_usr_name, sizeof(usr_name)-1); - unistr2_to_ascii(net_name, &str1->uni_net_name, sizeof(net_name)-1); - - report(out_hnd, "\tid :\t%d\n", info1->id); - report(out_hnd, "\ttype :\t%s\n", get_share_type_str(info1->type)); - report(out_hnd, "\tnum_opens:\t%d\n", info1->num_opens); - report(out_hnd, "\tnum_users:\t%d\n", info1->num_users); - report(out_hnd, "\topen_time:\t%d\n", info1->open_time); - - report(out_hnd, "\tuser name:\t%s\n", usr_name); - report(out_hnd, "\tnet name:\t%s\n", net_name); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -connection info level 0 container display function -****************************************************************************/ -void display_srv_conn_info_0_ctr(FILE *out_hnd, enum action_type action, - SRV_CONN_INFO_0 *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_srv_conn_info_0_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_conn_info_0(out_hnd, ACTION_HEADER , &(ctr->info_0[i])); - display_conn_info_0(out_hnd, ACTION_ENUMERATE, &(ctr->info_0[i])); - display_conn_info_0(out_hnd, ACTION_FOOTER , &(ctr->info_0[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info level 1 container display function -****************************************************************************/ -void display_srv_conn_info_1_ctr(FILE *out_hnd, enum action_type action, - SRV_CONN_INFO_1 *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_srv_conn_info_1_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_conn_info_1(out_hnd, ACTION_HEADER , &(ctr->info_1[i]), &(ctr->info_1_str[i])); - display_conn_info_1(out_hnd, ACTION_ENUMERATE, &(ctr->info_1[i]), &(ctr->info_1_str[i])); - display_conn_info_1(out_hnd, ACTION_FOOTER , &(ctr->info_1[i]), &(ctr->info_1_str[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -connection info container display function -****************************************************************************/ -void display_srv_conn_info_ctr(FILE *out_hnd, enum action_type action, - SRV_CONN_INFO_CTR *const ctr) -{ - if (ctr == NULL || ctr->ptr_conn_ctr == 0) - { - report(out_hnd, "display_srv_conn_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (ctr->switch_value) - { - case 0: - { - display_srv_conn_info_0_ctr(out_hnd, action, - &(ctr->conn.info0)); - break; - } - case 1: - { - display_srv_conn_info_1_ctr(out_hnd, action, - &(ctr->conn.info1)); - break; - } - default: - { - report(out_hnd, "display_srv_conn_info_ctr: Unknown Info Level\n"); - break; - } - } -} - - -/**************************************************************************** -transport info level 0 display function -****************************************************************************/ -void display_tprt_info_0(FILE *out_hnd, enum action_type action, - TPRT_INFO_0 *const info0, TPRT_INFO_0_STR *const str0) -{ - if (info0 == NULL || str0 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Transport Info Level 0:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring trans_name; - fstring trans_addr; - fstring addr_name; - - unistr2_to_ascii(trans_name, &str0->uni_trans_name, sizeof(trans_name)-1); - buffer4_to_str(trans_addr, &str0->buf_trans_addr, sizeof(trans_addr)-1); - unistr2_to_ascii(addr_name, &str0->uni_addr_name, sizeof(addr_name)-1); - - report(out_hnd, "\tnum_vcs :\t%d\n", info0->num_vcs); - report(out_hnd, "\ttransport name:\t%s\n", trans_name); - report(out_hnd, "\ttransport addr:\t%s\n", trans_addr); - report(out_hnd, "\taddress name:\t%s\n", addr_name); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -transport info level 0 container display function -****************************************************************************/ -void display_srv_tprt_info_0_ctr(FILE *out_hnd, enum action_type action, - const SRV_TPRT_INFO_0 *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_srv_tprt_info_0_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_tprt_info_0(out_hnd, ACTION_HEADER , &(ctr->info_0[i]), &(ctr->info_0_str[i])); - display_tprt_info_0(out_hnd, ACTION_ENUMERATE, &(ctr->info_0[i]), &(ctr->info_0_str[i])); - display_tprt_info_0(out_hnd, ACTION_FOOTER , &(ctr->info_0[i]), &(ctr->info_0_str[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -transport info container display function -****************************************************************************/ -void display_srv_tprt_info_ctr(FILE *out_hnd, enum action_type action, - const SRV_TPRT_INFO_CTR *const ctr) -{ - if (ctr == NULL || ctr->ptr_tprt_ctr == 0) - { - report(out_hnd, "display_srv_tprt_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (ctr->switch_value) - { - case 0: - { - display_srv_tprt_info_0_ctr(out_hnd, action, - &(ctr->tprt.info0)); - break; - } - default: - { - report(out_hnd, "display_srv_tprt_info_ctr: Unknown Info Level\n"); - break; - } - } -} - - -/**************************************************************************** -share info level 1 display function -****************************************************************************/ -void display_share_info_1(FILE *out_hnd, enum action_type action, - SH_INFO_1 *const info1, SH_INFO_1_STR *const str1) -{ - if (info1 == NULL || str1 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Share Info Level 1:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring remark ; - fstring net_name; - - unistr2_to_ascii(net_name, &str1->uni_netname, sizeof(net_name)-1); - unistr2_to_ascii(remark, &str1->uni_remark, sizeof(remark)-1); - - display_share(out_hnd, action, net_name, info1->type, remark); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -share info level 2 display function -****************************************************************************/ -void display_share_info_2(FILE *out_hnd, enum action_type action, - SH_INFO_2 *const info2, SH_INFO_2_STR *const str2) -{ - if (info2 == NULL || str2 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Share Info Level 2:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring remark ; - fstring net_name; - fstring path ; - fstring password; - - unistr2_to_ascii(net_name, &str2->uni_netname, sizeof(net_name)-1); - unistr2_to_ascii(remark, &str2->uni_remark, sizeof(remark)-1); - unistr2_to_ascii(path, &str2->uni_path, sizeof(path)-1); - unistr2_to_ascii(password, &str2->uni_passwd, sizeof(password)-1); - - display_share2(out_hnd, action, net_name, info2->type, remark, - info2->perms, info2->max_uses, info2->num_uses, - path, password); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -share info level 1 container display function -****************************************************************************/ -void display_srv_share_info_1_ctr(FILE *out_hnd, enum action_type action, - SRV_SHARE_INFO_1 *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_srv_share_info_1_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_share_info_1(out_hnd, ACTION_HEADER , &(ctr->info_1[i]), &(ctr->info_1_str[i])); - display_share_info_1(out_hnd, ACTION_ENUMERATE, &(ctr->info_1[i]), &(ctr->info_1_str[i])); - display_share_info_1(out_hnd, ACTION_FOOTER , &(ctr->info_1[i]), &(ctr->info_1_str[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -share info level 2 container display function -****************************************************************************/ -void display_srv_share_info_2_ctr(FILE *out_hnd, enum action_type action, - SRV_SHARE_INFO_2 *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_srv_share_info_2_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_share_info_2(out_hnd, ACTION_HEADER , &(ctr->info_2[i]), &(ctr->info_2_str[i])); - display_share_info_2(out_hnd, ACTION_ENUMERATE, &(ctr->info_2[i]), &(ctr->info_2_str[i])); - display_share_info_2(out_hnd, ACTION_FOOTER , &(ctr->info_2[i]), &(ctr->info_2_str[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -share info container display function -****************************************************************************/ -void display_srv_share_info_ctr(FILE *out_hnd, enum action_type action, - SRV_SHARE_INFO_CTR *const ctr) -{ - if (ctr == NULL || ctr->ptr_share_ctr == 0) - { - report(out_hnd, "display_srv_share_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (ctr->switch_value) - { - case 1: - { - display_srv_share_info_1_ctr(out_hnd, action, - &(ctr->share.info1)); - break; - } - case 2: - { - display_srv_share_info_2_ctr(out_hnd, action, - &(ctr->share.info2)); - break; - } - default: - { - report(out_hnd, "display_srv_share_info_ctr: Unknown Info Level\n"); - break; - } - } -} - - -/**************************************************************************** -file info level 3 display function -****************************************************************************/ -void display_file_info_3(FILE *out_hnd, enum action_type action, - FILE_INFO_3 *const info3, FILE_INFO_3_STR *const str3) -{ - if (info3 == NULL || str3 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "File Info Level 3:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring path_name; - fstring user_name; - - unistr2_to_ascii(path_name, &str3->uni_path_name, - sizeof(path_name)-1); - unistr2_to_ascii(user_name, &str3->uni_user_name, - sizeof(user_name)-1); - - report(out_hnd, "\tid :\t%d\n", info3->id); - report(out_hnd, "\tperms :\t%s\n", get_file_mode_str(info3->perms)); - report(out_hnd, "\tnum_locks:\t%d\n", info3->num_locks); - - report(out_hnd, "\tpath name:\t%s\n", path_name); - report(out_hnd, "\tuser name:\t%s\n", user_name); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -file info level 3 container display function -****************************************************************************/ -void display_srv_file_info_3_ctr(FILE *out_hnd, enum action_type action, - SRV_FILE_INFO_3 *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_srv_file_info_3_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_file_info_3(out_hnd, ACTION_HEADER , &(ctr->info_3[i]), &(ctr->info_3_str[i])); - display_file_info_3(out_hnd, ACTION_ENUMERATE, &(ctr->info_3[i]), &(ctr->info_3_str[i])); - display_file_info_3(out_hnd, ACTION_FOOTER , &(ctr->info_3[i]), &(ctr->info_3_str[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -file info container display function -****************************************************************************/ -void display_srv_file_info_ctr(FILE *out_hnd, enum action_type action, - SRV_FILE_INFO_CTR *const ctr) -{ - if (ctr == NULL || ctr->ptr_file_ctr == 0) - { - report(out_hnd, "display_srv_file_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (ctr->switch_value) - { - case 3: - { - display_srv_file_info_3_ctr(out_hnd, action, - &(ctr->file.info3)); - break; - } - default: - { - report(out_hnd, "display_srv_file_info_ctr: Unknown Info Level\n"); - break; - } - } -} - -/**************************************************************************** -sess info level 0 display function -****************************************************************************/ -void display_sess_info_0(FILE *out_hnd, enum action_type action, - SESS_INFO_0 *const info0, SESS_INFO_0_STR *const str0) -{ - if (info0 == NULL || str0 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Session Info Level 0:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring name; - - unistr2_to_ascii(name, &str0->uni_name, - sizeof(name)-1); - - report(out_hnd, "\tname:\t%s\n", name); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -sess info level 1 display function -****************************************************************************/ -void display_sess_info_1(FILE *out_hnd, enum action_type action, - SESS_INFO_1 *const info1, SESS_INFO_1_STR *const str1) -{ - if (info1 == NULL || str1 == NULL) - { - return; - } - - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "Session Info Level 1:\n"); - - break; - } - case ACTION_ENUMERATE: - { - fstring name; - fstring user_name; - - unistr2_to_ascii(user_name, &str1->uni_user, - sizeof(user_name)-1); - unistr2_to_ascii(name, &str1->uni_name, - sizeof(name)-1); - - report(out_hnd, "\tname:\t%s\n", name); - - report(out_hnd, "\topen :\t%d\n", info1->num_opens); - report(out_hnd, "\ttime :\t%d\n", info1->open_time); - report(out_hnd, "\tidle :\t%d\n", info1->idle_time); - report(out_hnd, "\tflags:\t%d\n", info1->user_flags); - - report(out_hnd, "\tuser :\t%s\n", user_name); - - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } - -} - -/**************************************************************************** -sess info level 0 container display function -****************************************************************************/ -void display_srv_sess_info_0_ctr(FILE *out_hnd, enum action_type action, - SRV_SESS_INFO_0 *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_srv_sess_info_0_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_sess_info_0(out_hnd, ACTION_HEADER , &(ctr->info_0[i]), &(ctr->info_0_str[i])); - display_sess_info_0(out_hnd, ACTION_ENUMERATE, &(ctr->info_0[i]), &(ctr->info_0_str[i])); - display_sess_info_0(out_hnd, ACTION_FOOTER , &(ctr->info_0[i]), &(ctr->info_0_str[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -sess info level 1 container display function -****************************************************************************/ -void display_srv_sess_info_1_ctr(FILE *out_hnd, enum action_type action, - SRV_SESS_INFO_1 *const ctr) -{ - if (ctr == NULL) - { - report(out_hnd, "display_srv_sess_info_1_ctr: unavailable due to an internal error\n"); - return; - } - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - int i; - - for (i = 0; i < ctr->num_entries_read; i++) - { - display_sess_info_1(out_hnd, ACTION_HEADER , &(ctr->info_1[i]), &(ctr->info_1_str[i])); - display_sess_info_1(out_hnd, ACTION_ENUMERATE, &(ctr->info_1[i]), &(ctr->info_1_str[i])); - display_sess_info_1(out_hnd, ACTION_FOOTER , &(ctr->info_1[i]), &(ctr->info_1_str[i])); - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -sess info container display function -****************************************************************************/ -void display_srv_sess_info_ctr(FILE *out_hnd, enum action_type action, - SRV_SESS_INFO_CTR *const ctr) -{ - if (ctr == NULL || ctr->ptr_sess_ctr == 0) - { - report(out_hnd, "display_srv_sess_info_ctr: unavailable due to an internal error\n"); - return; - } - - switch (ctr->switch_value) - { - case 0: - { - display_srv_sess_info_0_ctr(out_hnd, action, - &(ctr->sess.info0)); - break; - } - case 1: - { - display_srv_sess_info_1_ctr(out_hnd, action, - &(ctr->sess.info1)); - break; - } - default: - { - report(out_hnd, "display_srv_sess_info_ctr: Unknown Info Level\n"); - break; - } - } -} - -/**************************************************************************** - print browse connection on a host - ****************************************************************************/ -void display_server(FILE *out_hnd, enum action_type action, - char *const sname, uint32 type, char *const comment) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - report(out_hnd, "\t%-15.15s%-20s %s\n", - sname, get_server_type_str(type), comment); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** -print shares on a host -****************************************************************************/ -void display_share(FILE *out_hnd, enum action_type action, - char *const sname, uint32 type, char *const comment) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - report(out_hnd, "\t%-15.15s%-10.10s%s\n", - sname, get_share_type_str(type), comment); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - - -/**************************************************************************** -print shares on a host, level 2 -****************************************************************************/ -void display_share2(FILE *out_hnd, enum action_type action, - char *const sname, uint32 type, char *const comment, - uint32 perms, uint32 max_uses, uint32 num_uses, - char *const path, char *const password) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - report(out_hnd, "\t%-15.15s%-10.10s%s %x %x %x %s %s\n", - sname, get_share_type_str(type), comment, - perms, max_uses, num_uses, path, password); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - - -/**************************************************************************** -print name info -****************************************************************************/ -void display_name(FILE *out_hnd, enum action_type action, - char *const sname) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - report(out_hnd, "\t%-21.21s\n", sname); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - diff --git a/source3/rpcclient/display_svc.c b/source3/rpcclient/display_svc.c deleted file mode 100644 index 04b366a216..0000000000 --- a/source3/rpcclient/display_svc.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1999 - - 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" - - -/**************************************************************************** -convert a security permissions into a string -****************************************************************************/ -char *get_svc_start_type_str(uint32 type) -{ - static fstring typestr; - - switch (type) - { - case 0x00: fstrcpy(typestr, "Boot" ); return typestr; - case 0x01: fstrcpy(typestr, "System" ); return typestr; - case 0x02: fstrcpy(typestr, "Auto" ); return typestr; - case 0x03: fstrcpy(typestr, "Manual" ); return typestr; - case 0x04: fstrcpy(typestr, "Disabled"); return typestr; - default : break; - } - slprintf(typestr, sizeof(typestr)-1, "[%d]", type); - return typestr; -} - - -/**************************************************************************** - display structure - ****************************************************************************/ -void display_query_svc_cfg(FILE *out_hnd, enum action_type action, - const QUERY_SERVICE_CONFIG *const cfg) -{ - switch (action) - { - case ACTION_HEADER: - { - fstring service; - - unistr2_to_ascii(service, &cfg->uni_display_name, sizeof(service)-1); - report(out_hnd, "\tService:\t%s\n", service); - report(out_hnd, "\t-------\n"); - break; - } - case ACTION_ENUMERATE: - { - fstring temp; - - unistr2_to_ascii(temp, &cfg->uni_bin_path_name, sizeof(temp)-1); - report(out_hnd, "\tPath:\t%s\n", temp); - - unistr2_to_ascii(temp, &cfg->uni_load_order_grp, sizeof(temp)-1); - report(out_hnd, "\tLoad Order:\t%s\n", temp); - - unistr2_to_ascii(temp, &cfg->uni_dependencies, sizeof(temp)-1); - report(out_hnd, "\tDependencies:\t%s\n", temp); - - unistr2_to_ascii(temp, &cfg->uni_service_start_name, sizeof(temp)-1); - report(out_hnd, "\tService Start:\t%s\n", temp); - - report(out_hnd, "\tService Type:\t%d\n", cfg->service_type); - report(out_hnd, "\tStart Type:\t%s\n" , get_svc_start_type_str(cfg->start_type)); - report(out_hnd, "\tError Control:\t%d\n" , cfg->error_control); - report(out_hnd, "\tTag Id:\t%d\n" , cfg->tag_id); - break; - - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - -/**************************************************************************** - display structure - ****************************************************************************/ -void display_svc_info(FILE *out_hnd, enum action_type action, - const ENUM_SRVC_STATUS *const svc) -{ - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - fstring name; - - unistr_to_ascii(name, svc->uni_srvc_name.buffer, - sizeof(name)-1); /* service name */ - report(out_hnd, "\t%s:", name); - - unistr_to_ascii(name, svc->uni_disp_name.buffer, - sizeof(name)-1); /* display name */ - report(out_hnd, "\t%s\n", name); - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - diff --git a/source3/rpcclient/display_sync.c b/source3/rpcclient/display_sync.c deleted file mode 100644 index 8250a96f02..0000000000 --- a/source3/rpcclient/display_sync.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Samba utility functions - Copyright (C) Andrew Tridgell 1992-1999 - Copyright (C) Luke Kenneth Casson Leighton 1996 - 1999 - - 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" - - -/**************************************************************************** - display sam sync structure - ****************************************************************************/ -void display_sam_sync_ctr(FILE *out_hnd, enum action_type action, - SAM_DELTA_HDR *const delta, - SAM_DELTA_CTR *const ctr) -{ - fstring name; - - switch (action) - { - case ACTION_HEADER: - { - break; - } - case ACTION_ENUMERATE: - { - switch (delta->type) - { - case 1: - { - unistr2_to_ascii(name, &(ctr->domain_info.uni_dom_name), sizeof(name)-1); - report(out_hnd, "Domain: %s\n", name); - break; - } - case 2: - { - unistr2_to_ascii(name, &(ctr->group_info.uni_grp_name), sizeof(name)-1); - report(out_hnd, "Group: %s\n", name); - break; - } - case 5: - { - unsigned char lm_pwd[16]; - unsigned char nt_pwd[16]; - - unistr2_to_ascii(name, &(ctr->account_info.uni_acct_name), sizeof(name)-1); - report(out_hnd, "Account: %s\n", name); - - sam_pwd_hash(ctr->account_info.user_rid, ctr->account_info.pass.buf_lm_pwd, lm_pwd, 0); - out_struct(out_hnd, lm_pwd, 16, 8); - - sam_pwd_hash(ctr->account_info.user_rid, ctr->account_info.pass.buf_nt_pwd, nt_pwd, 0); - out_struct(out_hnd, nt_pwd, 16, 8); - } - } - break; - } - case ACTION_FOOTER: - { - break; - } - } -} - -/**************************************************************************** - display sam sync structure - ****************************************************************************/ -void display_sam_sync(FILE *out_hnd, enum action_type action, - SAM_DELTA_HDR *const deltas, - SAM_DELTA_CTR *const ctr, - uint32 num) -{ - switch (action) - { - case ACTION_HEADER: - { - report(out_hnd, "\tSAM Database Sync\n"); - report(out_hnd, "\t-----------------\n"); - - break; - } - case ACTION_ENUMERATE: - { - int i; - for (i = 0; i < num; i++) - { - display_sam_sync_ctr(out_hnd, ACTION_HEADER , &deltas[i], &ctr[i]); - display_sam_sync_ctr(out_hnd, ACTION_ENUMERATE, &deltas[i], &ctr[i]); - display_sam_sync_ctr(out_hnd, ACTION_FOOTER , &deltas[i], &ctr[i]); - } - break; - } - case ACTION_FOOTER: - { - report(out_hnd, "\n"); - break; - } - } -} - diff --git a/source3/samrd/samrd.c b/source3/samrd/samrd.c deleted file mode 100644 index 40ebf45b51..0000000000 --- a/source3/samrd/samrd.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Main SMB server routines - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -fstring pipe_name; - -pstring servicesf = CONFIGFILE; -extern pstring debugf; -extern BOOL append_log; -extern int DEBUGLEVEL; - -/************************************************************************* - initialise an msrpc service - *************************************************************************/ -void msrpc_service_init(void) -{ - if (!pwdb_initialise(True)) - { - exit(-1); - } - - if(!initialise_sam_password_db()) - { - exit(-1); - } - - if(!initialise_passgrp_db()) - { - exit(-1); - } - - if(!initialise_group_db()) - { - exit(-1); - } - - if(!initialise_alias_db()) - { - exit(-1); - } - - if(!initialise_builtin_db()) - { - exit(-1); - } - - if (!get_member_domain_sid()) - { - DEBUG(0,("ERROR: Samba cannot obtain PDC SID from PDC(s) %s.\n", - lp_passwordserver())); - exit(-1); - } -} - -/**************************************************************************** - reload the services file - **************************************************************************/ -BOOL reload_services(BOOL test) -{ - BOOL ret; - - if (lp_loaded()) { - pstring fname; - pstrcpy(fname,lp_configfile()); - if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) { - pstrcpy(servicesf,fname); - test = False; - } - } - - reopen_logs(); - - if (test && !lp_file_list_changed()) - return(True); - - lp_killunused(NULL); - - ret = lp_load(servicesf,False,False,True); - - /* perhaps the config filename is now set */ - if (!test) - reload_services(True); - - reopen_logs(); - - load_interfaces(); - - return(ret); -} - -/**************************************************************************** - main program -****************************************************************************/ - int main(int argc,char *argv[]) -{ -#ifdef HAVE_SET_AUTH_PARAMETERS - set_auth_parameters(argc,argv); -#endif - -#ifdef HAVE_SETLUID - /* needed for SecureWare on SCO */ - setluid(0); -#endif - - append_log = True; - - TimeInit(); - - setup_logging(argv[0],False); - fstrcpy(pipe_name, "samr"); - slprintf(debugf, sizeof(debugf), "%s/log.%s", LOGFILEBASE, pipe_name); - add_msrpc_command_processor( pipe_name, argv[0], api_samr_rpc ); - - return msrpc_main(argc, argv); -} diff --git a/source3/script/mysql_convert.pl b/source3/script/mysql_convert.pl deleted file mode 100644 index 1479ce62b7..0000000000 --- a/source3/script/mysql_convert.pl +++ /dev/null @@ -1,433 +0,0 @@ -#!/bin/env perl -# -# MYSQL Convert - Creates and initialises mysql tables for use by samba -# -# Copyright (C) Benjamin Kuit 1999, -# Copyright (C) Andrew Tridgell 1992-1999, -# Copyright (C) Luke Kenneth Casson Leighton 1996-1998, -# -# 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. -# -# -# Converts smbpasswd files into MySQL tables. -# Can understand Samba 1.19 and Samba 2.0 file formats. -# Assumes table structure: -# unix_name char(20) not null, -# unix_uid int(10) unsigned not null, -# nt_name char(20) not null, -# user_rid int(10) unsigned not null, -# smb_passwd char(32), -# smb_nt_passwd char(32), -# acct_ctrl int(10) unsigned not null, -# pass_last_set_time int(10) unsigned not null, -# unique (unix_name), -# unique (unix_uid) -# When given the --create option, mysql_convert will generate this -# statement. -# -# To move from flat file smbpasswd directly into a mysql table: -# -# mysql_convert.pl --db=samba --table=smbpasswd --user=samba --create --infile=smbpasswd -# -# Assumes mysql server on localhost, use --host if otherwise. -# To convert back to flat file: -# -# mysql_convert.pl --db=samba --table=smbpasswd --user=samba --outfile=smbpasswd -# -# If smbpasswd file already exists, use --file=append or --file=trash -# to determine whether to append or over-right the file. -# -# In converting from NT Server PDC to Samba PDC: -# Run pwdump on NT Server to generate an smbpasswd file (Samba 1.19 format), -# called say NTpasslist. -# then: -# -# mysql_convert.pl --db=samba --table=smbpasswd --user=samba --infile=NTpasslist --create --check -# -# The --check option will change the unix_uid field to the real uid -# value of respective users, also filter out users that dont exist on -# the system. -# -# If dont have mysql perl module: -# -# mysql_convert.pl --table=smbpasswd --infile=NTpasslist --outfile=mysql.txt -# -# Then use the mysql client: -# -# mysql -u samba < mysql.txt -# - -$ACB_DISABLED=0x0001; -$ACB_HOMDIRREQ=0x0002; -$ACB_PWNOTREQ=0x0004; -$ACB_TEMPDUP=0x0008; -$ACB_NORMAL=0x0010; -$ACB_MNS=0x0020; -$ACB_DOMTRUST=0x0040; -$ACB_WSTRUST=0x0080; -$ACB_SVRTRUST=0x0100; -$ACB_PWNOEXP=0x0200; -$ACB_AUTOLOCK=0x0400; - -sub getoptionval { - my ($option) = @_; - - my ($value) = ($option =~ /^[^=]+=\s*(\S.*\S)\s*$/ ); - - return $value; -} - -sub usage { - -print <<EOUSAGE; -$0 [options] -options: - --infile=<filename> # smbpasswd style file to read entries from - --outfile=<filename> # file to dump results to, format depending - # on --infile: - # With --infile: Dump mysql script queries - # Without --infile: Dump smbpasswd format - # from reading mysql database - --host=<hostname> # Mysql Server name (default: localhost) - --db=<database> # Mysql Database name - --user=<user> # Mysql User - --password[=<password>] # Mysql password for --user - --table=<table> # Mysql table - --create # Generate 'create table' query - --file=[trash|append] # Action to take if --outfile file exists - --check # Do not alter or skip bad uids - -EOUSAGE -exit 0; -} - -sub getpass { - my($prompt)=@_; - my($ret); - - print $prompt; - system "stty -echo"; - chomp($ret=<STDIN>); - system "stty echo"; - print "\n"; - $ret; -} - -sub next_entry { - my ($name,$uid,$lm,$nt,$f,$lct) = (); - - $name=""; - if ( not $infile ) { - ($name,$uid,$lm,$nt,$f,$lct) = $mysqlquery->fetchrow(); - } - else { - my $line=<INFILE>; - - return () if ( not $line ); - - chomp($line); - - next if ( $line !~ /^[^: ]+:\d+:/ ); - - ($name,$uid,$lm,$nt,$f,$lct) = split(/:/,$line); - - if ( $lct =~ /^LCT-/ ) { - # New Format smbpasswd file - my $flags=0; - - $flags |= $ACB_PWNOTREQ if ( $f =~ /N/ ); - $flags |= $ACB_DISABLED if ( $f =~ /D/ ); - $flags |= $ACB_HOMDIRREQ if ( $f =~ /H/ ); - $flags |= $ACB_TEMPDUP if ( $f =~ /T/ ); - $flags |= $ACB_NORMAL if ( $f =~ /U/ ); - $flags |= $ACB_MNS if ( $f =~ /M/ ); - $flags |= $ACB_WSTRUST if ( $f =~ /W/ ); - $flags |= $ACB_SVRTRUST if ( $f =~ /S/ ); - $flags |= $ACB_AUTOLOCK if ( $f =~ /L/ ); - $flags |= $ACB_PWNOEXP if ( $f =~ /X/ ); - $flags |= $ACB_DOMTRUST if ( $f =~ /I/ ); - - $f = $flags; - - $f = $ACB_NORMAL if ( not $f ); - - $lct =~ s/LCT-//; - $lct = (unpack("L",pack("H8",$lct)))[0]; - } - else { - # Old Format smbpasswd file - $f = 0; - $lct = time(); - if ( $lm =~ /^NO PASS/ ) { - $f |= $ACB_PWNOTREQ; - $lm = ""; - $nt = ""; - } - elsif ( $lm =~ /^XX/ ) { - $f |= $ACB_DISABLED; - - $lm = ""; - $nt = ""; - } - - if ( $name =~ /\$$/ ) { - $f |= $ACB_WSTRUST; - } - - $f = $ACB_NORMAL if ( not $f ); - } - } - return () if ( not $name ); - ($name,$uid,$lm,$nt,$f,$lct); -} - -sub do_query { - my ( $query ) = @_; - - chomp($query); - if ( $outfile ) { - print OUTFILE "$query;\n"; - } - else { - if ( not $mysqldb->query($query) ) { - print "$query: $Mysql::db_errstr\n"; - } - } -} - -sub do_file { - my ($file,$name,$uid,$lm,$nt,$f,$lct)=@_; - - my $strings = ""; - - $strings .= "N" if ( $f & $ACB_PWNOTREQ ); - $strings .= "D" if ( $f & $ACB_DISABLED ); - $strings .= "H" if ( $f & $ACB_HOMDIRREQ ); - $strings .= "T" if ( $f & $ACB_TEMPDUP ); - $strings .= "U" if ( $f & $ACB_NORMAL ); - $strings .= "M" if ( $f & $ACB_MNS ); - $strings .= "W" if ( $f & $ACB_WSTRUST ); - $strings .= "S" if ( $f & $ACB_SVRTRUST ); - $strings .= "L" if ( $f & $ACB_AUTOLOCK ); - $strings .= "X" if ( $f & $ACB_PWNOEXP ); - $strings .= "I" if ( $f & $ACB_DOMTRUST ); - - $f = sprintf( "[%-11s]", $strings ); - - $lct=uc("LCT-".(unpack("H8",pack("L","$lct")))[0]); - - $lm = "X"x32 if ( not $lm ); - $nt = "X"x32 if ( not $nt ); - - print $file "$name:$uid:$lm:$nt:$f:$lct\n"; -} - -$dbhost = "localhost"; - -for $option ( @ARGV ) { - if ( $option =~ /--outfile=/ ) { - $outfile = getoptionval($option); - } - elsif ( $option =~ /--infile=/ ) { - $infile = getoptionval($option); - } - elsif ( $option =~ /--db=/ ) { - $dbname = getoptionval($option); - } - elsif ( $option =~ /--user=/ ) { - $dbuser = getoptionval($option); - } - elsif ( $option =~ /--host=/ ) { - $dbhost = getoptionval($option); - } - elsif ( $option =~ /--password/ ) { - $dbpasswd = getoptionval($option); - $need_password = "yes" - } - elsif ( $option =~ /--table=/ ) { - $dbtable = getoptionval($option); - } - elsif ( $option =~ /--create/ ) { - $create_table = "yes"; - } - elsif ( $option =~ /--file=/ ) { - $file_action = getoptionval($option); - } - elsif ( $option =~ /--check/ ) { - $check = "yes"; - } - else { - print "Unknown option: $option\n"; - $unknown = "yes"; - } -} - -&usage if ( $unknown eq "yes" ); - -if ( ( not $infile ) && ( not $outfile ) && ( $create_table ne "yes" ) ) { - print "Need file to read from or write to\n"; - &usage; -} -elsif ( $infile && $outfile ) { - if ( not $dbtable ) { - print "Need --table to create queries\n"; - exit 1; - } - - # Reading a smbpasswd file, dumping queries into an file which - # can be used for a mysql script - # --db* options are ignored. - - $ignored = ""; - $ignored .= " --db" if ( $dbname ); - $ignored .= " --user" if ( $dbuser ); - $ignored .= " --password" if ( $dbuser ); - - if ( $ignored ) { - print "Ignoring options: $ignored\n"; - } -} -elsif ( (not $dbname) || (not $dbtable) || (not $dbuser) ) { - print "Missing database particulars:\n"; - print " --db=??\n" if ( not $dbname ); - print " --user=??\n" if ( not $dbuser ); - print " --table=??\n" if ( not $dbtable ); - &usage; -} -else { - use Mysql; - - if ( ($need_password eq "yes") && ( not $dbpasswd )) { - $dbpasswd = getpass("Enter MySQL password for $dbuser: "); - } - $mysqldb = Connect Mysql($dbhost,$dbname,$dbuser,$dbpasswd); - - if ( not $mysqldb ) { - print "Cannot connect to database: $Mysql::db_errstr\n"; - exit 1; - } - - if ( $outfile ) { - $mysqlquery = $mysqldb->query("select unix_name,unix_uid,smb_passwd,smb_nt_passwd,acct_ctrl,pass_last_set_time from $dbtable"); - - if ( not $mysqlquery ) { - print "MySQL Query failed: $Mysql::db_errstr\n"; - exit 1; - } - } -} - -if ( $create_table eq "yes" ) { - $create_table_query=<<EOSQL; -create table $dbtable ( -unix_name char(20) not null, -unix_uid int(10) unsigned not null, -nt_name char(20) not null, -user_rid int(10) unsigned not null, -smb_passwd char(32), -smb_nt_passwd char(32), -acct_ctrl int(10) unsigned not null, -pass_last_set_time int(10) unsigned not null, -unique (unix_name), -unique (unix_uid) -) -EOSQL - print "$create_table_query\n"; -} -if ( $infile ) { - if ( not open(INFILE,$infile) ) { - print "$infile: $!\n"; - exit 1; - } -} - -if ( $outfile ) { - if ( ! -f $outfile ) { - $open_string=">$outfile"; - } - elsif ( not $file_action ) { - print "File $outfile exists:\n"; - print "Please use --file=[trash|append] option to determine destiny of file\n"; - exit 1; - } - elsif ( $file_action eq "append" ) { - $open_string = ">>$outfile"; - } - else { - $open_string = ">$outfile"; - } - - if ( not open(OUTFILE,$open_string) ) { - print "$outfile: $!\n"; - exit 1; - } -} - -do_query($create_table_query) if ( $create_table_query ); - -$linenum=1; -while (($name,$uid,$lm,$nt,$f,$lct)=next_entry()) { - - $| = 1; - print "\r$linenum "; - $linenum++; - - $nuid = ""; - - $nuid = (getpwnam(lc($name)))[2]; - - if ( $check ) { - if ( not $nuid ) { - # print "Removing $name: Does not exist\n"; - push(@removed,[$name,$uid,$lm,$nt,$f,$lct]); - next; - } - else { - # print "Changing uid of $name\n"; - $uid = $nuid; - } - } - - if ( $infile ) { - if ( $lm ) { - $lm = "'$lm'"; - } - else { - $lm = "NULL"; - } - if ( $nt ) { - $nt = "'$nt'"; - } - else { - $nt = "NULL"; - } - $rid=(4*$uid)+1000; - do_query("insert into $dbtable (unix_name,unix_uid,smb_passwd,smb_nt_passwd,acct_ctrl,pass_last_set_time,nt_name,user_rid) values ('$name',$uid,$lm,$nt,$f,$lct,'$name',$rid)"); - } - else { - do_file(OUTFILE,$name,$uid,$lm,$nt,$f,$lct); - } -} - -if ( @removed ) { - print "\n\nIgnored entries because usernames do not exist\n"; - foreach $line ( @removed ) { - do_file(STDOUT,@{ $line }); - } -} - -close (OUTFILE) if ( $outfile ); -close (INFILE) if ( $infile ); -print "\n"; diff --git a/source3/smbd/challenge.c b/source3/smbd/challenge.c deleted file mode 100644 index cbb34e6395..0000000000 --- a/source3/smbd/challenge.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Password and authentication handling - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -extern int DEBUGLEVEL; - -/* Data to do lanman1/2 password challenge. */ -static unsigned char saved_challenge[8]; -static BOOL challenge_sent=False; - -/******************************************************************* -Get the next challenge value - no repeats. -********************************************************************/ -void generate_next_challenge(char *challenge) -{ - unsigned char buf[8]; - generate_random_buffer(buf,8,False); - memcpy(saved_challenge, buf, 8); - memcpy(challenge,buf,8); - challenge_sent = True; -} - -/******************************************************************* -set the last challenge sent, usually from a password server -********************************************************************/ -BOOL set_challenge(unsigned char *challenge) -{ - memcpy(saved_challenge,challenge,8); - challenge_sent = True; - return(True); -} - -/******************************************************************* -get the last challenge sent -********************************************************************/ -BOOL last_challenge(unsigned char *challenge) -{ - if (!challenge_sent) return False; - memcpy(challenge,saved_challenge,8); - return(True); -} - diff --git a/source3/smbd/dfs.c b/source3/smbd/dfs.c deleted file mode 100644 index 55433f2c47..0000000000 --- a/source3/smbd/dfs.c +++ /dev/null @@ -1,255 +0,0 @@ - -#include "includes.h" - -extern int DEBUGLEVEL; - -dfs_internal dfs_struct; -extern pstring global_myname; - -/**************************************************************************** -read a line and split it -****************************************************************************/ -static BOOL parse_dfs_text_entry(char *line, dfs_internal_table *buf) -{ -#define MAXTOK 4 - char *tok[MAXTOK+1]; - int count = 0; - - tok[count] = strtok(line,":"); - - /* strip the comment lines */ - if (tok[0][0] == '#') return (False); - count++; - - while ( ((tok[count] = strtok(NULL,":")) != NULL ) && count < MAXTOK) - { - count++; - } - - DEBUG(7,("Found [%d] tokens\n", count)); - - if (count > 1) { - StrnCpy(buf->localpath, tok[0], sizeof(buf->localpath)-1); - StrnCpy(buf->sharename, tok[1], sizeof(buf->sharename)-1); -/* - strupper(buf->localpath); - strupper(buf->sharename); -*/ - buf->localpath_length = strlen(buf->localpath); - buf->sharename_length = strlen(buf->sharename); - } - else - return (False); - - if (count > 2) - buf->proximity = atoi(tok[2]); - else - buf->proximity = 0; - - if (count > 3) - buf->type = atoi(tok[3]); - else - buf->type = 2; - - DEBUGADD(7,("localpath: [%s]\n", buf->localpath)); - DEBUGADD(7,("sharename: [%s]\n", buf->sharename)); - return True; -} - -/**************************************************************************** -mangle the localpath and store it. -****************************************************************************/ -static void mangle_dfs_path(dfs_internal_table *buf) -{ - char *p; - char *mp; - char *q; - int mlen; - - fstring temp; - - p = buf->localpath; - mp = buf->mangledpath; - mlen = sizeof(buf->mangledpath); - - ZERO_STRUCTP(mp); - DEBUG(2, ("DFS name is: [%s]\n", buf->localpath)); - - /* copy the head: \server-name\ */ - q = strchr(p + 1, '\\'); - safe_strcpy(mp, p, mlen); - p = q + 1; - - while (q != NULL) - { - q = strchr(p, '\\'); - - safe_strcpy(temp, p, sizeof(temp)); - - if (!is_8_3(temp, True)) - { - mangle_name_83(temp); - } - - safe_strcat(mp, temp, mlen); - - if (q != NULL) - { - safe_strcat(mp, "\\", mlen); - } - p = q + 1; - } - -/* - strupper(mp); -*/ - buf->mangledpath_length = strlen(mp); - DEBUGADD(2, ("DFS mangled name is: [%s]\n", mp)); -} - -/**************************************************************************** -initialisation de la table dfs en memoire au demarrage de samba -****************************************************************************/ -BOOL init_dfs_table(void) -{ - char *file = lp_dfs_map(); - int num_lines = 0; - int total = 0; - FILE *f; - pstring line; - int i; - - dfs_internal_table *entry; - - entry = NULL; - dfs_struct.ready = False; - - if (*file == '\0') { - DEBUG(0,("No DFS map, Samba is running in NON DFS mode\n")); - return False; - } - - f = sys_fopen(file, "r"); - if (!f) { - DEBUG(0,("No DFS map file, Samba is running in NON DFS mode\n")); - return False; - } - - while ( fgets(line, sizeof(pstring), f) ) - { - entry = Realloc(entry,sizeof(dfs_internal_table)*(total+1)); - if (! entry) - { - total = 0; - break; - } - - if ( parse_dfs_text_entry(line, &(entry[total]) ) ) - { - total++; - } - num_lines++; - } - dfs_struct.size = total; - dfs_struct.table = entry; - fclose(f); - - /* we have the file in memory */ - /* now initialise the mangled names */ - for (i = 0; i < total; i++) - { - mangle_dfs_path(&(entry[i])); - } - - dfs_struct.ready = True; - DEBUG(0,("Samba is DFS aware now!\n")); - return True; -} - -static BOOL check_dfs_path(int search_len, const char *search_path, - int path_len, const char* fullpath, - const char* sharename, - const char* share_path, size_t share_len, - char *localpath, size_t local_plen) -{ - if (StrnCaseCmp(search_path, fullpath, search_len) != 0) - { - return False; - } - - DEBUG(2,("found one linked to [%s]. share_path: %s\n", - sharename, share_path)); - - if (StrnCaseCmp(fullpath, share_path, share_len) == 0) - { - safe_strcpy(localpath, fullpath + share_len, local_plen); - } - else - { - localpath[0] = 0; - } - - return True; -} - -/**************************************************************************** - check if a path name is a DFS branch -****************************************************************************/ -int under_dfs(connection_struct *conn, const char *path, - char *local_path, size_t local_plen) -{ - fstring fullpath; - pstring share_path; - int i; - int snum; - - int path_len; - int share_len; - - dfs_internal_table *list = dfs_struct.table; - - snum = SNUM(conn); - snprintf(share_path, sizeof(share_path), "\\%s\\%s", - global_myname, lp_servicename(snum)); - share_len = strlen(share_path); - - if (path[0] != '\\') - { - snprintf(fullpath, sizeof(fullpath), "%s\\%s", - share_path, path); - } - else - { - safe_strcpy(fullpath, path, sizeof(fullpath)); - } - - path_len = strlen(fullpath); - - DEBUG(2,("DFS looking for: [%s]\n", fullpath)); - - for (i = 0; i < dfs_struct.size; i++) - { - DEBUG(6,("checking against [%s][%d]\n", list[i].localpath,i)); - - if (check_dfs_path(list[i].localpath_length, - list[i].localpath, - path_len, fullpath, - list[i].sharename, - share_path, share_len, - local_path, local_plen)) - { - return True; - } - - if (check_dfs_path(list[i].mangledpath_length, - list[i].mangledpath, - path_len, fullpath, - list[i].sharename, - share_path, share_len, - local_path, local_plen)) - { - return True; - } - } - return False; -} diff --git a/source3/smbd/vfs-wrap.c b/source3/smbd/vfs-wrap.c deleted file mode 100644 index 3493c23178..0000000000 --- a/source3/smbd/vfs-wrap.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Wrap disk only vfs functions to sidestep dodgy compilers. - Copyright (C) Tim Potter 1998 - - 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" - -/* Check for NULL pointer parameters in vfswrap_* functions */ - -#define VFS_CHECK_NULL - -/* We don't want to have NULL function pointers lying around. Someone - is sure to try and execute them. These stubs are used to prevent - this possibility. */ - -int vfswrap_dummy_connect(struct vfs_connection_struct *conn, char *service, - char *user) -{ - return 0; /* Return >= 0 for success */ -} - -void vfswrap_dummy_disconnect(void) -{ -} - -/* Disk operations */ - -SMB_BIG_UINT vfswrap_disk_free(char *path, SMB_BIG_UINT *bsize, - SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize) -{ - SMB_BIG_UINT result; - -#ifdef VFS_CHECK_NULL - if ((path == NULL) || (bsize == NULL) || (dfree == NULL) || - (dsize == NULL)) { - - smb_panic("NULL pointer passed to vfswrap_disk_free() function\n"); - } -#endif - - result = sys_disk_free(path, bsize, dfree, dsize); - return result; -} - -/* Directory operations */ - -DIR *vfswrap_opendir(char *fname) -{ - DIR *result; - -#ifdef VFS_CHECK_NULL - if (fname == NULL) { - smb_panic("NULL pointer passed to vfswrap_opendir()\n"); - } -#endif - - result = opendir(fname); - return result; -} - -struct dirent *vfswrap_readdir(DIR *dirp) -{ - struct dirent *result; - -#ifdef VFS_CHECK_NULL - if (dirp == NULL) { - smb_panic("NULL pointer passed to vfswrap_readdir()\n"); - } -#endif - - result = readdir(dirp); - return result; -} - -int vfswrap_mkdir(char *path, mode_t mode) -{ - int result; - -#ifdef VFS_CHECK_NULL - if (path == NULL) { - smb_panic("NULL pointer passed to vfswrap_mkdir()\n"); - } -#endif - - result = mkdir(path, mode); - return result; -} - -int vfswrap_rmdir(char *path) -{ - int result; - -#ifdef VFS_CHECK_NULL - if (path == NULL) { - smb_panic("NULL pointer passed to vfswrap_rmdir()\n"); - } -#endif - - result = rmdir(path); - return result; -} - -int vfswrap_closedir(DIR *dirp) -{ - int result; - -#ifdef VFS_CHECK_NULL - if (dirp == NULL) { - smb_panic("NULL pointer passed to vfswrap_closedir()\n"); - } -#endif - - result = closedir(dirp); - return result; -} - -/* File operations */ - -int vfswrap_open(char *fname, int flags, mode_t mode) -{ - int result; - -#ifdef VFS_CHECK_NULL - if (fname == NULL) { - smb_panic("NULL pointer passed to vfswrap_open()\n"); - } -#endif - - result = sys_open(fname, flags, mode); - return result; -} - -int vfswrap_close(int fd) -{ - int result; - - result = close(fd); - return result; -} - -ssize_t vfswrap_read(int fd, char *data, size_t n) -{ - ssize_t result; - -#ifdef VFS_CHECK_NULL - if (data == NULL) { - smb_panic("NULL pointer passed to vfswrap_read()\n"); - } -#endif - - result = read(fd, data, n); - return result; -} - -ssize_t vfswrap_write(int fd, char *data, size_t n) -{ - ssize_t result; - -#ifdef VFS_CHECK_NULL - if (data == NULL) { - smb_panic("NULL pointer passed to vfswrap_write()\n"); - } -#endif - - result = write(fd, data, n); - return result; -} - -SMB_OFF_T vfswrap_lseek(int filedes, SMB_OFF_T offset, int whence) -{ - SMB_OFF_T result; - - result = sys_lseek(filedes, offset, whence); - return result; -} - -int vfswrap_rename(char *old, char *new) -{ - int result; - -#ifdef VFS_CHECK_NULL - if ((old == NULL) || (new == NULL)) { - smb_panic("NULL pointer passed to vfswrap_rename()\n"); - } -#endif - - result = rename(old, new); - return result; -} - -void vfswrap_sync_file(int fd) -{ - sys_sync_file(fd); -} - -int vfswrap_stat(char *fname, SMB_STRUCT_STAT *sbuf) -{ - int result; - -#ifdef VFS_CHECK_NULL - if ((fname == NULL) || (sbuf == NULL)) { - smb_panic("NULL pointer passed to vfswrap_stat()\n"); - } -#endif - - result = sys_stat(fname, sbuf); - return result; -} - -int vfswrap_fstat(int fd, SMB_STRUCT_STAT *sbuf) -{ - int result; - -#ifdef VFS_CHECK_NULL - if (sbuf == NULL) { - smb_panic("NULL pointer passed to vfswrap_fstat()\n"); - } -#endif - - result = sys_fstat(fd, sbuf); - return result; -} - -int vfswrap_lstat(char *path, - SMB_STRUCT_STAT *sbuf) -{ - int result; - -#ifdef VFS_CHECK_NULL - if ((path == NULL) || (sbuf == NULL)) { - smb_panic("NULL pointer passed to vfswrap_lstat()\n"); - } -#endif - - result = sys_lstat(path, sbuf); - return result; -} - -BOOL vfswrap_fcntl_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, - int type) -{ - BOOL result; - - result = fcntl_lock(fd, op, offset, count, type); - return result; -} - -int vfswrap_unlink(char *path) -{ - int result; - -#ifdef VFS_CHECK_NULL - if (path == NULL) { - smb_panic("NULL pointer passed to vfswrap_unlink()\n"); - } -#endif - - result = unlink(path); - return result; -} - -int vfswrap_chmod(char *path, mode_t mode) -{ - int result; - -#ifdef VFS_CHECK_NULL - if (path == NULL) { - smb_panic("NULL pointer passed to vfswrap_chmod()\n"); - } -#endif - - result = chmod(path, mode); - return result; -} - -int vfswrap_utime(char *path, struct utimbuf *times) -{ - int result; - -#ifdef VFS_CHECK_NULL - if ((path == NULL) || (times == NULL)) { - smb_panic("NULL pointer passed to vfswrap_utime()\n"); - } -#endif - - result = utime(path, times); - return result; -} diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c deleted file mode 100644 index 95bb4c9414..0000000000 --- a/source3/smbd/vfs.c +++ /dev/null @@ -1,379 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - VFS initialisation and support functions - Copyright (C) Tim Potter 1999 - - 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" -#ifdef HAVE_LIBDL -#include <dlfcn.h> -#endif - -extern int DEBUGLEVEL; - -/* Some structures to help us initialise the vfs operations table */ - -struct vfs_syminfo { - char *name; - void *fptr; -}; - -/* Default vfs hooks. WARNING: The order of these initialisers is - very important. They must be in the same order as defined in - vfs.h. Change at your own peril. */ - -struct vfs_ops default_vfs_ops = { - - /* Disk operations */ - - vfswrap_dummy_connect, - vfswrap_dummy_disconnect, - vfswrap_disk_free, - - /* Directory operations */ - - vfswrap_opendir, - vfswrap_readdir, - vfswrap_mkdir, - vfswrap_rmdir, - vfswrap_closedir, - - /* File operations */ - - vfswrap_open, - vfswrap_close, - vfswrap_read, - vfswrap_write, - vfswrap_lseek, - vfswrap_rename, - vfswrap_sync_file, - vfswrap_stat, - vfswrap_fstat, - vfswrap_lstat, - vfswrap_fcntl_lock, - vfswrap_unlink, - vfswrap_chmod, - vfswrap_utime -}; - -/**************************************************************************** - initialise default vfs hooks -****************************************************************************/ -int vfs_init_default(connection_struct *conn) -{ - DEBUG(3, ("Initialising default vfs hooks\n")); - - memcpy(&conn->vfs_ops, &default_vfs_ops, sizeof(conn->vfs_ops)); - return True; -} - -/**************************************************************************** - initialise custom vfs hooks -****************************************************************************/ -#ifdef HAVE_LIBDL -BOOL vfs_init_custom(connection_struct *conn) -{ - void *handle; - struct vfs_ops *ops, *(*fptr)(struct vfs_options *options); - - DEBUG(3, ("Initialising custom vfs hooks from %s\n", - lp_vfsobj(SNUM(conn)))); - - /* Open object file */ - - handle = dlopen(lp_vfsobj(SNUM(conn)), RTLD_NOW); - if (!handle) { - DEBUG(0, ("Error opening %s: %s\n", lp_vfsobj(SNUM(conn)), - dlerror())); - return False; - } - - /* Get handle on vfs_init() symbol */ - - fptr = dlsym(handle, "vfs_init"); - if (fptr == NULL) { - DEBUG(0, ("No vfs_init() symbol found in %s\n", - lp_vfsobj(SNUM(conn)))); - return False; - } - - dlclose(handle); - - /* Initialise vfs_ops structure */ - - if ((ops = fptr(lp_vfsoptions(SNUM(conn)))) == NULL) { - return False; - } - - /* Fill in unused operations with default (disk based) ones. - There's probably a neater way to do this then a whole bunch of - if statements. */ - - memcpy(&conn->vfs_ops, ops, sizeof(conn->vfs_ops)); - - if (conn->vfs_ops.connect == NULL) { - conn->vfs_ops.connect = default_vfs_ops.connect; - } - - if (conn->vfs_ops.disconnect == NULL) { - conn->vfs_ops.disconnect = default_vfs_ops.disconnect; - } - - if (conn->vfs_ops.disk_free == NULL) { - conn->vfs_ops.disk_free = default_vfs_ops.disk_free; - } - - if (conn->vfs_ops.opendir == NULL) { - conn->vfs_ops.opendir = default_vfs_ops.opendir; - } - - if (conn->vfs_ops.readdir == NULL) { - conn->vfs_ops.readdir = default_vfs_ops.readdir; - } - - if (conn->vfs_ops.mkdir == NULL) { - conn->vfs_ops.mkdir = default_vfs_ops.mkdir; - } - - if (conn->vfs_ops.rmdir == NULL) { - conn->vfs_ops.rmdir = default_vfs_ops.rmdir; - } - - if (conn->vfs_ops.closedir == NULL) { - conn->vfs_ops.closedir = default_vfs_ops.closedir; - } - - if (conn->vfs_ops.open == NULL) { - conn->vfs_ops.open = default_vfs_ops.open; - } - - if (conn->vfs_ops.close == NULL) { - conn->vfs_ops.close = default_vfs_ops.close; - } - - if (conn->vfs_ops.read == NULL) { - conn->vfs_ops.read = default_vfs_ops.read; - } - - if (conn->vfs_ops.write == NULL) { - conn->vfs_ops.write = default_vfs_ops.write; - } - - if (conn->vfs_ops.lseek == NULL) { - conn->vfs_ops.lseek = default_vfs_ops.lseek; - } - - if (conn->vfs_ops.rename == NULL) { - conn->vfs_ops.rename = default_vfs_ops.rename; - } - - if (conn->vfs_ops.sync == NULL) { - conn->vfs_ops.sync = default_vfs_ops.sync; - } - - if (conn->vfs_ops.stat == NULL) { - conn->vfs_ops.stat = default_vfs_ops.stat; - } - - if (conn->vfs_ops.fstat == NULL) { - conn->vfs_ops.fstat = default_vfs_ops.fstat; - } - - if (conn->vfs_ops.lstat == NULL) { - conn->vfs_ops.lstat = default_vfs_ops.lstat; - } - - if (conn->vfs_ops.lock == NULL) { - conn->vfs_ops.lock = default_vfs_ops.lock; - } - - if (conn->vfs_ops.unlink == NULL) { - conn->vfs_ops.unlink = default_vfs_ops.unlink; - } - - if (conn->vfs_ops.chmod == NULL) { - conn->vfs_ops.chmod = default_vfs_ops.chmod; - } - - if (conn->vfs_ops.utime == NULL) { - conn->vfs_ops.utime = default_vfs_ops.utime; - } - - return True; -} -#endif - -/******************************************************************* - check if a vfs file exists -********************************************************************/ -BOOL vfs_file_exist(connection_struct *conn,char *fname,SMB_STRUCT_STAT *sbuf) -{ - SMB_STRUCT_STAT st; - if (!sbuf) sbuf = &st; - - if (conn->vfs_ops.stat(fname,sbuf) != 0) - return(False); - - return(S_ISREG(sbuf->st_mode)); -} - -/**************************************************************************** - write data to a fd on the vfs -****************************************************************************/ -ssize_t vfs_write_data(files_struct *fsp,char *buffer,size_t N) -{ - size_t total=0; - ssize_t ret; - int fd = fsp->fd_ptr->fd; - - while (total < N) - { - ret = fsp->conn->vfs_ops.write(fd,buffer + total,N - total); - - if (ret == -1) return -1; - if (ret == 0) return total; - - total += ret; - } - return (ssize_t)total; -} - -/**************************************************************************** -transfer some data between two file_struct's -****************************************************************************/ -SMB_OFF_T vfs_transfer_file(int in_fd, files_struct *in_fsp, - int out_fd, files_struct *out_fsp, - SMB_OFF_T n, char *header, int headlen, int align) -{ - static char *buf=NULL; - static int size=0; - char *buf1,*abuf; - SMB_OFF_T total = 0; - - DEBUG(4,("vfs_transfer_file n=%.0f (head=%d) called\n",(double)n,headlen)); - - /* Check we have at least somewhere to read from */ - - SMB_ASSERT((in_fd != -1) || (in_fsp != NULL)); - - if (size == 0) { - size = lp_readsize(); - size = MAX(size,1024); - } - - while (!buf && size>0) { - buf = (char *)Realloc(buf,size+8); - if (!buf) size /= 2; - } - - if (!buf) { - DEBUG(0,("Can't allocate transfer buffer!\n")); - exit(1); - } - - abuf = buf + (align%8); - - if (header) - n += headlen; - - while (n > 0) - { - int s = (int)MIN(n,(SMB_OFF_T)size); - int ret,ret2=0; - - ret = 0; - - if (header && (headlen >= MIN(s,1024))) { - buf1 = header; - s = headlen; - ret = headlen; - headlen = 0; - header = NULL; - } else { - buf1 = abuf; - } - - if (header && headlen > 0) - { - ret = MIN(headlen,size); - memcpy(buf1,header,ret); - headlen -= ret; - header += ret; - if (headlen <= 0) header = NULL; - } - - if (s > ret) { - ret += in_fsp ? - in_fsp->conn->vfs_ops.read(in_fsp->fd_ptr->fd,buf1+ret,s-ret) : read(in_fd,buf1+ret,s-ret); - } - - if (ret > 0) - { - if (out_fsp) { - ret2 = out_fsp->conn->vfs_ops.write(out_fsp->fd_ptr->fd,buf1,ret); - } else { - ret2= (out_fd != -1) ? write_data(out_fd,buf1,ret) : ret; - } - } - - if (ret2 > 0) total += ret2; - /* if we can't write then dump excess data */ - if (ret2 != ret) - vfs_transfer_file(in_fd, in_fsp, -1,NULL,n-(ret+headlen),NULL,0,0); - - if (ret <= 0 || ret2 != ret) - return(total); - n -= ret; - } - return(total); -} - -/******************************************************************* -a vfs_readdir wrapper which just returns the file name -********************************************************************/ -char *vfs_readdirname(connection_struct *conn, void *p) -{ - struct dirent *ptr; - char *dname; - - if (!p) return(NULL); - - ptr = (struct dirent *)conn->vfs_ops.readdir(p); - if (!ptr) return(NULL); - - dname = ptr->d_name; - -#ifdef NEXT2 - if (telldir(p) < 0) return(NULL); -#endif - -#ifdef HAVE_BROKEN_READDIR - /* using /usr/ucb/cc is BAD */ - dname = dname - 2; -#endif - - { - static pstring buf; - memcpy(buf, dname, NAMLEN(ptr)+1); - unix_to_dos(buf, True); - dname = buf; - } - - unix_to_dos(dname, True); - return(dname); -} diff --git a/source3/spoolssd/spoolssd.c b/source3/spoolssd/spoolssd.c deleted file mode 100644 index 7ea5195009..0000000000 --- a/source3/spoolssd/spoolssd.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Main SMB server routines - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -fstring pipe_name; - -pstring servicesf = CONFIGFILE; -extern pstring debugf; -extern BOOL append_log; - -/************************************************************************* - initialise an msrpc service - *************************************************************************/ -void msrpc_service_init(void) -{ - init_printer_hnd(); /* for SPOOLSS handles */ -} - -/**************************************************************************** - reload the services file - **************************************************************************/ -BOOL reload_services(BOOL test) -{ - BOOL ret; - - if (lp_loaded()) { - pstring fname; - pstrcpy(fname,lp_configfile()); - if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) { - pstrcpy(servicesf,fname); - test = False; - } - } - - reopen_logs(); - - if (test && !lp_file_list_changed()) - return(True); - - lp_killunused(NULL); - - ret = lp_load(servicesf,False,False,True); - - load_printers(); - - /* perhaps the config filename is now set */ - if (!test) - reload_services(True); - - reopen_logs(); - - load_interfaces(); - - return(ret); -} - -/**************************************************************************** - main program -****************************************************************************/ - int main(int argc,char *argv[]) -{ -#ifdef HAVE_SET_AUTH_PARAMETERS - set_auth_parameters(argc,argv); -#endif - -#ifdef HAVE_SETLUID - /* needed for SecureWare on SCO */ - setluid(0); -#endif - - append_log = True; - - TimeInit(); - - setup_logging(argv[0],False); - fstrcpy(pipe_name, "spoolss"); - slprintf(debugf, sizeof(debugf), "%s/log.%s", LOGFILEBASE, pipe_name); - add_msrpc_command_processor( pipe_name, argv[0], api_spoolss_rpc ); - - return msrpc_main(argc, argv); -} diff --git a/source3/srvsvcd/srvsvcd.c b/source3/srvsvcd/srvsvcd.c deleted file mode 100644 index 78c64a200b..0000000000 --- a/source3/srvsvcd/srvsvcd.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Main SMB server routines - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -fstring pipe_name; - -pstring servicesf = CONFIGFILE; -extern pstring debugf; -extern BOOL append_log; - -/************************************************************************* - initialise an msrpc service - *************************************************************************/ -void msrpc_service_init(void) -{ -} - -/**************************************************************************** - reload the services file - **************************************************************************/ -BOOL reload_services(BOOL test) -{ - BOOL ret; - - if (lp_loaded()) { - pstring fname; - pstrcpy(fname,lp_configfile()); - if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) { - pstrcpy(servicesf,fname); - test = False; - } - } - - reopen_logs(); - - if (test && !lp_file_list_changed()) - return(True); - - lp_killunused(NULL); - - ret = lp_load(servicesf,False,False,True); - - /* perhaps the config filename is now set */ - if (!test) - reload_services(True); - - reopen_logs(); - - load_interfaces(); - - return(ret); -} - -/**************************************************************************** - main program -****************************************************************************/ - int main(int argc,char *argv[]) -{ -#ifdef HAVE_SET_AUTH_PARAMETERS - set_auth_parameters(argc,argv); -#endif - -#ifdef HAVE_SETLUID - /* needed for SecureWare on SCO */ - setluid(0); -#endif - - append_log = True; - - TimeInit(); - - setup_logging(argv[0],False); - fstrcpy(pipe_name, "srvsvc"); - slprintf(debugf, sizeof(debugf), "%s/log.%s", LOGFILEBASE, pipe_name); - add_msrpc_command_processor( pipe_name, argv[0], api_srvsvc_rpc ); - - return msrpc_main(argc, argv); -} diff --git a/source3/svcctld/svcctld.c b/source3/svcctld/svcctld.c deleted file mode 100644 index 95470ad4a4..0000000000 --- a/source3/svcctld/svcctld.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Main SMB server routines - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -fstring pipe_name; - -pstring servicesf = CONFIGFILE; -extern pstring debugf; -extern BOOL append_log; - -/************************************************************************* - initialise an msrpc service - *************************************************************************/ -void msrpc_service_init(void) -{ -} - -/**************************************************************************** - reload the services file - **************************************************************************/ -BOOL reload_services(BOOL test) -{ - BOOL ret; - - if (lp_loaded()) { - pstring fname; - pstrcpy(fname,lp_configfile()); - if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) { - pstrcpy(servicesf,fname); - test = False; - } - } - - reopen_logs(); - - if (test && !lp_file_list_changed()) - return(True); - - lp_killunused(NULL); - - ret = lp_load(servicesf,False,False,True); - - /* perhaps the config filename is now set */ - if (!test) - reload_services(True); - - reopen_logs(); - - load_interfaces(); - - return(ret); -} - -/**************************************************************************** - main program -****************************************************************************/ - int main(int argc,char *argv[]) -{ -#ifdef HAVE_SET_AUTH_PARAMETERS - set_auth_parameters(argc,argv); -#endif - -#ifdef HAVE_SETLUID - /* needed for SecureWare on SCO */ - setluid(0); -#endif - - append_log = True; - - TimeInit(); - - setup_logging(argv[0],False); - fstrcpy(pipe_name, "svcctl"); - slprintf(debugf, sizeof(debugf), "%s/log.%s", LOGFILEBASE, pipe_name); - add_msrpc_command_processor( pipe_name, argv[0], api_svcctl_rpc ); - - return msrpc_main(argc, argv); -} diff --git a/source3/tests/trapdoor.c b/source3/tests/trapdoor.c deleted file mode 100644 index 83e10d0613..0000000000 --- a/source3/tests/trapdoor.c +++ /dev/null @@ -1,25 +0,0 @@ -/* test for a trapdoor uid system */ - -#include <stdlib.h> -#include <unistd.h> -#include <stdio.h> - -main() -{ - if (getuid() != 0) { - fprintf(stderr,"ERROR: This test must be run as root - assuming non-trapdoor system\n"); - exit(0); - } - - if (seteuid(1) != 0) exit(1); - if (geteuid() != 1) exit(1); - if (seteuid(0) != 0) exit(1); - if (geteuid() != 0) exit(1); - - if (setegid(1) != 0) exit(1); - if (getegid() != 1) exit(1); - if (setegid(0) != 0) exit(1); - if (getegid() != 0) exit(1); - - exit(0); -} diff --git a/source3/utils/nmb-agent.c b/source3/utils/nmb-agent.c deleted file mode 100644 index f49983db79..0000000000 --- a/source3/utils/nmb-agent.c +++ /dev/null @@ -1,295 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2 - SMB agent/socket plugin - Copyright (C) Andrew Tridgell 1999 - - 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 "smb.h" - -#define SECURITY_MASK 0 -#define SECURITY_SET 0 - -/* this forces non-unicode */ -#define CAPABILITY_MASK CAP_UNICODE -#define CAPABILITY_SET 0 - -/* and non-unicode for the client too */ -#define CLI_CAPABILITY_MASK CAP_UNICODE -#define CLI_CAPABILITY_SET 0 - -extern int DEBUGLEVEL; - -static int ClientNMB = -1; - -/**************************************************************************** -terminate sockent connection -****************************************************************************/ -static void free_sock(void *sock) -{ - if (sock != NULL) - { - free(sock); - } -} - -static void filter_reply(struct packet_struct *p, int tr_id) -{ - p->packet.nmb.header.name_trn_id = tr_id; -} - -static BOOL process_cli_sock(struct sock_redir **socks, - uint32 num_socks, - struct sock_redir *sock) -{ - struct packet_struct *p; - struct nmb_state *nmb; - static uint16 trn_id = 0x0; - - p = receive_packet(sock->c, NMB_SOCK_PACKET, 0); - if (p == NULL) - { - DEBUG(0,("client closed connection\n")); - return False; - } - - nmb = (struct nmb_state*)malloc(sizeof(struct nmb_state)); - if (nmb == NULL) - { - free_packet(p); - return False; - } - - sock->s = ClientNMB; - sock->n = nmb; - sock->c_id = p->packet.nmb.header.name_trn_id; - sock->s_id = trn_id; - - trn_id++; - if (trn_id > 0xffff) - { - trn_id = 0x0; - } - - DEBUG(10,("new trn_id: %d\n", trn_id)); - - filter_reply(p, sock->s_id); - - nmb->ip = p->ip; - nmb->port = p->port; - - p->fd = ClientNMB; - p->packet_type = NMB_PACKET; - - if (!send_packet(p)) - { - DEBUG(0,("server is dead\n")); - free_packet(p); - return False; - } - free_packet(p); - return True; -} - -static BOOL process_srv_sock(struct sock_redir **socks, - uint32 num_socks, - int fd) -{ - int nmb_id; - int tr_id; - int i; - - struct packet_struct *p; - - p = receive_packet(fd, NMB_PACKET, 0); - if (p == NULL) - { - return True; - } - -#if 0 - if (!p->packet.nmb.header.response) - { - DEBUG(10,("skipping response packet\n")); - free_packet(p); - return True; - } -#endif - - nmb_id = p->packet.nmb.header.name_trn_id; - DEBUG(10,("process_srv_sock:\tnmb_id:\t%d\n", nmb_id)); - - for (i = 0; i < num_socks; i++) - { - if (socks[i] == NULL) - { - continue; - } - - tr_id = socks[i]->s_id; - - DEBUG(10,("list:\tfd:\t%d\tc_id:\t%d\ttr_id:\t%d\n", - socks[i]->c, - socks[i]->c_id, - tr_id)); - - if (nmb_id != tr_id) - { - continue; - } - - filter_reply(p, socks[i]->c_id); - p->fd = socks[i]->c; - p->packet_type = NMB_SOCK_PACKET; - - if (!send_packet(p)) - { - DEBUG(0,("client is dead\n")); - return False; - } - return True; - } - return True; -} - -static int get_agent_sock(char *id) -{ - fstring dir; - fstring path; - - slprintf(dir, sizeof(dir)-1, "/tmp/.nmb"); - slprintf(path, sizeof(path)-1, "%s/agent", dir); - - return create_pipe_socket(dir, 0777, path, 0777); -} - -static void start_nmb_agent(void) -{ - struct vagent_ops va = - { - free_sock, - get_agent_sock, - process_cli_sock, - process_srv_sock, - NULL, - NULL, - 0 - }; - - CatchChild(); - - start_agent(&va); -} - -/****************************************************************************** - open the socket communication - *****************************************************************************/ -static BOOL open_sockets(BOOL isdaemon, int port) -{ - /* The sockets opened here will be used to receive broadcast - packets *only*. Interface specific sockets are opened in - make_subnet() in namedbsubnet.c. Thus we bind to the - address "0.0.0.0". The parameter 'socket address' is - now deprecated. - */ - - if ( isdaemon ) - ClientNMB = open_socket_in(SOCK_DGRAM, port,0,0); - else - ClientNMB = 0; - - if ( ClientNMB == -1 ) - return( False ); - - /* we are never interested in SIGPIPE */ - BlockSignals(True,SIGPIPE); - - set_socket_options( ClientNMB, "SO_BROADCAST" ); - - DEBUG( 3, ( "open_sockets: Broadcast sockets opened.\n" ) ); - return( True ); -} /* open_sockets */ - -/**************************************************************************** -usage on the program -****************************************************************************/ -static void usage(char *pname) -{ - printf("Usage: %s [-D]", pname); - - printf("\nVersion %s\n",VERSION); - printf("\t-D run as a daemon\n"); - printf("\t-h usage\n"); - printf("\n"); -} - -int main(int argc, char *argv[]) -{ - pstring configfile; - BOOL is_daemon = False; - int opt; - extern pstring debugf; - int global_nmb_port = NMB_PORT; - - TimeInit(); - - pstrcpy(configfile,CONFIGFILE); - - while ((opt = getopt(argc, argv, "Dh")) != EOF) - { - switch (opt) - { - case 'D': - { - is_daemon = True; - break; - } - case 'h': - default: - { - usage(argv[0]); - break; - } - } - } - - slprintf(debugf, sizeof(debugf)-1, "log.%s", argv[0]); - setup_logging(argv[0], !is_daemon); - - charset_initialise(); - - if (!lp_load(configfile,True,False,False)) - { - DEBUG(0,("Unable to load config file\n")); - } - - if (is_daemon) - { - DEBUG(0,("%s: becoming daemon\n", argv[0])); - become_daemon(); - } - - if (!open_sockets(True, global_nmb_port)) - { - return 1; - } - - start_nmb_agent(); - - return 0; -} diff --git a/source3/utils/smb-agent.c b/source3/utils/smb-agent.c deleted file mode 100644 index 2ecfdba7e2..0000000000 --- a/source3/utils/smb-agent.c +++ /dev/null @@ -1,385 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 2 - SMB agent/socket plugin - Copyright (C) Andrew Tridgell 1999 - - 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 "smb.h" - -#define SECURITY_MASK 0 -#define SECURITY_SET 0 - -/* this forces non-unicode */ -#define CAPABILITY_MASK CAP_UNICODE -#define CAPABILITY_SET 0 - -/* and non-unicode for the client too */ -#define CLI_CAPABILITY_MASK CAP_UNICODE -#define CLI_CAPABILITY_SET 0 - -static char packet[BUFFER_SIZE]; - -extern int DEBUGLEVEL; - - -static uint16 mid_offset = 0x0; - -/**************************************************************************** -terminate sockent connection -****************************************************************************/ -static void free_sock(void *sock) -{ - if (sock != NULL) - { - struct cli_state *n = (struct cli_state*)sock; - cli_net_use_del(n->desthost, &n->usr, - False, NULL); - } -} - - -static struct cli_state *init_client_connection(int c) -{ - pstring buf; - struct user_creds usr; - int rl; - uint32 len; - BOOL new_con = False; - CREDS_CMD cmd; - prs_struct ps; - BOOL reuse = False; - - ZERO_STRUCT(usr); - ZERO_STRUCT(cmd); - cmd.cred = &usr; - - ZERO_STRUCT(usr); - - DEBUG(10,("init_client_connection: first request\n")); - - rl = read(c, &buf, sizeof(len)); - - if (rl != sizeof(len)) - { - DEBUG(0,("Unable to read length\n")); - dump_data(0, buf, sizeof(len)); - return NULL; - } - - len = IVAL(buf, 0); - - if (len > sizeof(buf)) - { - DEBUG(0,("length %d too long\n", len)); - return NULL; - } - - rl = read(c, buf, len); - - if (rl < 0) - { - DEBUG(0,("Unable to read from connection\n")); - return NULL; - } - -#ifdef DEBUG_PASSWORD - dump_data(100, buf, rl); -#endif - /* make a static data parsing structure from the api_fd_reply data */ - prs_init(&ps, 0, 4, 0, True); - mem_create(ps.data, buf, 0, len, 0, False); - - if (!creds_io_cmd("creds", &cmd, &ps, 0)) - { - DEBUG(0,("Unable to parse credentials\n")); - mem_free_data(ps.data); - return NULL; - } - - mem_free_data(ps.data); - - if (ps.offset != rl) - { - DEBUG(0,("Buffer size %d %d!\n", ps.offset, rl)); - return NULL; - } - - switch (cmd.command) - { - case AGENT_CMD_CON: - { - new_con = True; - break; - } - case AGENT_CMD_CON_REUSE: - { - new_con = True; - reuse = True; - break; - } - default: - { - DEBUG(0,("unknown command %d\n", cmd.command)); - return NULL; - } - } - - if (new_con) - { - struct cli_state *n; - n = cli_net_use_add(cmd.name, &usr.ntc, False, reuse); - - if (n == NULL) - { - DEBUG(0,("Unable to connect to %s\n", cmd.name)); - return NULL; - } - - mid_offset += MIN(MAX(n->max_mux, 1), MAX_MAX_MUX_LIMIT); - - if (mid_offset > 0xffff) - { - mid_offset = 0x0; - } - DEBUG(10,("new mid offset: %d\n", mid_offset)); - - if (write(c, n, sizeof(*n)) < 0) - { - DEBUG(0,("Could not write connection down pipe.\n")); - cli_net_use_del(cmd.name, &usr.ntc, False, NULL); - return NULL; - } - return n; - } - return NULL; -} - -static void filter_reply(char *buf, int moff) -{ - int msg_type = CVAL(buf,0); - int x; - - if (msg_type != 0x0) return; - - /* alter the mid */ - x = SVAL(buf, smb_mid); - x += moff; - - if (x < 0) - { - x += 0x10000; - } - if (x > 0xffff) - { - x -= 0x10000; - } - - SCVAL(buf, smb_mid, x); - -} - -static BOOL process_cli_sock(struct sock_redir **socks, uint32 num_socks, - struct sock_redir *sock) -{ - struct cli_state *n = (struct cli_state*)sock->n; - if (n == NULL) - { - n = init_client_connection(sock->c); - if (n == NULL) - { - return False; - } - sock->n = (void*)n; - sock->s_id = mid_offset; - sock->s = n->fd; - } - else - { - if (!receive_smb(sock->c, packet, 0)) - { - DEBUG(0,("client closed connection\n")); - return False; - } - - filter_reply(packet, sock->s_id); - /* ignore keep-alives */ - if (CVAL(packet, 0) != 0x85) - { - if (!send_smb(sock->s, packet)) - { - DEBUG(0,("server is dead\n")); - return False; - } - } - } - return True; -} - -static int get_smbmid(char *buf) -{ - int msg_type = CVAL(buf,0); - - if (msg_type != 0x0) - { - return -1; - } - - return SVAL(buf,smb_mid); -} - -static BOOL process_srv_sock(struct sock_redir **socks, uint32 num_socks, - int fd) -{ - int smbmid; - int i; - if (!receive_smb(fd, packet, 0)) - { - DEBUG(0,("server closed connection\n")); - return False; - } - - smbmid = get_smbmid(packet); - - DEBUG(10,("process_srv_sock:\tfd:\t%d\tmid:\t%d\n", fd, smbmid)); - - if (smbmid == -1) - { - return True; - } - - for (i = 0; i < num_socks; i++) - { - int moff; - struct cli_state *n; - if (socks[i] == NULL || socks[i]->n == NULL) - { - continue; - } - moff = socks[i]->s_id; - n = (struct cli_state*)socks[i]->n; - DEBUG(10,("list:\tfd:\t%d\tmid:\t%d\tmoff:\t%d\n", - socks[i]->s, - n->mid, - moff)); - if (smbmid != n->mid + moff) - { - continue; - } - filter_reply(packet, -moff); - if (!send_smb(socks[i]->c, packet)) - { - DEBUG(0,("client is dead\n")); - return False; - } - return True; - } - return False; -} - -static int get_agent_sock(char *id) -{ - fstring path; - fstring dir; - - slprintf(dir, sizeof(dir)-1, "/tmp/.smb.%d", getuid()); - slprintf(path, sizeof(path)-1, "%s/agent", dir); - - return create_pipe_socket(dir, S_IRUSR|S_IWUSR|S_IXUSR, path, 0); -} - -static void start_smb_agent(void) -{ - struct vagent_ops va = - { - free_sock, - get_agent_sock, - process_cli_sock, - process_srv_sock, - NULL, - NULL, - 0 - }; - - CatchChild(); - - start_agent(&va); -} - -/**************************************************************************** -usage on the program -****************************************************************************/ -static void usage(char *pname) -{ - printf("Usage: %s [-D]", pname); - - printf("\nVersion %s\n",VERSION); - printf("\t-D run as a daemon\n"); - printf("\t-h usage\n"); - printf("\n"); -} - -int main(int argc, char *argv[]) -{ - pstring configfile; - BOOL is_daemon = False; - int opt; - extern pstring debugf; - - TimeInit(); - - pstrcpy(configfile,CONFIGFILE); - - while ((opt = getopt(argc, argv, "Dh")) != EOF) - { - switch (opt) - { - case 'D': - { - is_daemon = True; - break; - } - case 'h': - default: - { - usage(argv[0]); - break; - } - } - } - - slprintf(debugf, sizeof(debugf)-1, "log.%s", argv[0]); - setup_logging(argv[0], !is_daemon); - - charset_initialise(); - - if (!lp_load(configfile,True,False,False)) - { - DEBUG(0,("Unable to load config file\n")); - } - - if (is_daemon) - { - DEBUG(0,("%s: becoming daemon\n", argv[0])); - become_daemon(); - } - - start_smb_agent(); - - return 0; -} diff --git a/source3/winregd/winregd.c b/source3/winregd/winregd.c deleted file mode 100644 index c317ddd6f4..0000000000 --- a/source3/winregd/winregd.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Main SMB server routines - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -fstring pipe_name; - -pstring servicesf = CONFIGFILE; -extern pstring debugf; -extern BOOL append_log; - -/************************************************************************* - initialise an msrpc service - *************************************************************************/ -void msrpc_service_init(void) -{ -} - -/**************************************************************************** - reload the services file - **************************************************************************/ -BOOL reload_services(BOOL test) -{ - BOOL ret; - - if (lp_loaded()) { - pstring fname; - pstrcpy(fname,lp_configfile()); - if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) { - pstrcpy(servicesf,fname); - test = False; - } - } - - reopen_logs(); - - if (test && !lp_file_list_changed()) - return(True); - - lp_killunused(NULL); - - ret = lp_load(servicesf,False,False,True); - - /* perhaps the config filename is now set */ - if (!test) - reload_services(True); - - reopen_logs(); - - load_interfaces(); - - return(ret); -} - -/**************************************************************************** - main program -****************************************************************************/ - int main(int argc,char *argv[]) -{ -#ifdef HAVE_SET_AUTH_PARAMETERS - set_auth_parameters(argc,argv); -#endif - -#ifdef HAVE_SETLUID - /* needed for SecureWare on SCO */ - setluid(0); -#endif - - append_log = True; - - TimeInit(); - - setup_logging(argv[0],False); - fstrcpy(pipe_name, "winreg"); - slprintf(debugf, sizeof(debugf), "%s/log.%s", LOGFILEBASE, pipe_name); - add_msrpc_command_processor( pipe_name, argv[0], api_reg_rpc ); - - return msrpc_main(argc, argv); -} diff --git a/source3/wkssvcd/wkssvcd.c b/source3/wkssvcd/wkssvcd.c deleted file mode 100644 index dcb5bb98ee..0000000000 --- a/source3/wkssvcd/wkssvcd.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - Unix SMB/Netbios implementation. - Version 1.9. - Main SMB server routines - Copyright (C) Andrew Tridgell 1992-1998 - - 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" - -fstring pipe_name; - -pstring servicesf = CONFIGFILE; -extern pstring debugf; -extern BOOL append_log; - -/************************************************************************* - initialise an msrpc service - *************************************************************************/ -void msrpc_service_init(void) -{ -} - -/**************************************************************************** - reload the services file - **************************************************************************/ -BOOL reload_services(BOOL test) -{ - BOOL ret; - - if (lp_loaded()) { - pstring fname; - pstrcpy(fname,lp_configfile()); - if (file_exist(fname,NULL) && !strcsequal(fname,servicesf)) { - pstrcpy(servicesf,fname); - test = False; - } - } - - reopen_logs(); - - if (test && !lp_file_list_changed()) - return(True); - - lp_killunused(NULL); - - ret = lp_load(servicesf,False,False,True); - - /* perhaps the config filename is now set */ - if (!test) - reload_services(True); - - reopen_logs(); - - load_interfaces(); - - return(ret); -} - -/**************************************************************************** - main program -****************************************************************************/ - int main(int argc,char *argv[]) -{ -#ifdef HAVE_SET_AUTH_PARAMETERS - set_auth_parameters(argc,argv); -#endif - -#ifdef HAVE_SETLUID - /* needed for SecureWare on SCO */ - setluid(0); -#endif - - append_log = True; - - TimeInit(); - - setup_logging(argv[0],False); - fstrcpy(pipe_name, "wkssvc"); - slprintf(debugf, sizeof(debugf), "%s/log.%s", LOGFILEBASE, pipe_name); - add_msrpc_command_processor( pipe_name, argv[0], api_wkssvc_rpc ); - - return msrpc_main(argc, argv); -} |