From d09527532656b92abb87308bd9065bb057935da1 Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Fri, 19 Oct 2001 16:50:15 +0000 Subject: Add additional client RAP calls (This used to be commit b94427ddd55c177145da2665afe3d3a3682db031) --- source3/libsmb/clirap2.c | 1832 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1832 insertions(+) create mode 100644 source3/libsmb/clirap2.c (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c new file mode 100644 index 0000000000..5da67de95c --- /dev/null +++ b/source3/libsmb/clirap2.c @@ -0,0 +1,1832 @@ +/* + Samba Unix/Linux SMB client library + Version 3.0 + More client RAP (SMB Remote Procedure Calls) functions + Copyright (C) 2001 Steve French (sfrench@us.ibm.com) + Copyright (C) 2001 Jim McDonough (jmcd@us.ibm.com) + + + 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. +*/ + +/*****************************************************/ +/* */ +/* Additional RAP functionality */ +/* */ +/* RAP is the original SMB RPC, documented */ +/* by Microsoft and X/Open in the 1990s and */ +/* supported by most SMB/CIFS servers although */ +/* it is unlikely that any one implementation */ +/* supports all RAP command codes since some */ +/* are quite obsolete and a few are specific */ +/* to a particular network operating system */ +/* */ +/* Although it has largely been replaced */ +/* for complex remote admistration and management */ +/* (of servers) by the relatively newer */ +/* DCE/RPC based remote API (which better handles */ +/* large >64K data structures), there are many */ +/* important administrative and resource location */ +/* tasks and user tasks (e.g. password change) */ +/* that are performed via RAP. */ +/* */ +/* Although a few of the RAP calls are implemented */ +/* in the Samba client library already (clirap.c) */ +/* the new ones are in clirap2.c for easy patching */ +/* and integration and a corresponding header */ +/* file, rap.h, has been created. */ +/* */ +/* This is based on data from the CIFS spec */ +/* and the LAN Server and LAN Manager */ +/* Programming Reference books and published */ +/* RAP document and CIFS forum postings and */ +/* lots of trial and error */ +/* */ +/* Function names changed from API_ (as they are */ +/* in the CIFS specification) to RAP_ in order */ +/* to avoid confusion with other API calls */ +/* sent via DCE RPC */ +/* */ +/*****************************************************/ + +/*****************************************************/ +/* */ +/* cifsrap.c already includes support for: */ +/* */ +/* WshareEnum ( API number 0, level 1) */ +/* NetServerEnum2 (API num 104, level 1) */ +/* WWkstaUserLogon (132) */ +/* SamOEMchgPasswordUser2_P (214) */ +/* */ +/* cifsprint.c already includes support for: */ +/* */ +/* WPrintJobEnum (API num 76, level 2) */ +/* WPrintJobDel (API num 81) */ +/* */ +/*****************************************************/ + +#define NO_SYSLOG + +#include "includes.h" + +#define WORDSIZE 2 +#define DWORDSIZE 4 + +#define PUTBYTE(p,b) do {SCVAL(p,0,b); p++;} while(0) +#define GETBYTE(p,b) do {b = CVAL(p,0); p++;} while(0) +#define PUTWORD(p,w) do {SSVAL(p,0,w); p += WORDSIZE;} while(0) +#define GETWORD(p,w) do {w = SVAL(p,0); p += WORDSIZE;} while(0) +#define PUTDWORD(p,d) do {SIVAL(p,0,d); p += DWORDSIZE;} while(0) +#define GETDWORD(p,d) do {d = IVAL(p,0); p += DWORDSIZE;} while(0) +#define GETRES(p) p ? SVAL(p,0) : -1 +/* put string s at p with max len n and increment p past string */ +#define PUTSTRING(p,s,n) do {\ + push_ascii(p,s?s:"",n?n:256,STR_TERMINATE);\ + p = skip_string(p,1);\ + } while(0) +/* put string s and p, using fixed len l, and increment p by l */ +#define PUTSTRINGF(p,s,l) do {\ + push_ascii(p,s?s:"",l,STR_TERMINATE);\ + p += l;\ + } while (0) +/* put string pointer at p, supplying offset o from rdata r, store */ +/* dword offset at p, increment p by 4 and o by length of s. This */ +/* means on the first call, you must calc the offset yourself! */ +#define PUTSTRINGP(p,s,r,o) do {\ + if (s) {\ + push_ascii(r+o,s,strlen(s)+1,STR_TERMINATE);\ + PUTDWORD(p,o);\ + o += strlen(s) + 1;\ + } else PUTDWORD(p,0);\ + }while(0); +/* get asciiz string s from p, increment p past string */ +#define GETSTRING(p,s) do {\ + pull_ascii_pstring(s,p);\ + p = skip_string(p,1);\ + } while(0) +/* get fixed length l string s from p, increment p by l */ +#define GETSTRINGF(p,s,l) do {\ + pull_ascii_pstring(s,p);\ + p += l;\ + } while(0) +/* get string s from offset (obtained at p) from rdata r - converter c */ +#define GETSTRINGP(p,s,r,c) do {\ + uint32 off;\ + GETDWORD(p,off);\ + off &= 0x0000FFFF; /* mask the obsolete segment number from the offset */ \ + pull_ascii_pstring(s, off?(r+off-c):"");\ + } while(0) + +static char *make_header(char *param, uint16 apinum, char *reqfmt, char *datafmt) +{ + PUTWORD(param,apinum); + if (reqfmt) + PUTSTRING(param,reqfmt,0); + else + *param++ = (char) 0; + + if (datafmt) + PUTSTRING(param,datafmt,0); + else + *param++ = (char) 0; + + return param; +} + + +/**************************************************************************** + call a NetGroupDelete - delete user group from remote server +****************************************************************************/ +int cli_NetGroupDelete(struct cli_state *cli, char * group_name ) +{ + char *rparam = NULL; + char *rdata = NULL; + char *p; + int rdrcnt,rprcnt, res; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetGroupDel_REQ) /* parm string */ + +1 /* no ret string */ + +RAP_GROUPNAME_LEN /* group to del */ + +WORDSIZE]; /* reserved word */ + + /* now send a SMBtrans command with api GroupDel */ + p = make_header(param, RAP_WGroupDel, RAP_NetGroupDel_REQ, NULL); + PUTSTRING(p, group_name, RAP_GROUPNAME_LEN); + PUTWORD(p,0); /* reserved word MBZ on input */ + + if (cli_api(cli, + param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ + NULL, 0, 200, /* data, length, maxlen */ + &rparam, &rprcnt, /* return params, length */ + &rdata, &rdrcnt)) /* return data, length */ + { + res = GETRES(rparam); + + if (res == 0) { + /* nothing to do */ + } + else if ((res == 5) || (res == 65)) { + DEBUG(1, ("Access Denied\n")); + } + else if (res == 2220) { + DEBUG (1, ("Group does not exist\n")); + } + else { + DEBUG(4,("NetGroupDelete res=%d\n", res)); + } + } else { + res = -1; + DEBUG(4,("NetGroupDelete failed\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; +} + +/**************************************************************************** + call a NetGroupAdd - add user group to remote server +****************************************************************************/ +int cli_NetGroupAdd(struct cli_state *cli, RAP_GROUP_INFO_1 * grinfo ) +{ + char *rparam = NULL; + char *rdata = NULL; + char *p; + int rdrcnt,rprcnt,res; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetGroupAdd_REQ) /* req string */ + +sizeof(RAP_GROUP_INFO_L1) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* reserved word */ + + char data[1024]; + + /* offset into data of free format strings. Will be updated */ + /* by PUTSTRINGP macro and end up with total data length. */ + int soffset = RAP_GROUPNAME_LEN + 1 + DWORDSIZE; + + /* now send a SMBtrans command with api WGroupAdd */ + + p = make_header(param, RAP_WGroupAdd, + RAP_NetGroupAdd_REQ, RAP_GROUP_INFO_L1); + PUTWORD(p, 1); /* info level */ + PUTWORD(p, 0); /* reserved word 0 */ + + p = data; + PUTSTRINGF(p, grinfo->group_name, RAP_GROUPNAME_LEN); + PUTBYTE(p, 0); /* pad byte 0 */ + PUTSTRINGP(p, grinfo->comment, data, soffset); + + if (cli_api(cli, + param, sizeof(param), 1024, /* Param, length, maxlen */ + data, soffset, sizeof(data), /* data, length, maxlen */ + &rparam, &rprcnt, /* return params, length */ + &rdata, &rdrcnt)) /* return data, length */ + { + res = GETRES(rparam); + + if (res == 0) { + /* nothing to do */ + } else if ((res == 5) || (res == 65)) { + DEBUG(1, ("Access Denied\n")); + } + else if (res == 2223) { + DEBUG (1, ("Group already exists\n")); + } + else { + DEBUG(4,("NetGroupAdd res=%d\n", res)); + } + } else { + res = -1; + DEBUG(4,("NetGroupAdd failed\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; +} + +/**************************************************************************** +call a NetGroupEnum - try and list user groups on a different host +****************************************************************************/ +int cli_RNetGroupEnum(struct cli_state *cli, void (*fn)(const char *, const char *, void *), void *state) +{ + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetGroupEnum_REQ) /* parm string */ + +sizeof(RAP_GROUP_INFO_L1) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + char *p; + char *rparam = NULL; + char *rdata = NULL; + int rprcnt, rdrcnt; + int res = -1; + + + bzero(param, sizeof(param)); + p = make_header(param, RAP_WGroupEnum, + RAP_NetGroupEnum_REQ, RAP_GROUP_INFO_L1); + PUTWORD(p,1); /* Info level 1 */ /* add level 0 */ + PUTWORD(p,0xFFE0); /* Return buffer size */ + + if (cli_api(cli, + param, PTR_DIFF(p,param),8, + NULL, 0, 0xFFE0 /* data area size */, + &rparam, &rprcnt, + &rdata, &rdrcnt)) { + res = GETRES(rparam); + cli->rap_error = res; + if(cli->rap_error == 234) + DEBUG(1,("Not all group names were returned (such as those longer than 21 characters)\n")); + else if (cli->rap_error != 0) { + DEBUG(1,("NetGroupEnum gave error %d\n", cli->rap_error)); + } + } + + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + + p = rparam + WORDSIZE; /* skip result */ + GETWORD(p, converter); + GETWORD(p, count); + + for (i=0,p=rdata;irap_error = res; + if (res != 0) { + DEBUG(1,("NetGroupGetUsers gave error %d\n", res)); + } + } + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + fstring username; + p = rparam +WORDSIZE; + GETWORD(p, converter); + GETWORD(p, count); + + for (i=0,p=rdata; ipasswrd) + PUTWORD(p,strnlen(userinfo->passwrd, RAP_UPASSWD_LEN)); + else + PUTWORD(p, 0); /* password length */ + + p = data; + bzero(data, soffset); + + PUTSTRINGF(p, userinfo->user_name, RAP_USERNAME_LEN); + PUTBYTE(p, 0); /* pad byte 0 */ + PUTSTRINGF(p, userinfo->passwrd, RAP_UPASSWD_LEN); + PUTDWORD(p, 0); /* pw age - n.a. on user add */ + PUTWORD(p, userinfo->priv); + PUTSTRINGP(p, userinfo->home_dir, data, soffset); + PUTSTRINGP(p, userinfo->comment, data, soffset); + PUTWORD(p, userinfo->userflags); + PUTSTRINGP(p, userinfo->logon_script, data, soffset); + + if (cli_api(cli, + param, sizeof(param), 1024, /* Param, length, maxlen */ + data, soffset, sizeof(data), /* data, length, maxlen */ + &rparam, &rprcnt, /* return params, length */ + &rdata, &rdrcnt)) /* return data, length */ + { + res = GETRES(rparam); + + if (res == 0) { + /* nothing to do */ + } + else if ((res == 5) || (res == 65)) { + DEBUG(1, ("Access Denied\n")); + } + else if (res == 2224) { + DEBUG (1, ("User already exists\n")); + } + else { + DEBUG(4,("NetUserAdd res=%d\n", res)); + } + } else { + res = -1; + DEBUG(4,("NetUserAdd failed\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; +} + +/**************************************************************************** +call a NetUserEnum - try and list users on a different host +****************************************************************************/ +int cli_RNetUserEnum(struct cli_state *cli, void (*fn)(const char *, const char *, const char *, const char *, void *), void *state) +{ + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetUserEnum_REQ) /* parm string */ + +sizeof(RAP_USER_INFO_L1) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + char *p; + char *rparam = NULL; + char *rdata = NULL; + int rprcnt, rdrcnt; + int res = -1; + + + bzero(param, sizeof(param)); + p = make_header(param, RAP_WUserEnum, + RAP_NetUserEnum_REQ, RAP_USER_INFO_L1); + PUTWORD(p,1); /* Info level 1 */ + PUTWORD(p,0xFF00); /* Return buffer size */ + +/* BB Fix handling of large numbers of users to be returned */ + if (cli_api(cli, + param, PTR_DIFF(p,param),8, + NULL, 0, CLI_BUFFER_SIZE, + &rparam, &rprcnt, + &rdata, &rdrcnt)) { + res = GETRES(rparam); + cli->rap_error = res; + if (cli->rap_error != 0) { + DEBUG(1,("NetUserEnum gave error %d\n", cli->rap_error)); + } + } + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + char username[RAP_USERNAME_LEN]; + char userpw[RAP_UPASSWD_LEN]; + pstring comment, homedir, logonscript; + int pwage, priv, flags; + + p = rparam + WORDSIZE; /* skip result */ + GETWORD(p, converter); + GETWORD(p, count); + + for (i=0,p=rdata;ishare_name, RAP_SHARENAME_LEN); + PUTBYTE(p, 0); /* pad byte 0 */ + + PUTWORD(p, sinfo->share_type); + PUTSTRINGP(p, sinfo->comment, data, soffset); + PUTWORD(p, sinfo->perms); + PUTWORD(p, sinfo->maximum_users); + PUTWORD(p, sinfo->active_users); + PUTSTRINGP(p, sinfo->path, data, soffset); + PUTSTRINGF(p, sinfo->password, RAP_SPASSWD_LEN); + SCVAL(p,-1,0x0A); /* required 0x0A at end of password */ + + if (cli_api(cli, + param, sizeof(param), 1024, /* Param, length, maxlen */ + data, soffset, sizeof(data), /* data, length, maxlen */ + &rparam, &rprcnt, /* return params, length */ + &rdata, &rdrcnt)) /* return data, length */ + { + res = rparam? SVAL(rparam,0) : -1; + + if (res == 0) { + /* nothing to do */ + } + else { + DEBUG(4,("NetShareAdd res=%d\n", res)); + } + } else { + res = -1; + DEBUG(4,("NetShareAdd failed\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; +} +/**************************************************************************** + call a NetShareDelete - unshare exported directory on remote server +****************************************************************************/ +int cli_NetShareDelete(struct cli_state *cli, char * share_name ) +{ + char *rparam = NULL; + char *rdata = NULL; + char *p; + int rdrcnt,rprcnt, res; + char param[WORDSIZE /* api number */ + +sizeof(RAP_WShareDel_REQ) /* req string */ + +1 /* no ret string */ + +RAP_SHARENAME_LEN /* share to del */ + +WORDSIZE]; /* reserved word */ + + + /* now send a SMBtrans command with api RNetShareDelete */ + p = make_header(param, RAP_WshareDel, RAP_WShareDel_REQ, NULL); + PUTSTRING(p,share_name,RAP_SHARENAME_LEN); + PUTWORD(p,0); /* reserved word MBZ on input */ + + if (cli_api(cli, + param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ + NULL, 0, 200, /* data, length, maxlen */ + &rparam, &rprcnt, /* return params, length */ + &rdata, &rdrcnt)) /* return data, length */ + { + res = GETRES(rparam); + + if (res == 0) { + /* nothing to do */ + } + else { + DEBUG(4,("NetShareDelete res=%d\n", res)); + } + } else { + res = -1; + DEBUG(4,("NetShareDelete failed\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; +} +/************************************************************************* +* +* Function Name: cli_get_pdc_name +* +* PURPOSE: Remotes a NetServerEnum API call to the current server +* requesting the name of a server matching the server +* type of SV_TYPE_DOMAIN_CTRL (PDC). +* +* Dependencies: none +* +* Parameters: +* cli - pointer to cli_state structure +* workgroup - pointer to string containing name of domain +* pdc_name - pointer to string that will contain PDC name +* on successful return +* +* Returns: +* True - success +* False - failure +* +************************************************************************/ +BOOL cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) +{ + char *rparam = NULL; + char *rdata = NULL; + int rdrcnt,rprcnt; + char *p; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetServerEnum2_REQ) /* req string */ + +sizeof(RAP_SERVER_INFO_L1) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE /* buffer size */ + +DWORDSIZE /* server type */ + +RAP_MACHNAME_LEN]; /* workgroup */ + int count = -1; + + *pdc_name = '\0'; + + /* send a SMBtrans command with api NetServerEnum */ + p = make_header(param, RAP_NetServerEnum2, + RAP_NetServerEnum2_REQ, RAP_SERVER_INFO_L1); + PUTWORD(p, 1); /* info level */ + PUTWORD(p, CLI_BUFFER_SIZE); + PUTDWORD(p, SV_TYPE_DOMAIN_CTRL); + PUTSTRING(p, workgroup, RAP_MACHNAME_LEN); + + if (cli_api(cli, + param, PTR_DIFF(p,param), 8, /* params, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt /* return data, return size */ + )) { + cli->rap_error = GETRES(rparam); + + /* + * We only really care to copy a name if the + * API succeeded and we got back a name. + */ + if (cli->rap_error == 0) { + p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ + GETWORD(p, count); + p = rdata; + + if (count > 0) + GETSTRING(p, pdc_name); + } + else { + DEBUG(4,("cli_get_pdc_name: machine %s failed the NetServerEnum call. " + "Error was : %s.\n", cli->desthost, cli_errstr(cli) )); + } + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return(count > 0); +} + + +/************************************************************************* +* +* Function Name: cli_get_server_domain +* +* PURPOSE: Remotes a NetWkstaGetInfo API call to the current server +* requesting wksta_info_10 level information to determine +* the domain the server belongs to. On success, this +* routine sets the server_domain field in the cli_state structure +* to the server's domain name. +* +* Dependencies: none +* +* Parameters: +* cli - pointer to cli_state structure +* +* Returns: +* True - success +* False - failure +* +* Origins: samba 2.0.6 source/libsmb/clientgen.c cli_NetServerEnum() +* +************************************************************************/ +BOOL cli_get_server_domain(struct cli_state *cli) +{ + char *rparam = NULL; + char *rdata = NULL; + int rdrcnt,rprcnt; + char *p; + char param[WORDSIZE /* api number */ + +sizeof(RAP_WWkstaGetInfo_REQ) /* req string */ + +sizeof(RAP_WKSTA_INFO_L10) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + int res = -1; + + /* send a SMBtrans command with api NetWkstaGetInfo */ + p = make_header(param, RAP_WWkstaGetInfo, + RAP_WWkstaGetInfo_REQ, RAP_WKSTA_INFO_L10); + PUTWORD(p, 10); /* info level */ + PUTWORD(p, CLI_BUFFER_SIZE); + + if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt)) { /* return data, return size */ + res = GETRES(rparam); + p = rdata; + + if (res == 0) { + int converter; + + p = rparam + WORDSIZE; + GETWORD(p, converter); + + p = rdata + DWORDSIZE + DWORDSIZE; /* skip computer & user names */ + GETSTRINGP(p, cli->server_domain, rdata, converter); + } + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return(res == 0); +} + + +/************************************************************************* +* +* Function Name: cli_get_server_type +* +* PURPOSE: Remotes a NetServerGetInfo API call to the current server +* requesting server_info_1 level information to retrieve +* the server type. +* +* Dependencies: none +* +* Parameters: +* cli - pointer to cli_state structure +* pstype - pointer to uint32 to contain returned server type +* +* Returns: +* True - success +* False - failure +* +* Origins: samba 2.0.6 source/libsmb/clientgen.c cli_NetServerEnum() +* +************************************************************************/ +BOOL cli_get_server_type(struct cli_state *cli, uint32 *pstype) +{ + char *rparam = NULL; + char *rdata = NULL; + int rdrcnt,rprcnt; + char *p; + char param[WORDSIZE /* api number */ + +sizeof(RAP_WserverGetInfo_REQ) /* req string */ + +sizeof(RAP_SERVER_INFO_L1) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + int res = -1; + + /* send a SMBtrans command with api NetServerGetInfo */ + p = make_header(param, RAP_WserverGetInfo, + RAP_WserverGetInfo_REQ, RAP_SERVER_INFO_L1); + PUTWORD(p, 1); /* info level */ + PUTWORD(p, CLI_BUFFER_SIZE); + + if (cli_api(cli, + param, PTR_DIFF(p,param), 8, /* params, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt /* return data, return size */ + )) { + + res = GETRES(rparam); + + if (res == 0 || res == ERRmoredata) { + p = rdata; + *pstype = IVAL(p,18) & ~SV_TYPE_LOCAL_LIST_ONLY; + } + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return(res == 0 || res == ERRmoredata); +} + + +/************************************************************************* +* +* Function Name: cli_ns_check_server_type +* +* PURPOSE: Remotes a NetServerEnum2 API call to the current server +* requesting server_info_0 level information of machines +* matching the given server type. If the returned server +* list contains the machine name contained in cli->desthost +* then we conclude the server type checks out. This routine +* is useful to retrieve list of server's of a certain +* type when all you have is a null session connection and +* can't remote API calls such as NetWkstaGetInfo or +* NetServerGetInfo. +* +* Dependencies: none +* +* Parameters: +* cli - pointer to cli_state structure +* workgroup - pointer to string containing domain +* stype - server type +* +* Returns: +* True - success +* False - failure +* +************************************************************************/ +BOOL cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 stype) +{ + char *rparam = NULL; + char *rdata = NULL; + int rdrcnt,rprcnt; + char *p; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetServerEnum2_REQ) /* req string */ + +sizeof(RAP_SERVER_INFO_L0) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE /* buffer size */ + +DWORDSIZE /* server type */ + +RAP_MACHNAME_LEN]; /* workgroup */ + BOOL found_server = False; + int res = -1; + + /* send a SMBtrans command with api NetServerEnum */ + p = make_header(param, RAP_NetServerEnum2, + RAP_NetServerEnum2_REQ, RAP_SERVER_INFO_L0); + PUTWORD(p, 0); /* info level 0 */ + PUTWORD(p, CLI_BUFFER_SIZE); + PUTDWORD(p, stype); + PUTSTRING(p, workgroup, RAP_MACHNAME_LEN); + + if (cli_api(cli, + param, PTR_DIFF(p,param), 8, /* params, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt /* return data, return size */ + )) { + + res = GETRES(rparam); + cli->rap_error = res; + + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + + p = rparam + WORDSIZE; + GETWORD(p, converter); + GETWORD(p, count); + + p = rdata; + for (i = 0;i < count;i++, p += 16) { + char ret_server[RAP_MACHNAME_LEN]; + + GETSTRINGF(p, ret_server, RAP_MACHNAME_LEN); + if (strequal(ret_server, cli->desthost)) { + found_server = True; + break; + } + } + } + else { + DEBUG(4,("cli_ns_check_server_type: machine %s failed the NetServerEnum call. " + "Error was : %s.\n", cli->desthost, cli_errstr(cli) )); + } + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return found_server; + } + + +/**************************************************************************** + perform a NetWkstaUserLogoff +****************************************************************************/ +BOOL cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation) +{ + char *rparam = NULL; + char *rdata = NULL; + char *p; + int rdrcnt,rprcnt; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetWkstaUserLogoff_REQ) /* req string */ + +sizeof(RAP_USER_LOGOFF_INFO_L1) /* return string */ + +RAP_USERNAME_LEN+1 /* user name+pad */ + +RAP_MACHNAME_LEN /* wksta name */ + +WORDSIZE /* buffer size */ + +WORDSIZE]; /* buffer size? */ + fstring upperbuf; + + memset(param, 0, sizeof(param)); + + /* send a SMBtrans command with api NetWkstaUserLogoff */ + p = make_header(param, RAP_WWkstaUserLogoff, + RAP_NetWkstaUserLogoff_REQ, RAP_USER_LOGOFF_INFO_L1); + PUTDWORD(p, 0); /* Null pointer */ + PUTDWORD(p, 0); /* Null pointer */ + fstrcpy(upperbuf, user); + strupper(upperbuf); + PUTSTRINGF(p, upperbuf, RAP_USERNAME_LEN); + p++; /* strange format, but ok */ + fstrcpy(upperbuf, workstation); + strupper(upperbuf); + PUTSTRINGF(p, upperbuf, RAP_MACHNAME_LEN); + PUTWORD(p, CLI_BUFFER_SIZE); + PUTWORD(p, CLI_BUFFER_SIZE); + + if (cli_api(cli, + param, PTR_DIFF(p,param),1024, /* param, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt /* return data, return size */ + )) { + cli->rap_error = GETRES(rparam); + + if (cli->rap_error != 0) { + DEBUG(4,("NetwkstaUserLogoff gave error %d\n", cli->rap_error)); + } + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + return (cli->rap_error == 0); +} + +int cli_NetPrintQEnum(struct cli_state *cli, void (*qfn)(char*,uint16,uint16,uint16,char*,char*,char*,char*,char*,uint16,uint16),void (*jfn)(uint16,char*,char*,char*,char*,uint16,uint16,char*,uint,uint,char*)) +{ + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetPrintQEnum_REQ) /* req string */ + +sizeof(RAP_PRINTQ_INFO_L2) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE /* buffer size */ + +sizeof(RAP_SMB_PRINT_JOB_L1)]; /* more ret data */ + char *p; + char *rparam = NULL; + char *rdata = NULL; + int rprcnt, rdrcnt; + int res = -1; + + + bzero(param, sizeof(param)); + p = make_header(param, RAP_WPrintQEnum, + RAP_NetPrintQEnum_REQ, RAP_PRINTQ_INFO_L2); + PUTWORD(p,2); /* Info level 2 */ + PUTWORD(p,0xFFE0); /* Return buffer size */ + PUTSTRING(p, RAP_SMB_PRINT_JOB_L1, 0); + + if (cli_api(cli, + param, PTR_DIFF(p,param),1024, + NULL, 0, CLI_BUFFER_SIZE, + &rparam, &rprcnt, + &rdata, &rdrcnt)) { + res = GETRES(rparam); + cli->rap_error = res; + if (res != 0) { + DEBUG(1,("NetPrintQEnum gave error %d\n", res)); + } + } + + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + + p = rparam + WORDSIZE; + GETWORD(p, converter); + GETWORD(p, count); + + p = rdata; + for (i=0;irap_error = res; + if (res != 0) { + DEBUG(1,("NetPrintQGetInfo gave error %d\n", res)); + } + } + + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int rsize, converter; + pstring qname, sep_file, print_proc, dest, parms, comment; + uint16 jobcount, priority, start_time, until_time, status; + + p = rparam + WORDSIZE; + GETWORD(p, converter); + GETWORD(p, rsize); + + p = rdata; + GETSTRINGF(p, qname, RAP_SHARENAME_LEN); + p++; /* pad */ + GETWORD(p, priority); + GETWORD(p, start_time); + GETWORD(p, until_time); + GETSTRINGP(p, sep_file, rdata, converter); + GETSTRINGP(p, print_proc, rdata, converter); + GETSTRINGP(p, dest, rdata, converter); + GETSTRINGP(p, parms, rdata, converter); + GETSTRINGP(p, comment, rdata, converter); + GETWORD(p, status); + GETWORD(p, jobcount); + qfn(qname, priority, start_time, until_time, sep_file, print_proc, + dest, parms, comment, status, jobcount); + if (jobcount) { + int j; + for (j=0;(jrap_error = res; + if (res != 0) { + DEBUG(1,("NetSessionEnum gave error %d\n", res)); + } + } + + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + + p = rparam + WORDSIZE; + GETWORD(p, converter); + GETWORD(p, count); + + for (i=0,p=rdata;irap_error = SVAL(rparam,0); + if (cli->rap_error != 0) { + DEBUG(1,("NetSessionGetInfo gave error %d\n", cli->rap_error)); + } + } + + if (rdata) { + res = GETRES(rparam); + + if (res == 0 || res == ERRmoredata) { + int rsize, converter; + pstring wsname, username, clitype_name; + uint16 num_conns, num_opens, num_users; + uint sess_time, idle_time, user_flags; + + p = rparam + WORDSIZE; + GETWORD(p, converter); + GETWORD(p, rsize); + + p = rdata; + GETSTRINGP(p, wsname, rdata, converter); + GETSTRINGP(p, username, rdata, converter); + GETWORD(p, num_conns); + GETWORD(p, num_opens); + GETWORD(p, num_users); + GETDWORD(p, sess_time); + GETDWORD(p, idle_time); + GETDWORD(p, user_flags); + GETSTRINGP(p, clitype_name, rdata, converter); + + fn(wsname, username, num_conns, num_opens, num_users, sess_time, + idle_time, user_flags, clitype_name); + } else { + DEBUG(4,("NetSessionGetInfo res=%d\n", res)); + } + } else { + DEBUG(4,("NetSessionGetInfo no data returned\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; +} + +/**************************************************************************** +call a NetSessionDel - close a session to an SMB server +****************************************************************************/ +int cli_NetSessionDel(struct cli_state *cli, char *workstation) +{ + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetSessionDel_REQ) /* req string */ + +1 /* no return string */ + +RAP_MACHNAME_LEN /* workstation name */ + +WORDSIZE]; /* reserved (0) */ + char *p; + char *rparam = NULL; + char *rdata = NULL; + int rprcnt, rdrcnt; + int res; + + bzero(param, sizeof(param)); + p = make_header(param, RAP_WsessionDel, RAP_NetSessionDel_REQ, NULL); + PUTSTRING(p, workstation, RAP_MACHNAME_LEN-1); + PUTWORD(p,0); /* reserved word of 0 */ + if (cli_api(cli, + param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ + NULL, 0, 200, /* data, length, maxlen */ + &rparam, &rprcnt, /* return params, length */ + &rdata, &rdrcnt)) /* return data, length */ + { + res = GETRES(rparam); + cli->rap_error = res; + + if (res == 0) { + /* nothing to do */ + } + else { + DEBUG(4,("NetFileClose2 res=%d\n", res)); + } + } else { + res = -1; + DEBUG(4,("NetFileClose2 failed\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; +} + + +int cli_NetConnectionEnum(struct cli_state *cli, char *qualifier, void (*fn)(uint16 conid, uint16 contype, uint16 numopens, uint16 numusers, uint32 contime, char *username, char *netname)) +{ + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetConnectionEnum_REQ) /* req string */ + +sizeof(RAP_CONNECTION_INFO_L1) /* return string */ + +RAP_MACHNAME_LEN /* wksta name */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + char *p; + char *rparam = NULL; + char *rdata = NULL; + int rprcnt, rdrcnt; + int res = -1; + + bzero(param, sizeof(param)); + p = make_header(param, RAP_WconnectionEnum, + RAP_NetConnectionEnum_REQ, RAP_CONNECTION_INFO_L1); + PUTSTRING(p, qualifier, RAP_MACHNAME_LEN-1);/* Workstation name */ + PUTWORD(p,1); /* Info level 1 */ + PUTWORD(p,0xFFE0); /* Return buffer size */ + + if (cli_api(cli, + param, PTR_DIFF(p,param),PTR_DIFF(p,param), + NULL, 0, CLI_BUFFER_SIZE, + &rparam, &rprcnt, + &rdata, &rdrcnt)) { + res = GETRES(rparam); + cli->rap_error = res; + if (res != 0) { + DEBUG(1,("NetConnectionEnum gave error %d\n", res)); + } + } + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + + p = rparam + WORDSIZE; + GETWORD(p, converter); + GETWORD(p, count); + + for (i=0,p=rdata;i Date: Sat, 20 Oct 2001 21:59:34 +0000 Subject: Move from timestamp to gen count file id's for finding oplocked files in a tdb. Jeremy. (This used to be commit 058ae6b58f61ef46013dd076af3a84de5fbaaab1) --- source3/libsmb/clirap2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 5da67de95c..5a834e7b7a 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -586,7 +586,7 @@ int cli_NetUserAdd(struct cli_state *cli, RAP_USER_INFO_1 * userinfo ) PUTWORD(p, 0); /* pwencrypt */ if(userinfo->passwrd) - PUTWORD(p,strnlen(userinfo->passwrd, RAP_UPASSWD_LEN)); + PUTWORD(p,MIN(strlen(userinfo->passwrd), RAP_UPASSWD_LEN)); else PUTWORD(p, 0); /* password length */ -- cgit From 22926c814d238c462f9957f2753c7ce7dc7a6797 Mon Sep 17 00:00:00 2001 From: Steve French Date: Sat, 3 Nov 2001 21:12:44 +0000 Subject: Added support for UserListGroups, ServiceEnum (This used to be commit 4e882289b0e291bb57d48fc2b2120919632daa5f) --- source3/libsmb/clirap2.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 5a834e7b7a..f19ec3e758 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -497,6 +497,62 @@ int cli_NetGroupGetUsers(struct cli_state * cli, char * group_name, void (*fn)(c return res; } +int cli_NetUserGetGroups(struct cli_state * cli, char * user_name, void (*fn)(const char *, void *), void *state ) +{ + char *rparam = NULL; + char *rdata = NULL; + char *p; + int rdrcnt,rprcnt; + int res = -1; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetUserGetGroups_REQ)/* parm string */ + +sizeof(RAP_GROUP_USERS_INFO_0) /* return string */ + +RAP_USERNAME_LEN /* user name */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + + /* now send a SMBtrans command with api GroupGetUsers */ + p = make_header(param, RAP_WUserGetGroups, + RAP_NetUserGetGroups_REQ, RAP_GROUP_USERS_INFO_0); + PUTSTRING(p,user_name,RAP_USERNAME_LEN-1); + PUTWORD(p,0); /* info level 0 */ + PUTWORD(p,0xFFE0); /* return buffer size */ + + if (cli_api(cli, + param, PTR_DIFF(p,param),PTR_DIFF(p,param), + NULL, 0, CLI_BUFFER_SIZE, + &rparam, &rprcnt, + &rdata, &rdrcnt)) { + res = GETRES(rparam); + cli->rap_error = res; + if (res != 0) { + DEBUG(1,("NetUserGetGroups gave error %d\n", res)); + } + } + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + fstring groupname; + p = rparam +WORDSIZE; + GETWORD(p, converter); + GETWORD(p, count); + + for (i=0,p=rdata; irap_error = res; + if(cli->rap_error == 234) + DEBUG(1,("Not all service names were returned (such as those longer than 15 characters)\n")); + else if (cli->rap_error != 0) { + DEBUG(1,("NetServiceEnum gave error %d\n", cli->rap_error)); + } + } + + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + + p = rparam + WORDSIZE; /* skip result */ + GETWORD(p, converter); + GETWORD(p, count); + + for (i=0,p=rdata;i Date: Sun, 4 Nov 2001 00:14:08 +0000 Subject: Got serious about const again. REMOVED BZERO CALLS YET AGAIN !!! Why do these keep creeping back in.... They are *NOT* POSIX. I'm also thinking of removing strncpy as I'm sure it's not being used correctly.... Jeremy. (This used to be commit b1930abb35dee74f858a3f7190276c418af2322b) --- source3/libsmb/clirap2.c | 53 ++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 24 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index f19ec3e758..2fde0c70e5 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -149,7 +149,7 @@ static char *make_header(char *param, uint16 apinum, char *reqfmt, char *datafmt /**************************************************************************** call a NetGroupDelete - delete user group from remote server ****************************************************************************/ -int cli_NetGroupDelete(struct cli_state *cli, char * group_name ) +int cli_NetGroupDelete(struct cli_state *cli, const char *group_name ) { char *rparam = NULL; char *rdata = NULL; @@ -277,7 +277,7 @@ int cli_RNetGroupEnum(struct cli_state *cli, void (*fn)(const char *, const char int res = -1; - bzero(param, sizeof(param)); + memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WGroupEnum, RAP_NetGroupEnum_REQ, RAP_GROUP_INFO_L1); PUTWORD(p,1); /* Info level 1 */ /* add level 0 */ @@ -328,7 +328,7 @@ int cli_RNetGroupEnum(struct cli_state *cli, void (*fn)(const char *, const char return res; } -int cli_NetGroupDelUser(struct cli_state * cli, char * group_name, char * user_name) +int cli_NetGroupDelUser(struct cli_state * cli, const char *group_name, const char *user_name) { char *rparam = NULL; char *rdata = NULL; @@ -386,7 +386,7 @@ int cli_NetGroupDelUser(struct cli_state * cli, char * group_name, char * user_n return res; } -int cli_NetGroupAddUser(struct cli_state * cli, char * group_name, char * user_name) +int cli_NetGroupAddUser(struct cli_state * cli, const char *group_name, const char *user_name) { char *rparam = NULL; char *rdata = NULL; @@ -442,7 +442,7 @@ int cli_NetGroupAddUser(struct cli_state * cli, char * group_name, char * user_n } -int cli_NetGroupGetUsers(struct cli_state * cli, char * group_name, void (*fn)(const char *, void *), void *state ) +int cli_NetGroupGetUsers(struct cli_state * cli, const char *group_name, void (*fn)(const char *, void *), void *state ) { char *rparam = NULL; char *rdata = NULL; @@ -497,7 +497,7 @@ int cli_NetGroupGetUsers(struct cli_state * cli, char * group_name, void (*fn)(c return res; } -int cli_NetUserGetGroups(struct cli_state * cli, char * user_name, void (*fn)(const char *, void *), void *state ) +int cli_NetUserGetGroups(struct cli_state * cli, const char *user_name, void (*fn)(const char *, void *), void *state ) { char *rparam = NULL; char *rdata = NULL; @@ -556,7 +556,7 @@ int cli_NetUserGetGroups(struct cli_state * cli, char * user_name, void (*fn)(co /**************************************************************************** call a NetUserDelete - delete user from remote server ****************************************************************************/ -int cli_NetUserDelete(struct cli_state *cli, char * user_name ) +int cli_NetUserDelete(struct cli_state *cli, const char * user_name ) { char *rparam = NULL; char *rdata = NULL; @@ -647,7 +647,7 @@ int cli_NetUserAdd(struct cli_state *cli, RAP_USER_INFO_1 * userinfo ) PUTWORD(p, 0); /* password length */ p = data; - bzero(data, soffset); + memset(data, '\0', soffset); PUTSTRINGF(p, userinfo->user_name, RAP_USERNAME_LEN); PUTBYTE(p, 0); /* pad byte 0 */ @@ -707,7 +707,7 @@ int cli_RNetUserEnum(struct cli_state *cli, void (*fn)(const char *, const char int res = -1; - bzero(param, sizeof(param)); + memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WUserEnum, RAP_NetUserEnum_REQ, RAP_USER_INFO_L1); PUTWORD(p,1); /* Info level 1 */ @@ -984,7 +984,7 @@ int cli_NetShareAdd(struct cli_state *cli, RAP_SHARE_INFO_2 * sinfo ) + DWORDSIZE /* share path */ + RAP_SPASSWD_LEN + 1; /* share password + pad */ - bzero(param,sizeof(param)); + memset(param,'\0',sizeof(param)); /* now send a SMBtrans command with api RNetShareAdd */ p = make_header(param, RAP_WshareAdd, RAP_WShareAdd_REQ, RAP_SHARE_INFO_L2); @@ -1031,7 +1031,7 @@ int cli_NetShareAdd(struct cli_state *cli, RAP_SHARE_INFO_2 * sinfo ) /**************************************************************************** call a NetShareDelete - unshare exported directory on remote server ****************************************************************************/ -int cli_NetShareDelete(struct cli_state *cli, char * share_name ) +int cli_NetShareDelete(struct cli_state *cli, const char * share_name ) { char *rparam = NULL; char *rdata = NULL; @@ -1424,7 +1424,9 @@ BOOL cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation) return (cli->rap_error == 0); } -int cli_NetPrintQEnum(struct cli_state *cli, void (*qfn)(char*,uint16,uint16,uint16,char*,char*,char*,char*,char*,uint16,uint16),void (*jfn)(uint16,char*,char*,char*,char*,uint16,uint16,char*,uint,uint,char*)) +int cli_NetPrintQEnum(struct cli_state *cli, + void (*qfn)(const char*,uint16,uint16,uint16,const char*,const char*,const char*,const char*,const char*,uint16,uint16), + void (*jfn)(uint16,const char*,const char*,const char*,const char*,uint16,uint16,const char*,uint,uint,const char*)) { char param[WORDSIZE /* api number */ +sizeof(RAP_NetPrintQEnum_REQ) /* req string */ @@ -1439,7 +1441,7 @@ int cli_NetPrintQEnum(struct cli_state *cli, void (*qfn)(char*,uint16,uint16,ui int res = -1; - bzero(param, sizeof(param)); + memset(param, '\0',sizeof(param)); p = make_header(param, RAP_WPrintQEnum, RAP_NetPrintQEnum_REQ, RAP_PRINTQ_INFO_L2); PUTWORD(p,2); /* Info level 2 */ @@ -1525,7 +1527,9 @@ int cli_NetPrintQEnum(struct cli_state *cli, void (*qfn)(char*,uint16,uint16,ui return res; } -int cli_NetPrintQGetInfo(struct cli_state *cli, char *printer, void (*qfn)(char*,uint16,uint16,uint16,char*,char*,char*,char*,char*,uint16,uint16),void (*jfn)(uint16,char*,char*,char*,char*,uint16,uint16,char*,uint,uint,char*)) +int cli_NetPrintQGetInfo(struct cli_state *cli, const char *printer, + void (*qfn)(const char*,uint16,uint16,uint16,const char*,const char*,const char*,const char*,const char*,uint16,uint16), + void (*jfn)(uint16,const char*,const char*,const char*,const char*,uint16,uint16,const char*,uint,uint,const char*)) { char param[WORDSIZE /* api number */ +sizeof(RAP_NetPrintQGetInfo_REQ) /* req string */ @@ -1541,7 +1545,7 @@ int cli_NetPrintQGetInfo(struct cli_state *cli, char *printer, void (*qfn)(char* int res = -1; - bzero(param, sizeof(param)); + memset(param, '\0',sizeof(param)); p = make_header(param, RAP_WPrintQGetInfo, RAP_NetPrintQGetInfo_REQ, RAP_PRINTQ_INFO_L2); PUTSTRING(p, printer, RAP_SHARENAME_LEN-1); @@ -1640,7 +1644,7 @@ int cli_RNetServiceEnum(struct cli_state *cli, void (*fn)(const char *, const ch int res = -1; - bzero(param, sizeof(param)); + memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WServiceEnum, RAP_NetServiceEnum_REQ, RAP_SERVICE_INFO_L2); PUTWORD(p,2); /* Info level 2 */ @@ -1708,7 +1712,7 @@ int cli_NetSessionEnum(struct cli_state *cli, void (*fn)(char *, char *, uint16, int rprcnt, rdrcnt; int res = -1; - bzero(param, sizeof(param)); + memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WsessionEnum, RAP_NetSessionEnum_REQ, RAP_SESSION_INFO_L2); PUTWORD(p,2); /* Info level 2 */ @@ -1767,9 +1771,10 @@ int cli_NetSessionEnum(struct cli_state *cli, void (*fn)(char *, char *, uint16, } /**************************************************************************** -call a NetSessionGetInfo - get information about other session to an SMB server + Call a NetSessionGetInfo - get information about other session to an SMB server. ****************************************************************************/ -int cli_NetSessionGetInfo(struct cli_state *cli, char *workstation, void (*fn)(char *, char *, uint16, uint16, uint16, uint, uint, uint, char *)) + +int cli_NetSessionGetInfo(struct cli_state *cli, const char *workstation, void (*fn)(const char *, const char *, uint16, uint16, uint16, uint, uint, uint, const char *)) { char param[WORDSIZE /* api number */ +sizeof(RAP_NetSessionGetInfo_REQ) /* req string */ @@ -1784,7 +1789,7 @@ int cli_NetSessionGetInfo(struct cli_state *cli, char *workstation, void (*fn)(c int res = -1; - bzero(param, sizeof(param)); + memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WsessionGetInfo, RAP_NetSessionGetInfo_REQ, RAP_SESSION_INFO_L2); PUTSTRING(p, workstation, RAP_MACHNAME_LEN-1); @@ -1844,7 +1849,7 @@ int cli_NetSessionGetInfo(struct cli_state *cli, char *workstation, void (*fn)(c /**************************************************************************** call a NetSessionDel - close a session to an SMB server ****************************************************************************/ -int cli_NetSessionDel(struct cli_state *cli, char *workstation) +int cli_NetSessionDel(struct cli_state *cli, const char *workstation) { char param[WORDSIZE /* api number */ +sizeof(RAP_NetSessionDel_REQ) /* req string */ @@ -1857,7 +1862,7 @@ int cli_NetSessionDel(struct cli_state *cli, char *workstation) int rprcnt, rdrcnt; int res; - bzero(param, sizeof(param)); + memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WsessionDel, RAP_NetSessionDel_REQ, NULL); PUTSTRING(p, workstation, RAP_MACHNAME_LEN-1); PUTWORD(p,0); /* reserved word of 0 */ @@ -1888,7 +1893,7 @@ int cli_NetSessionDel(struct cli_state *cli, char *workstation) } -int cli_NetConnectionEnum(struct cli_state *cli, char *qualifier, void (*fn)(uint16 conid, uint16 contype, uint16 numopens, uint16 numusers, uint32 contime, char *username, char *netname)) +int cli_NetConnectionEnum(struct cli_state *cli, const char *qualifier, void (*fn)(uint16 conid, uint16 contype, uint16 numopens, uint16 numusers, uint32 contime, const char *username, const char *netname)) { char param[WORDSIZE /* api number */ +sizeof(RAP_NetConnectionEnum_REQ) /* req string */ @@ -1902,7 +1907,7 @@ int cli_NetConnectionEnum(struct cli_state *cli, char *qualifier, void (*fn)(uin int rprcnt, rdrcnt; int res = -1; - bzero(param, sizeof(param)); + memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WconnectionEnum, RAP_NetConnectionEnum_REQ, RAP_CONNECTION_INFO_L1); PUTSTRING(p, qualifier, RAP_MACHNAME_LEN-1);/* Workstation name */ -- cgit From cd68afe31256ad60748b34f7318a180cfc2127cc Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Wed, 30 Jan 2002 06:08:46 +0000 Subject: Removed version number from file header. Changed "SMB/Netbios" to "SMB/CIFS" in file header. (This used to be commit 6a58c9bd06d0d7502a24bf5ce5a2faf0a146edfa) --- source3/libsmb/clirap2.c | 1 - 1 file changed, 1 deletion(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 2fde0c70e5..00cd4b15f3 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -1,6 +1,5 @@ /* Samba Unix/Linux SMB client library - Version 3.0 More client RAP (SMB Remote Procedure Calls) functions Copyright (C) 2001 Steve French (sfrench@us.ibm.com) Copyright (C) 2001 Jim McDonough (jmcd@us.ibm.com) -- cgit From e90b65284812aaa5ff9e9935ce9bbad7791cbbcd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 15 Jul 2002 10:35:28 +0000 Subject: updated the 3.0 branch from the head branch - ready for alpha18 (This used to be commit 03ac082dcb375b6f3ca3d810a6a6367542bc23ce) --- source3/libsmb/clirap2.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 00cd4b15f3..9c3ec212d5 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -1493,7 +1493,7 @@ int cli_NetPrintQEnum(struct cli_state *cli, for (j=0;j Date: Fri, 3 Jan 2003 08:28:12 +0000 Subject: Merge from HEAD - make Samba compile with -Wwrite-strings without additional warnings. (Adds a lot of const). Andrew Bartlett (This used to be commit 3a7458f9472432ef12c43008414925fd1ce8ea0c) --- source3/libsmb/clirap2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 9c3ec212d5..948e88061a 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -128,7 +128,7 @@ pull_ascii_pstring(s, off?(r+off-c):"");\ } while(0) -static char *make_header(char *param, uint16 apinum, char *reqfmt, char *datafmt) +static char *make_header(char *param, uint16 apinum, const char *reqfmt, const char *datafmt) { PUTWORD(param,apinum); if (reqfmt) -- cgit From ce72beb2b558d86fb49063c6b1fa00e07952ce56 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 3 Jul 2003 19:11:31 +0000 Subject: Removed strupper/strlower macros that automatically map to strupper_m/strlower_m. I really want people to think about when they're using multibyte strings. Jeremy. (This used to be commit ff222716a08af65d26ad842ce4c2841cc6540959) --- source3/libsmb/clirap2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 948e88061a..669b33860d 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -1396,11 +1396,11 @@ BOOL cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation) PUTDWORD(p, 0); /* Null pointer */ PUTDWORD(p, 0); /* Null pointer */ fstrcpy(upperbuf, user); - strupper(upperbuf); + strupper_m(upperbuf); PUTSTRINGF(p, upperbuf, RAP_USERNAME_LEN); p++; /* strange format, but ok */ fstrcpy(upperbuf, workstation); - strupper(upperbuf); + strupper_m(upperbuf); PUTSTRINGF(p, upperbuf, RAP_MACHNAME_LEN); PUTWORD(p, CLI_BUFFER_SIZE); PUTWORD(p, CLI_BUFFER_SIZE); -- cgit From 062f89bc2833bf49f873a7fd5c2624babd702db0 Mon Sep 17 00:00:00 2001 From: Herb Lewis Date: Fri, 15 Aug 2003 01:42:30 +0000 Subject: get rid of some sompiler warnings on IRIX (This used to be commit a6a39c61e8228c8b3b7552ab3c61ec3a6a639143) --- source3/libsmb/clirap2.c | 63 +++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 27 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 669b33860d..12a3d63aff 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -153,7 +153,8 @@ int cli_NetGroupDelete(struct cli_state *cli, const char *group_name ) char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt, res; + unsigned int rdrcnt,rprcnt; + int res; char param[WORDSIZE /* api number */ +sizeof(RAP_NetGroupDel_REQ) /* parm string */ +1 /* no ret string */ @@ -204,7 +205,8 @@ int cli_NetGroupAdd(struct cli_state *cli, RAP_GROUP_INFO_1 * grinfo ) char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt,res; + unsigned int rdrcnt,rprcnt; + int res; char param[WORDSIZE /* api number */ +sizeof(RAP_NetGroupAdd_REQ) /* req string */ +sizeof(RAP_GROUP_INFO_L1) /* return string */ @@ -272,7 +274,7 @@ int cli_RNetGroupEnum(struct cli_state *cli, void (*fn)(const char *, const char char *p; char *rparam = NULL; char *rdata = NULL; - int rprcnt, rdrcnt; + unsigned int rprcnt, rdrcnt; int res = -1; @@ -332,7 +334,8 @@ int cli_NetGroupDelUser(struct cli_state * cli, const char *group_name, const ch char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt,res; + unsigned int rdrcnt,rprcnt; + int res; char param[WORDSIZE /* api number */ +sizeof(RAP_NetGroupDelUser_REQ) /* parm string */ +1 /* no ret string */ @@ -390,7 +393,8 @@ int cli_NetGroupAddUser(struct cli_state * cli, const char *group_name, const ch char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt,res; + unsigned int rdrcnt,rprcnt; + int res; char param[WORDSIZE /* api number */ +sizeof(RAP_NetGroupAddUser_REQ) /* parm string */ +1 /* no ret string */ @@ -446,7 +450,7 @@ int cli_NetGroupGetUsers(struct cli_state * cli, const char *group_name, void (* char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt; + unsigned int rdrcnt,rprcnt; int res = -1; char param[WORDSIZE /* api number */ +sizeof(RAP_NetGroupGetUsers_REQ)/* parm string */ @@ -501,7 +505,7 @@ int cli_NetUserGetGroups(struct cli_state * cli, const char *user_name, void (*f char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt; + unsigned int rdrcnt,rprcnt; int res = -1; char param[WORDSIZE /* api number */ +sizeof(RAP_NetUserGetGroups_REQ)/* parm string */ @@ -560,7 +564,8 @@ int cli_NetUserDelete(struct cli_state *cli, const char * user_name ) char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt, res; + unsigned int rdrcnt,rprcnt; + int res; char param[WORDSIZE /* api number */ +sizeof(RAP_NetGroupDel_REQ) /* parm string */ +1 /* no ret string */ @@ -614,7 +619,8 @@ int cli_NetUserAdd(struct cli_state *cli, RAP_USER_INFO_1 * userinfo ) char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt,res; + unsigned int rdrcnt,rprcnt; + int res; char param[WORDSIZE /* api number */ +sizeof(RAP_NetUserAdd2_REQ) /* req string */ +sizeof(RAP_USER_INFO_L1) /* data string */ @@ -702,7 +708,7 @@ int cli_RNetUserEnum(struct cli_state *cli, void (*fn)(const char *, const char char *p; char *rparam = NULL; char *rdata = NULL; - int rprcnt, rdrcnt; + unsigned int rprcnt, rdrcnt; int res = -1; @@ -770,7 +776,7 @@ int cli_NetFileClose(struct cli_state *cli, uint32 file_id ) char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt; + unsigned int rdrcnt,rprcnt; char param[WORDSIZE /* api number */ +sizeof(RAP_WFileClose2_REQ) /* req string */ +1 /* no ret string */ @@ -816,7 +822,8 @@ int cli_NetFileGetInfo(struct cli_state *cli, uint32 file_id, void (*fn)(const c char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt, res; + unsigned int rdrcnt,rprcnt; + int res; char param[WORDSIZE /* api number */ +sizeof(RAP_WFileGetInfo2_REQ) /* req string */ +sizeof(RAP_FILE_INFO_L3) /* return string */ @@ -893,7 +900,7 @@ int cli_NetFileEnum(struct cli_state *cli, char * user, char * base_path, void ( char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt; + unsigned int rdrcnt,rprcnt; char param[WORDSIZE /* api number */ +sizeof(RAP_WFileEnum2_REQ) /* req string */ +sizeof(RAP_FILE_INFO_L3) /* return string */ @@ -965,7 +972,8 @@ int cli_NetShareAdd(struct cli_state *cli, RAP_SHARE_INFO_2 * sinfo ) char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt,res; + unsigned int rdrcnt,rprcnt; + int res; char param[WORDSIZE /* api number */ +sizeof(RAP_WShareAdd_REQ) /* req string */ +sizeof(RAP_SHARE_INFO_L2) /* return string */ @@ -1035,7 +1043,8 @@ int cli_NetShareDelete(struct cli_state *cli, const char * share_name ) char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt, res; + unsigned int rdrcnt,rprcnt; + int res; char param[WORDSIZE /* api number */ +sizeof(RAP_WShareDel_REQ) /* req string */ +1 /* no ret string */ @@ -1097,7 +1106,7 @@ BOOL cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) { char *rparam = NULL; char *rdata = NULL; - int rdrcnt,rprcnt; + unsigned int rdrcnt,rprcnt; char *p; char param[WORDSIZE /* api number */ +sizeof(RAP_NetServerEnum2_REQ) /* req string */ @@ -1177,7 +1186,7 @@ BOOL cli_get_server_domain(struct cli_state *cli) { char *rparam = NULL; char *rdata = NULL; - int rdrcnt,rprcnt; + unsigned int rdrcnt,rprcnt; char *p; char param[WORDSIZE /* api number */ +sizeof(RAP_WWkstaGetInfo_REQ) /* req string */ @@ -1242,7 +1251,7 @@ BOOL cli_get_server_type(struct cli_state *cli, uint32 *pstype) { char *rparam = NULL; char *rdata = NULL; - int rdrcnt,rprcnt; + unsigned int rdrcnt,rprcnt; char *p; char param[WORDSIZE /* api number */ +sizeof(RAP_WserverGetInfo_REQ) /* req string */ @@ -1309,7 +1318,7 @@ BOOL cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 sty { char *rparam = NULL; char *rdata = NULL; - int rdrcnt,rprcnt; + unsigned int rdrcnt,rprcnt; char *p; char param[WORDSIZE /* api number */ +sizeof(RAP_NetServerEnum2_REQ) /* req string */ @@ -1378,7 +1387,7 @@ BOOL cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation) char *rparam = NULL; char *rdata = NULL; char *p; - int rdrcnt,rprcnt; + unsigned int rdrcnt,rprcnt; char param[WORDSIZE /* api number */ +sizeof(RAP_NetWkstaUserLogoff_REQ) /* req string */ +sizeof(RAP_USER_LOGOFF_INFO_L1) /* return string */ @@ -1436,7 +1445,7 @@ int cli_NetPrintQEnum(struct cli_state *cli, char *p; char *rparam = NULL; char *rdata = NULL; - int rprcnt, rdrcnt; + unsigned int rprcnt, rdrcnt; int res = -1; @@ -1540,7 +1549,7 @@ int cli_NetPrintQGetInfo(struct cli_state *cli, const char *printer, char *p; char *rparam = NULL; char *rdata = NULL; - int rprcnt, rdrcnt; + unsigned int rprcnt, rdrcnt; int res = -1; @@ -1639,7 +1648,7 @@ int cli_RNetServiceEnum(struct cli_state *cli, void (*fn)(const char *, const ch char *p; char *rparam = NULL; char *rdata = NULL; - int rprcnt, rdrcnt; + unsigned int rprcnt, rdrcnt; int res = -1; @@ -1708,7 +1717,7 @@ int cli_NetSessionEnum(struct cli_state *cli, void (*fn)(char *, char *, uint16, char *p; char *rparam = NULL; char *rdata = NULL; - int rprcnt, rdrcnt; + unsigned int rprcnt, rdrcnt; int res = -1; memset(param, '\0', sizeof(param)); @@ -1784,7 +1793,7 @@ int cli_NetSessionGetInfo(struct cli_state *cli, const char *workstation, void ( char *p; char *rparam = NULL; char *rdata = NULL; - int rprcnt, rdrcnt; + unsigned int rprcnt, rdrcnt; int res = -1; @@ -1858,7 +1867,7 @@ int cli_NetSessionDel(struct cli_state *cli, const char *workstation) char *p; char *rparam = NULL; char *rdata = NULL; - int rprcnt, rdrcnt; + unsigned int rprcnt, rdrcnt; int res; memset(param, '\0', sizeof(param)); @@ -1903,7 +1912,7 @@ int cli_NetConnectionEnum(struct cli_state *cli, const char *qualifier, void (*f char *p; char *rparam = NULL; char *rdata = NULL; - int rprcnt, rdrcnt; + unsigned int rprcnt, rdrcnt; int res = -1; memset(param, '\0', sizeof(param)); -- cgit From 1875e46d05c21f4ca0e1163ecfd41b470dbce09a Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 10 Apr 2005 14:44:56 +0000 Subject: r6275: Implement RAP version of enumusers/enumgroups level 0. No, I've not gone mad, this is to test future changes to enumeration functions... This can successfully list users from nt4 and w2k3sp1. Volker (This used to be commit c73f2656fd89e227a8a3e2ab20f7393ff2c515c7) --- source3/libsmb/clirap2.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 12a3d63aff..d8a8519550 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -329,6 +329,70 @@ int cli_RNetGroupEnum(struct cli_state *cli, void (*fn)(const char *, const char return res; } +int cli_RNetGroupEnum0(struct cli_state *cli, + void (*fn)(const char *, void *), + void *state) +{ + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetGroupEnum_REQ) /* parm string */ + +sizeof(RAP_GROUP_INFO_L0) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + char *p; + char *rparam = NULL; + char *rdata = NULL; + unsigned int rprcnt, rdrcnt; + int res = -1; + + + memset(param, '\0', sizeof(param)); + p = make_header(param, RAP_WGroupEnum, + RAP_NetGroupEnum_REQ, RAP_GROUP_INFO_L0); + PUTWORD(p,0); /* Info level 0 */ /* Hmmm. I *very* much suspect this + is the resume count, at least + that's what smbd believes... */ + PUTWORD(p,0xFFE0); /* Return buffer size */ + + if (cli_api(cli, + param, PTR_DIFF(p,param),8, + NULL, 0, 0xFFE0 /* data area size */, + &rparam, &rprcnt, + &rdata, &rdrcnt)) { + res = GETRES(rparam); + cli->rap_error = res; + if(cli->rap_error == 234) + DEBUG(1,("Not all group names were returned (such as those longer than 21 characters)\n")); + else if (cli->rap_error != 0) { + DEBUG(1,("NetGroupEnum gave error %d\n", cli->rap_error)); + } + } + + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + + p = rparam + WORDSIZE; /* skip result */ + GETWORD(p, converter); + GETWORD(p, count); + + for (i=0,p=rdata;irap_error = res; + if (cli->rap_error != 0) { + DEBUG(1,("NetUserEnum gave error %d\n", cli->rap_error)); + } + } + if (rdata) { + if (res == 0 || res == ERRmoredata) { + int i, converter, count; + char username[RAP_USERNAME_LEN]; + + p = rparam + WORDSIZE; /* skip result */ + GETWORD(p, converter); + GETWORD(p, count); + + for (i=0,p=rdata;i Date: Tue, 19 Apr 2005 19:23:49 +0000 Subject: r6392: - Fixes bug 2564: when smbc_opendir() was called with a file rather than a directory, the errno returned could end up as ENOENT rather than ENOTDIR. - Fixes some compiler warnings which showed up on IRIX, as reported by James Peach. (This used to be commit 615a62b21f8d2f7f97bde2f166ddd6849d39b95c) --- source3/libsmb/clirap2.c | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index d8a8519550..b15ee1a63e 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -369,10 +369,9 @@ int cli_RNetGroupEnum0(struct cli_state *cli, if (rdata) { if (res == 0 || res == ERRmoredata) { - int i, converter, count; + int i, count; - p = rparam + WORDSIZE; /* skip result */ - GETWORD(p, converter); + p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ GETWORD(p, count); for (i=0,p=rdata;irap_error = res; if (res == 0 || res == ERRmoredata) { - int i, converter, count; + int i, count; - p = rparam + WORDSIZE; - GETWORD(p, converter); + p = rparam + WORDSIZE + WORDSIZE; GETWORD(p, count); p = rdata; @@ -1798,10 +1792,9 @@ int cli_RNetServiceEnum(struct cli_state *cli, void (*fn)(const char *, const ch if (rdata) { if (res == 0 || res == ERRmoredata) { - int i, converter, count; + int i, count; - p = rparam + WORDSIZE; /* skip result */ - GETWORD(p, converter); + p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ GETWORD(p, count); for (i=0,p=rdata;i Date: Tue, 19 Jul 2005 02:37:04 +0000 Subject: r8572: Remove crufty #define NO_SYSLOG as it's not used at all anymore. (This used to be commit 985dbb47d925e79c1195ca219f7ab5d6648b22b8) --- source3/libsmb/clirap2.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index b15ee1a63e..a327bae317 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -76,8 +76,6 @@ /* */ /*****************************************************/ -#define NO_SYSLOG - #include "includes.h" #define WORDSIZE 2 -- cgit From 95a81a33513517c25476286453c89ab1884e9919 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 28 Jun 2006 04:27:43 +0000 Subject: r16606: Klocwork #1990. Malloc the correct size. Jeremy. (This used to be commit d1a1c4e092877a6ea0f98eed2a37a96d42c36323) --- source3/libsmb/clirap2.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index a327bae317..147683689d 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -211,11 +211,20 @@ int cli_NetGroupAdd(struct cli_state *cli, RAP_GROUP_INFO_1 * grinfo ) +WORDSIZE /* info level */ +WORDSIZE]; /* reserved word */ - char data[1024]; - /* offset into data of free format strings. Will be updated */ /* by PUTSTRINGP macro and end up with total data length. */ int soffset = RAP_GROUPNAME_LEN + 1 + DWORDSIZE; + char *data; + size_t data_size; + + /* Allocate data. */ + data_size = MAX(soffset + strlen(grinfo->comment) + 1, 1024); + + data = SMB_MALLOC(data_size); + if (!data) { + DEBUG (1, ("Malloc fail\n")); + return -1; + } /* now send a SMBtrans command with api WGroupAdd */ @@ -253,6 +262,7 @@ int cli_NetGroupAdd(struct cli_state *cli, RAP_GROUP_INFO_1 * grinfo ) DEBUG(4,("NetGroupAdd failed\n")); } + SAFE_FREE(data); SAFE_FREE(rparam); SAFE_FREE(rdata); -- cgit From fbdcf2663b56007a438ac4f0d8d82436b1bfe688 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 11 Jul 2006 18:01:26 +0000 Subject: r16945: Sync trunk -> 3.0 for 3.0.24 code. Still need to do the upper layer directories but this is what everyone is waiting for.... Jeremy. (This used to be commit 9dafb7f48ca3e7af956b0a7d1720c2546fc4cfb8) --- source3/libsmb/clirap2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 147683689d..3c23310f66 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -220,7 +220,7 @@ int cli_NetGroupAdd(struct cli_state *cli, RAP_GROUP_INFO_1 * grinfo ) /* Allocate data. */ data_size = MAX(soffset + strlen(grinfo->comment) + 1, 1024); - data = SMB_MALLOC(data_size); + data = SMB_MALLOC_ARRAY(char, data_size); if (!data) { DEBUG (1, ("Malloc fail\n")); return -1; -- cgit From cfed7a5a71aab48b1d5b758df318b991a95592a5 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 9 Oct 2006 07:17:37 +0000 Subject: r19184: W2k3 returns its name for the GetServerInfo RAP call. Do the same. Implement 'net rap server name'. Volker (This used to be commit 919385ed2a2a07e848bc0baaac9ed3d1964d4386) --- source3/libsmb/clirap2.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 3c23310f66..d6a44f4ea2 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -1414,6 +1414,62 @@ BOOL cli_get_server_type(struct cli_state *cli, uint32 *pstype) return(res == 0 || res == ERRmoredata); } +BOOL cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, + char **servername) +{ + char *rparam = NULL; + char *rdata = NULL; + unsigned int rdrcnt,rprcnt; + char *p; + char param[WORDSIZE /* api number */ + +sizeof(RAP_WserverGetInfo_REQ) /* req string */ + +sizeof(RAP_SERVER_INFO_L1) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + BOOL res = False; + fstring tmp; + + /* send a SMBtrans command with api NetServerGetInfo */ + p = make_header(param, RAP_WserverGetInfo, + RAP_WserverGetInfo_REQ, RAP_SERVER_INFO_L1); + PUTWORD(p, 1); /* info level */ + PUTWORD(p, CLI_BUFFER_SIZE); + + if (!cli_api(cli, + param, PTR_DIFF(p,param), 8, /* params, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt /* return data, return size */ + )) { + goto failed; + } + + if (GETRES(rparam) != 0) { + goto failed; + } + + if (rdrcnt < 16) { + DEBUG(10, ("invalid data count %d, expected >= 16\n", rdrcnt)); + goto failed; + } + + if (pull_ascii(tmp, rdata, sizeof(tmp)-1, 16, STR_TERMINATE) == -1) { + DEBUG(10, ("pull_ascii failed\n")); + goto failed; + } + + if (!(*servername = talloc_strdup(mem_ctx, tmp))) { + DEBUG(1, ("talloc_strdup failed\n")); + goto failed; + } + + res = True; + + failed: + SAFE_FREE(rparam); + SAFE_FREE(rdata); + return res; +} /************************************************************************* * -- cgit From 261c004d7bf85de945a1a3956c1d8f15075bc224 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 30 Mar 2007 22:25:08 +0000 Subject: r22014: Make us pass RANDOMIPC test again :-(. This is an ugly check-in, but I've no option. Jeremy. (This used to be commit c3a565081d70b209a4f9e6e8f1859bf7194a5f74) --- source3/libsmb/clirap2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index d6a44f4ea2..9ab8997871 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -91,7 +91,7 @@ /* put string s at p with max len n and increment p past string */ #define PUTSTRING(p,s,n) do {\ push_ascii(p,s?s:"",n?n:256,STR_TERMINATE);\ - p = skip_string(p,1);\ + p = push_skip_string(p,1);\ } while(0) /* put string s and p, using fixed len l, and increment p by l */ #define PUTSTRINGF(p,s,l) do {\ @@ -111,7 +111,7 @@ /* get asciiz string s from p, increment p past string */ #define GETSTRING(p,s) do {\ pull_ascii_pstring(s,p);\ - p = skip_string(p,1);\ + p = push_skip_string(p,1);\ } while(0) /* get fixed length l string s from p, increment p by l */ #define GETSTRINGF(p,s,l) do {\ -- cgit From 0a2cc569a1803f459f7db77d03e6e90ae30aa35d Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 2 Apr 2007 20:10:21 +0000 Subject: r22045: As Volker noticed, skip_string's last argument is redundent. Remove it. Jeremy. (This used to be commit 140881cfbb59ce4a699b5900efe02bf315be7bd5) --- source3/libsmb/clirap2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 9ab8997871..1730626066 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -91,7 +91,7 @@ /* put string s at p with max len n and increment p past string */ #define PUTSTRING(p,s,n) do {\ push_ascii(p,s?s:"",n?n:256,STR_TERMINATE);\ - p = push_skip_string(p,1);\ + p = push_skip_string(p);\ } while(0) /* put string s and p, using fixed len l, and increment p by l */ #define PUTSTRINGF(p,s,l) do {\ @@ -111,7 +111,7 @@ /* get asciiz string s from p, increment p past string */ #define GETSTRING(p,s) do {\ pull_ascii_pstring(s,p);\ - p = push_skip_string(p,1);\ + p = push_skip_string(p);\ } while(0) /* get fixed length l string s from p, increment p by l */ #define GETSTRINGF(p,s,l) do {\ -- cgit From d824b98f80ba186030cbb70b3a1e5daf80469ecd Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 9 Jul 2007 19:25:36 +0000 Subject: r23779: Change from v2 or later to v3 or later. Jeremy. (This used to be commit 407e6e695b8366369b7c76af1ff76869b45347b3) --- source3/libsmb/clirap2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 1730626066..45a89c775e 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -7,7 +7,7 @@ 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 + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, -- cgit From 5e54558c6dea67b56bbfaba5698f3a434d3dffb6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 00:52:41 +0000 Subject: r23784: use the GPLv3 boilerplate as recommended by the FSF and the license text (This used to be commit b0132e94fc5fef936aa766fb99a306b3628e9f07) --- source3/libsmb/clirap2.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 45a89c775e..23113003f0 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -16,8 +16,7 @@ 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. + along with this program. If not, see . */ /*****************************************************/ -- cgit From 4d910553dcf8e19f4b1d6fb65ee9d5473a55cbbd Mon Sep 17 00:00:00 2001 From: Karolin Seeger Date: Thu, 18 Oct 2007 13:00:46 +0200 Subject: Add net rap file user (This used to be commit 2972c97e5e676964585de930601f083c19080735) --- source3/libsmb/clirap2.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 23113003f0..b8fe31a562 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -1021,7 +1021,10 @@ int cli_NetFileGetInfo(struct cli_state *cli, uint32 file_id, void (*fn)(const c * False - failure * ****************************************************************************/ -int cli_NetFileEnum(struct cli_state *cli, char * user, char * base_path, void (*fn)(const char *, const char *, uint16, uint16, uint32)) +int cli_NetFileEnum(struct cli_state *cli, const char * user, + const char * base_path, + void (*fn)(const char *, const char *, uint16, uint16, + uint32)) { char *rparam = NULL; char *rdata = NULL; -- cgit From 30191d1a5704ad2b158386b511558972d539ce47 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 18 Oct 2007 17:40:25 -0700 Subject: RIP BOOL. Convert BOOL -> bool. I found a few interesting bugs in various places whilst doing this (places that assumed BOOL == int). I also need to fix the Samba4 pidl generation (next checkin). Jeremy. (This used to be commit f35a266b3cbb3e5fa6a86be60f34fe340a3ca71f) --- source3/libsmb/clirap2.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index b8fe31a562..6be7fb6a56 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -1231,7 +1231,7 @@ int cli_NetShareDelete(struct cli_state *cli, const char * share_name ) * False - failure * ************************************************************************/ -BOOL cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) +bool cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) { char *rparam = NULL; char *rdata = NULL; @@ -1311,7 +1311,7 @@ BOOL cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) * Origins: samba 2.0.6 source/libsmb/clientgen.c cli_NetServerEnum() * ************************************************************************/ -BOOL cli_get_server_domain(struct cli_state *cli) +bool cli_get_server_domain(struct cli_state *cli) { char *rparam = NULL; char *rdata = NULL; @@ -1376,7 +1376,7 @@ BOOL cli_get_server_domain(struct cli_state *cli) * Origins: samba 2.0.6 source/libsmb/clientgen.c cli_NetServerEnum() * ************************************************************************/ -BOOL cli_get_server_type(struct cli_state *cli, uint32 *pstype) +bool cli_get_server_type(struct cli_state *cli, uint32 *pstype) { char *rparam = NULL; char *rdata = NULL; @@ -1416,7 +1416,7 @@ BOOL cli_get_server_type(struct cli_state *cli, uint32 *pstype) return(res == 0 || res == ERRmoredata); } -BOOL cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, +bool cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, char **servername) { char *rparam = NULL; @@ -1428,7 +1428,7 @@ BOOL cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, +sizeof(RAP_SERVER_INFO_L1) /* return string */ +WORDSIZE /* info level */ +WORDSIZE]; /* buffer size */ - BOOL res = False; + bool res = False; fstring tmp; /* send a SMBtrans command with api NetServerGetInfo */ @@ -1499,7 +1499,7 @@ BOOL cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, * False - failure * ************************************************************************/ -BOOL cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 stype) +bool cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 stype) { char *rparam = NULL; char *rdata = NULL; @@ -1512,7 +1512,7 @@ BOOL cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 sty +WORDSIZE /* buffer size */ +DWORDSIZE /* server type */ +RAP_MACHNAME_LEN]; /* workgroup */ - BOOL found_server = False; + bool found_server = False; int res = -1; /* send a SMBtrans command with api NetServerEnum */ @@ -1566,7 +1566,7 @@ BOOL cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 sty /**************************************************************************** perform a NetWkstaUserLogoff ****************************************************************************/ -BOOL cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation) +bool cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation) { char *rparam = NULL; char *rdata = NULL; -- cgit From e23fea92013a4c1de7f9addcea2b95789ed5c36d Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 30 Nov 2007 16:45:44 -0800 Subject: Whitespace cleanup. Jeremy. (This used to be commit 4dfe19be1c3a63b8517c6580c9cd363c7271693d) --- source3/libsmb/clirap2.c | 410 +++++++++++++++++++++++------------------------ 1 file changed, 201 insertions(+), 209 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 6be7fb6a56..f522e13345 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -1,20 +1,19 @@ -/* - Samba Unix/Linux SMB client library +/* + Samba Unix/Linux SMB client library More client RAP (SMB Remote Procedure Calls) functions Copyright (C) 2001 Steve French (sfrench@us.ibm.com) Copyright (C) 2001 Jim McDonough (jmcd@us.ibm.com) - - + 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 3 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, see . */ @@ -30,8 +29,8 @@ /* supports all RAP command codes since some */ /* are quite obsolete and a few are specific */ /* to a particular network operating system */ -/* */ -/* Although it has largely been replaced */ +/* */ +/* Although it has largely been replaced */ /* for complex remote admistration and management */ /* (of servers) by the relatively newer */ /* DCE/RPC based remote API (which better handles */ @@ -73,9 +72,9 @@ /* WPrintJobEnum (API num 76, level 2) */ /* WPrintJobDel (API num 81) */ /* */ -/*****************************************************/ +/*****************************************************/ -#include "includes.h" +#include "includes.h" #define WORDSIZE 2 #define DWORDSIZE 4 @@ -128,9 +127,9 @@ static char *make_header(char *param, uint16 apinum, const char *reqfmt, const char *datafmt) { PUTWORD(param,apinum); - if (reqfmt) + if (reqfmt) PUTSTRING(param,reqfmt,0); - else + else *param++ = (char) 0; if (datafmt) @@ -140,7 +139,6 @@ static char *make_header(char *param, uint16 apinum, const char *reqfmt, const c return param; } - /**************************************************************************** call a NetGroupDelete - delete user group from remote server @@ -159,20 +157,20 @@ int cli_NetGroupDelete(struct cli_state *cli, const char *group_name ) +WORDSIZE]; /* reserved word */ /* now send a SMBtrans command with api GroupDel */ - p = make_header(param, RAP_WGroupDel, RAP_NetGroupDel_REQ, NULL); + p = make_header(param, RAP_WGroupDel, RAP_NetGroupDel_REQ, NULL); PUTSTRING(p, group_name, RAP_GROUPNAME_LEN); PUTWORD(p,0); /* reserved word MBZ on input */ - - if (cli_api(cli, + + if (cli_api(cli, param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ NULL, 0, 200, /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ { res = GETRES(rparam); - + if (res == 0) { - /* nothing to do */ + /* nothing to do */ } else if ((res == 5) || (res == 65)) { DEBUG(1, ("Access Denied\n")); @@ -182,15 +180,15 @@ int cli_NetGroupDelete(struct cli_state *cli, const char *group_name ) } else { DEBUG(4,("NetGroupDelete res=%d\n", res)); - } + } } else { res = -1; DEBUG(4,("NetGroupDelete failed\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return res; } @@ -212,7 +210,7 @@ int cli_NetGroupAdd(struct cli_state *cli, RAP_GROUP_INFO_1 * grinfo ) /* offset into data of free format strings. Will be updated */ /* by PUTSTRINGP macro and end up with total data length. */ - int soffset = RAP_GROUPNAME_LEN + 1 + DWORDSIZE; + int soffset = RAP_GROUPNAME_LEN + 1 + DWORDSIZE; char *data; size_t data_size; @@ -226,27 +224,27 @@ int cli_NetGroupAdd(struct cli_state *cli, RAP_GROUP_INFO_1 * grinfo ) } /* now send a SMBtrans command with api WGroupAdd */ - + p = make_header(param, RAP_WGroupAdd, - RAP_NetGroupAdd_REQ, RAP_GROUP_INFO_L1); + RAP_NetGroupAdd_REQ, RAP_GROUP_INFO_L1); PUTWORD(p, 1); /* info level */ PUTWORD(p, 0); /* reserved word 0 */ - + p = data; PUTSTRINGF(p, grinfo->group_name, RAP_GROUPNAME_LEN); PUTBYTE(p, 0); /* pad byte 0 */ PUTSTRINGP(p, grinfo->comment, data, soffset); - - if (cli_api(cli, + + if (cli_api(cli, param, sizeof(param), 1024, /* Param, length, maxlen */ data, soffset, sizeof(data), /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ { res = GETRES(rparam); - + if (res == 0) { - /* nothing to do */ + /* nothing to do */ } else if ((res == 5) || (res == 65)) { DEBUG(1, ("Access Denied\n")); } @@ -260,7 +258,7 @@ int cli_NetGroupAdd(struct cli_state *cli, RAP_GROUP_INFO_1 * grinfo ) res = -1; DEBUG(4,("NetGroupAdd failed\n")); } - + SAFE_FREE(data); SAFE_FREE(rparam); SAFE_FREE(rdata); @@ -280,11 +278,11 @@ int cli_RNetGroupEnum(struct cli_state *cli, void (*fn)(const char *, const char +WORDSIZE]; /* buffer size */ char *p; char *rparam = NULL; - char *rdata = NULL; + char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; - - + + memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WGroupEnum, RAP_NetGroupEnum_REQ, RAP_GROUP_INFO_L1); @@ -298,7 +296,7 @@ int cli_RNetGroupEnum(struct cli_state *cli, void (*fn)(const char *, const char &rdata, &rdrcnt)) { res = GETRES(rparam); cli->rap_error = res; - if(cli->rap_error == 234) + if(cli->rap_error == 234) DEBUG(1,("Not all group names were returned (such as those longer than 21 characters)\n")); else if (cli->rap_error != 0) { DEBUG(1,("NetGroupEnum gave error %d\n", cli->rap_error)); @@ -322,14 +320,14 @@ int cli_RNetGroupEnum(struct cli_state *cli, void (*fn)(const char *, const char GETSTRINGP(p, comment, rdata, converter); fn(groupname, comment, cli); - } + } } else { DEBUG(4,("NetGroupEnum res=%d\n", res)); } } else { DEBUG(4,("NetGroupEnum no data returned\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); @@ -347,11 +345,11 @@ int cli_RNetGroupEnum0(struct cli_state *cli, +WORDSIZE]; /* buffer size */ char *p; char *rparam = NULL; - char *rdata = NULL; + char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; - - + + memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WGroupEnum, RAP_NetGroupEnum_REQ, RAP_GROUP_INFO_L0); @@ -367,7 +365,7 @@ int cli_RNetGroupEnum0(struct cli_state *cli, &rdata, &rdrcnt)) { res = GETRES(rparam); cli->rap_error = res; - if(cli->rap_error == 234) + if(cli->rap_error == 234) DEBUG(1,("Not all group names were returned (such as those longer than 21 characters)\n")); else if (cli->rap_error != 0) { DEBUG(1,("NetGroupEnum gave error %d\n", cli->rap_error)); @@ -385,14 +383,14 @@ int cli_RNetGroupEnum0(struct cli_state *cli, char groupname[RAP_GROUPNAME_LEN]; GETSTRINGF(p, groupname, RAP_GROUPNAME_LEN); fn(groupname, cli); - } + } } else { DEBUG(4,("NetGroupEnum res=%d\n", res)); } } else { DEBUG(4,("NetGroupEnum no data returned\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); @@ -417,14 +415,14 @@ int cli_NetGroupDelUser(struct cli_state * cli, const char *group_name, const ch PUTSTRING(p,group_name,RAP_GROUPNAME_LEN); PUTSTRING(p,user_name,RAP_USERNAME_LEN); - if (cli_api(cli, + if (cli_api(cli, param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ NULL, 0, 200, /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ { res = GETRES(rparam); - + switch(res) { case 0: break; @@ -451,11 +449,11 @@ int cli_NetGroupDelUser(struct cli_state * cli, const char *group_name, const ch res = -1; DEBUG(4,("NetGroupDelUser failed\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - - return res; + + return res; } int cli_NetGroupAddUser(struct cli_state * cli, const char *group_name, const char *user_name) @@ -476,14 +474,14 @@ int cli_NetGroupAddUser(struct cli_state * cli, const char *group_name, const ch PUTSTRING(p,group_name,RAP_GROUPNAME_LEN); PUTSTRING(p,user_name,RAP_USERNAME_LEN); - if (cli_api(cli, + if (cli_api(cli, param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ NULL, 0, 200, /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ { res = GETRES(rparam); - + switch(res) { case 0: break; @@ -507,10 +505,10 @@ int cli_NetGroupAddUser(struct cli_state * cli, const char *group_name, const ch res = -1; DEBUG(4,("NetGroupAddUser failed\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return res; } @@ -641,20 +639,20 @@ int cli_NetUserDelete(struct cli_state *cli, const char * user_name ) +WORDSIZE]; /* reserved word */ /* now send a SMBtrans command with api UserDel */ - p = make_header(param, RAP_WUserDel, RAP_NetGroupDel_REQ, NULL); + p = make_header(param, RAP_WUserDel, RAP_NetGroupDel_REQ, NULL); PUTSTRING(p, user_name, RAP_USERNAME_LEN); PUTWORD(p,0); /* reserved word MBZ on input */ - - if (cli_api(cli, + + if (cli_api(cli, param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ NULL, 0, 200, /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ { res = GETRES(rparam); - + if (res == 0) { - /* nothing to do */ + /* nothing to do */ } else if ((res == 5) || (res == 65)) { DEBUG(1, ("Access Denied\n")); @@ -664,15 +662,15 @@ int cli_NetUserDelete(struct cli_state *cli, const char * user_name ) } else { DEBUG(4,("NetUserDelete res=%d\n", res)); - } + } } else { res = -1; DEBUG(4,("NetUserDelete failed\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return res; } @@ -681,12 +679,9 @@ int cli_NetUserDelete(struct cli_state *cli, const char * user_name ) ****************************************************************************/ int cli_NetUserAdd(struct cli_state *cli, RAP_USER_INFO_1 * userinfo ) { - - - char *rparam = NULL; char *rdata = NULL; - char *p; + char *p; unsigned int rdrcnt,rprcnt; int res; char param[WORDSIZE /* api number */ @@ -695,7 +690,7 @@ int cli_NetUserAdd(struct cli_state *cli, RAP_USER_INFO_1 * userinfo ) +WORDSIZE /* info level */ +WORDSIZE /* buffer length */ +WORDSIZE]; /* reserved */ - + char data[1024]; /* offset into data of free format strings. Will be updated */ /* by PUTSTRINGP macro and end up with total data length. */ @@ -732,17 +727,17 @@ int cli_NetUserAdd(struct cli_state *cli, RAP_USER_INFO_1 * userinfo ) PUTWORD(p, userinfo->userflags); PUTSTRINGP(p, userinfo->logon_script, data, soffset); - if (cli_api(cli, + if (cli_api(cli, param, sizeof(param), 1024, /* Param, length, maxlen */ data, soffset, sizeof(data), /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ { res = GETRES(rparam); - + if (res == 0) { - /* nothing to do */ - } + /* nothing to do */ + } else if ((res == 5) || (res == 65)) { DEBUG(1, ("Access Denied\n")); } @@ -756,7 +751,7 @@ int cli_NetUserAdd(struct cli_state *cli, RAP_USER_INFO_1 * userinfo ) res = -1; DEBUG(4,("NetUserAdd failed\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); @@ -775,10 +770,9 @@ int cli_RNetUserEnum(struct cli_state *cli, void (*fn)(const char *, const char +WORDSIZE]; /* buffer size */ char *p; char *rparam = NULL; - char *rdata = NULL; + char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; - memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WUserEnum, @@ -828,7 +822,7 @@ int cli_RNetUserEnum(struct cli_state *cli, void (*fn)(const char *, const char } else { DEBUG(4,("NetUserEnum no data returned\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); @@ -846,10 +840,9 @@ int cli_RNetUserEnum0(struct cli_state *cli, +WORDSIZE]; /* buffer size */ char *p; char *rparam = NULL; - char *rdata = NULL; + char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; - memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WUserEnum, @@ -887,7 +880,7 @@ int cli_RNetUserEnum0(struct cli_state *cli, } else { DEBUG(4,("NetUserEnum no data returned\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); @@ -911,31 +904,31 @@ int cli_NetFileClose(struct cli_state *cli, uint32 file_id ) /* now send a SMBtrans command with api RNetShareEnum */ p = make_header(param, RAP_WFileClose2, RAP_WFileClose2_REQ, NULL); - PUTDWORD(p, file_id); - - if (cli_api(cli, + PUTDWORD(p, file_id); + + if (cli_api(cli, param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ NULL, 0, 200, /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ { res = GETRES(rparam); - + if (res == 0) { - /* nothing to do */ + /* nothing to do */ } else if (res == 2314){ DEBUG(1, ("NetFileClose2 - attempt to close non-existant file open instance\n")); } else { DEBUG(4,("NetFileClose2 res=%d\n", res)); - } + } } else { res = -1; DEBUG(4,("NetFileClose2 failed\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return res; } @@ -959,11 +952,11 @@ int cli_NetFileGetInfo(struct cli_state *cli, uint32 file_id, void (*fn)(const c /* now send a SMBtrans command with api RNetShareEnum */ p = make_header(param, RAP_WFileGetInfo2, - RAP_WFileGetInfo2_REQ, RAP_FILE_INFO_L3); + RAP_WFileGetInfo2_REQ, RAP_FILE_INFO_L3); PUTDWORD(p, file_id); PUTWORD(p, 3); /* info level */ - PUTWORD(p, 0x1000); /* buffer size */ - if (cli_api(cli, + PUTWORD(p, 0x1000); /* buffer size */ + if (cli_api(cli, param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ NULL, 0, 0x1000, /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ @@ -973,7 +966,7 @@ int cli_NetFileGetInfo(struct cli_state *cli, uint32 file_id, void (*fn)(const c if (res == 0 || res == ERRmoredata) { int converter,id, perms, locks; pstring fpath, fuser; - + p = rparam + WORDSIZE; /* skip result */ GETWORD(p, converter); @@ -983,38 +976,38 @@ int cli_NetFileGetInfo(struct cli_state *cli, uint32 file_id, void (*fn)(const c GETWORD(p, locks); GETSTRINGP(p, fpath, rdata, converter); GETSTRINGP(p, fuser, rdata, converter); - + fn(fpath, fuser, perms, locks, id); } else { DEBUG(4,("NetFileGetInfo2 res=%d\n", res)); - } + } } else { res = -1; DEBUG(4,("NetFileGetInfo2 failed\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return res; } /**************************************************************************** * Call a NetFileEnum2 - list open files on an SMB server -* -* PURPOSE: Remotes a NetFileEnum API call to the current server or target +* +* PURPOSE: Remotes a NetFileEnum API call to the current server or target * server listing the files open via the network (and their * corresponding open instance ids) -* +* * Dependencies: none * -* Parameters: +* Parameters: * cli - pointer to cli_state structure * user - if present, return only files opened by this remote user -* base_path - if present, return only files opened below this +* base_path - if present, return only files opened below this * base path * fn - display function to invoke for each entry in the result -* +* * * Returns: * True - success @@ -1043,35 +1036,35 @@ int cli_NetFileEnum(struct cli_state *cli, const char * user, /* now send a SMBtrans command with api RNetShareEnum */ p = make_header(param, RAP_WFileEnum2, - RAP_WFileEnum2_REQ, RAP_FILE_INFO_L3); + RAP_WFileEnum2_REQ, RAP_FILE_INFO_L3); PUTSTRING(p, base_path, 256); PUTSTRING(p, user, RAP_USERNAME_LEN); PUTWORD(p, 3); /* info level */ - PUTWORD(p, 0xFF00); /* buffer size */ + PUTWORD(p, 0xFF00); /* buffer size */ PUTDWORD(p, 0); /* zero out the resume key */ PUTDWORD(p, 0); /* or is this one the resume key? */ - - if (cli_api(cli, + + if (cli_api(cli, param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ NULL, 0, 0xFF00, /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ { int res = GETRES(rparam); - + if (res == 0 || res == ERRmoredata) { int converter, i; p = rparam + WORDSIZE; /* skip result */ GETWORD(p, converter); GETWORD(p, count); - + p = rdata; for (i=0; ipath, data, soffset); PUTSTRINGF(p, sinfo->password, RAP_SPASSWD_LEN); SCVAL(p,-1,0x0A); /* required 0x0A at end of password */ - - if (cli_api(cli, + + if (cli_api(cli, param, sizeof(param), 1024, /* Param, length, maxlen */ data, soffset, sizeof(data), /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ { res = rparam? SVAL(rparam,0) : -1; - + if (res == 0) { - /* nothing to do */ + /* nothing to do */ } else { DEBUG(4,("NetShareAdd res=%d\n", res)); - } + } } else { res = -1; DEBUG(4,("NetShareAdd failed\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return res; } /**************************************************************************** @@ -1179,35 +1172,34 @@ int cli_NetShareDelete(struct cli_state *cli, const char * share_name ) +1 /* no ret string */ +RAP_SHARENAME_LEN /* share to del */ +WORDSIZE]; /* reserved word */ - /* now send a SMBtrans command with api RNetShareDelete */ p = make_header(param, RAP_WshareDel, RAP_WShareDel_REQ, NULL); PUTSTRING(p,share_name,RAP_SHARENAME_LEN); PUTWORD(p,0); /* reserved word MBZ on input */ - - if (cli_api(cli, + + if (cli_api(cli, param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ NULL, 0, 200, /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ { res = GETRES(rparam); - + if (res == 0) { - /* nothing to do */ + /* nothing to do */ } else { DEBUG(4,("NetShareDelete res=%d\n", res)); - } + } } else { res = -1; DEBUG(4,("NetShareDelete failed\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return res; } /************************************************************************* @@ -1220,7 +1212,7 @@ int cli_NetShareDelete(struct cli_state *cli, const char * share_name ) * * Dependencies: none * -* Parameters: +* Parameters: * cli - pointer to cli_state structure * workgroup - pointer to string containing name of domain * pdc_name - pointer to string that will contain PDC name @@ -1245,7 +1237,7 @@ bool cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) +DWORDSIZE /* server type */ +RAP_MACHNAME_LEN]; /* workgroup */ int count = -1; - + *pdc_name = '\0'; /* send a SMBtrans command with api NetServerEnum */ @@ -1255,15 +1247,15 @@ bool cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) PUTWORD(p, CLI_BUFFER_SIZE); PUTDWORD(p, SV_TYPE_DOMAIN_CTRL); PUTSTRING(p, workgroup, RAP_MACHNAME_LEN); - - if (cli_api(cli, + + if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ &rparam, &rprcnt, /* return params, return size */ &rdata, &rdrcnt /* return data, return size */ )) { cli->rap_error = GETRES(rparam); - + /* * We only really care to copy a name if the * API succeeded and we got back a name. @@ -1272,7 +1264,7 @@ bool cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ GETWORD(p, count); p = rdata; - + if (count > 0) GETSTRING(p, pdc_name); } @@ -1281,10 +1273,10 @@ bool cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) "Error was : %s.\n", cli->desthost, cli_errstr(cli) )); } } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return(count > 0); } @@ -1301,7 +1293,7 @@ bool cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) * * Dependencies: none * -* Parameters: +* Parameters: * cli - pointer to cli_state structure * * Returns: @@ -1323,34 +1315,34 @@ bool cli_get_server_domain(struct cli_state *cli) +WORDSIZE /* info level */ +WORDSIZE]; /* buffer size */ int res = -1; - + /* send a SMBtrans command with api NetWkstaGetInfo */ p = make_header(param, RAP_WWkstaGetInfo, RAP_WWkstaGetInfo_REQ, RAP_WKSTA_INFO_L10); PUTWORD(p, 10); /* info level */ PUTWORD(p, CLI_BUFFER_SIZE); - + if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ &rparam, &rprcnt, /* return params, return size */ &rdata, &rdrcnt)) { /* return data, return size */ res = GETRES(rparam); - p = rdata; - + p = rdata; + if (res == 0) { int converter; p = rparam + WORDSIZE; GETWORD(p, converter); - + p = rdata + DWORDSIZE + DWORDSIZE; /* skip computer & user names */ GETSTRINGP(p, cli->server_domain, rdata, converter); } } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return(res == 0); } @@ -1365,7 +1357,7 @@ bool cli_get_server_domain(struct cli_state *cli) * * Dependencies: none * -* Parameters: +* Parameters: * cli - pointer to cli_state structure * pstype - pointer to uint32 to contain returned server type * @@ -1388,31 +1380,31 @@ bool cli_get_server_type(struct cli_state *cli, uint32 *pstype) +WORDSIZE /* info level */ +WORDSIZE]; /* buffer size */ int res = -1; - + /* send a SMBtrans command with api NetServerGetInfo */ p = make_header(param, RAP_WserverGetInfo, RAP_WserverGetInfo_REQ, RAP_SERVER_INFO_L1); PUTWORD(p, 1); /* info level */ PUTWORD(p, CLI_BUFFER_SIZE); - - if (cli_api(cli, + + if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ &rparam, &rprcnt, /* return params, return size */ &rdata, &rdrcnt /* return data, return size */ )) { - + res = GETRES(rparam); - + if (res == 0 || res == ERRmoredata) { - p = rdata; + p = rdata; *pstype = IVAL(p,18) & ~SV_TYPE_LOCAL_LIST_ONLY; } } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return(res == 0 || res == ERRmoredata); } @@ -1430,14 +1422,14 @@ bool cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, +WORDSIZE]; /* buffer size */ bool res = False; fstring tmp; - + /* send a SMBtrans command with api NetServerGetInfo */ p = make_header(param, RAP_WserverGetInfo, RAP_WserverGetInfo_REQ, RAP_SERVER_INFO_L1); PUTWORD(p, 1); /* info level */ PUTWORD(p, CLI_BUFFER_SIZE); - - if (!cli_api(cli, + + if (!cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ &rparam, &rprcnt, /* return params, return size */ @@ -1445,7 +1437,7 @@ bool cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, )) { goto failed; } - + if (GETRES(rparam) != 0) { goto failed; } @@ -1484,12 +1476,12 @@ bool cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, * then we conclude the server type checks out. This routine * is useful to retrieve list of server's of a certain * type when all you have is a null session connection and -* can't remote API calls such as NetWkstaGetInfo or +* can't remote API calls such as NetWkstaGetInfo or * NetServerGetInfo. * * Dependencies: none * -* Parameters: +* Parameters: * cli - pointer to cli_state structure * workgroup - pointer to string containing domain * stype - server type @@ -1514,7 +1506,7 @@ bool cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 sty +RAP_MACHNAME_LEN]; /* workgroup */ bool found_server = False; int res = -1; - + /* send a SMBtrans command with api NetServerEnum */ p = make_header(param, RAP_NetServerEnum2, RAP_NetServerEnum2_REQ, RAP_SERVER_INFO_L0); @@ -1522,14 +1514,14 @@ bool cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 sty PUTWORD(p, CLI_BUFFER_SIZE); PUTDWORD(p, stype); PUTSTRING(p, workgroup, RAP_MACHNAME_LEN); - - if (cli_api(cli, + + if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ &rparam, &rprcnt, /* return params, return size */ &rdata, &rdrcnt /* return data, return size */ )) { - + res = GETRES(rparam); cli->rap_error = res; @@ -1555,10 +1547,10 @@ bool cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 sty "Error was : %s.\n", cli->desthost, cli_errstr(cli) )); } } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - + return found_server; } @@ -1580,7 +1572,7 @@ bool cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation) +WORDSIZE /* buffer size */ +WORDSIZE]; /* buffer size? */ fstring upperbuf; - + memset(param, 0, sizeof(param)); /* send a SMBtrans command with api NetWkstaUserLogoff */ @@ -1597,7 +1589,7 @@ bool cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation) PUTSTRINGF(p, upperbuf, RAP_MACHNAME_LEN); PUTWORD(p, CLI_BUFFER_SIZE); PUTWORD(p, CLI_BUFFER_SIZE); - + if (cli_api(cli, param, PTR_DIFF(p,param),1024, /* param, length, max */ NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ @@ -1605,17 +1597,17 @@ bool cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation) &rdata, &rdrcnt /* return data, return size */ )) { cli->rap_error = GETRES(rparam); - + if (cli->rap_error != 0) { DEBUG(4,("NetwkstaUserLogoff gave error %d\n", cli->rap_error)); } } - + SAFE_FREE(rparam); SAFE_FREE(rdata); return (cli->rap_error == 0); } - + int cli_NetPrintQEnum(struct cli_state *cli, void (*qfn)(const char*,uint16,uint16,uint16,const char*,const char*,const char*,const char*,const char*,uint16,uint16), void (*jfn)(uint16,const char*,const char*,const char*,const char*,uint16,uint16,const char*,uint,uint,const char*)) @@ -1628,13 +1620,13 @@ int cli_NetPrintQEnum(struct cli_state *cli, +sizeof(RAP_SMB_PRINT_JOB_L1)]; /* more ret data */ char *p; char *rparam = NULL; - char *rdata = NULL; + char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; - + memset(param, '\0',sizeof(param)); - p = make_header(param, RAP_WPrintQEnum, + p = make_header(param, RAP_WPrintQEnum, RAP_NetPrintQEnum_REQ, RAP_PRINTQ_INFO_L2); PUTWORD(p,2); /* Info level 2 */ PUTWORD(p,0xFFE0); /* Return buffer size */ @@ -1687,7 +1679,7 @@ int cli_NetPrintQEnum(struct cli_state *cli, uint16 jid, pos, fsstatus; pstring ownername, notifyname, datatype, jparms, jstatus, jcomment; unsigned int submitted, jsize; - + GETWORD(p, jid); GETSTRINGF(p, ownername, RAP_USERNAME_LEN); p++; /* pad byte */ @@ -1700,7 +1692,7 @@ int cli_NetPrintQEnum(struct cli_state *cli, GETDWORD(p, submitted); GETDWORD(p, jsize); GETSTRINGP(p, jcomment, rdata, converter); - + jfn(jid, ownername, notifyname, datatype, jparms, pos, fsstatus, jstatus, submitted, jsize, jcomment); } @@ -1712,11 +1704,11 @@ int cli_NetPrintQEnum(struct cli_state *cli, } else { DEBUG(4,("NetPrintQEnum no data returned\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - return res; + return res; } int cli_NetPrintQGetInfo(struct cli_state *cli, const char *printer, @@ -1725,17 +1717,17 @@ int cli_NetPrintQGetInfo(struct cli_state *cli, const char *printer, { char param[WORDSIZE /* api number */ +sizeof(RAP_NetPrintQGetInfo_REQ) /* req string */ - +sizeof(RAP_PRINTQ_INFO_L2) /* return string */ + +sizeof(RAP_PRINTQ_INFO_L2) /* return string */ +RAP_SHARENAME_LEN /* printer name */ +WORDSIZE /* info level */ +WORDSIZE /* buffer size */ +sizeof(RAP_SMB_PRINT_JOB_L1)]; /* more ret data */ char *p; char *rparam = NULL; - char *rdata = NULL; + char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; - + memset(param, '\0',sizeof(param)); p = make_header(param, RAP_WPrintQGetInfo, @@ -1762,7 +1754,7 @@ int cli_NetPrintQGetInfo(struct cli_state *cli, const char *printer, int rsize, converter; pstring qname, sep_file, print_proc, dest, parms, comment; uint16 jobcount, priority, start_time, until_time, status; - + p = rparam + WORDSIZE; GETWORD(p, converter); GETWORD(p, rsize); @@ -1801,7 +1793,7 @@ int cli_NetPrintQGetInfo(struct cli_state *cli, const char *printer, GETDWORD(p, submitted); GETDWORD(p, jsize); GETSTRINGP(p, jcomment, rdata, converter); - + jfn(jid, ownername, notifyname, datatype, jparms, pos, fsstatus, jstatus, submitted, jsize, jcomment); } @@ -1812,11 +1804,11 @@ int cli_NetPrintQGetInfo(struct cli_state *cli, const char *printer, } else { DEBUG(4,("NetPrintQGetInfo no data returned\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - return res; + return res; } /**************************************************************************** @@ -1831,15 +1823,15 @@ int cli_RNetServiceEnum(struct cli_state *cli, void (*fn)(const char *, const ch +WORDSIZE]; /* buffer size */ char *p; char *rparam = NULL; - char *rdata = NULL; + char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; - - + + memset(param, '\0', sizeof(param)); p = make_header(param, RAP_WServiceEnum, RAP_NetServiceEnum_REQ, RAP_SERVICE_INFO_L2); - PUTWORD(p,2); /* Info level 2 */ + PUTWORD(p,2); /* Info level 2 */ PUTWORD(p,0xFFE0); /* Return buffer size */ if (cli_api(cli, @@ -1849,7 +1841,7 @@ int cli_RNetServiceEnum(struct cli_state *cli, void (*fn)(const char *, const ch &rdata, &rdrcnt)) { res = GETRES(rparam); cli->rap_error = res; - if(cli->rap_error == 234) + if(cli->rap_error == 234) DEBUG(1,("Not all service names were returned (such as those longer than 15 characters)\n")); else if (cli->rap_error != 0) { DEBUG(1,("NetServiceEnum gave error %d\n", cli->rap_error)); @@ -1872,14 +1864,14 @@ int cli_RNetServiceEnum(struct cli_state *cli, void (*fn)(const char *, const ch GETSTRINGF(p, comment, RAP_SRVCCMNT_LEN); fn(servicename, comment, cli); /* BB add status too */ - } + } } else { DEBUG(4,("NetServiceEnum res=%d\n", res)); } } else { DEBUG(4,("NetServiceEnum no data returned\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); @@ -1899,12 +1891,12 @@ int cli_NetSessionEnum(struct cli_state *cli, void (*fn)(char *, char *, uint16, +WORDSIZE]; /* buffer size */ char *p; char *rparam = NULL; - char *rdata = NULL; + char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; - + memset(param, '\0', sizeof(param)); - p = make_header(param, RAP_WsessionEnum, + p = make_header(param, RAP_WsessionEnum, RAP_NetSessionEnum_REQ, RAP_SESSION_INFO_L2); PUTWORD(p,2); /* Info level 2 */ PUTWORD(p,0xFF); /* Return buffer size */ @@ -1924,7 +1916,7 @@ int cli_NetSessionEnum(struct cli_state *cli, void (*fn)(char *, char *, uint16, if (rdata) { if (res == 0 || res == ERRmoredata) { int i, converter, count; - + p = rparam + WORDSIZE; GETWORD(p, converter); GETWORD(p, count); @@ -1947,14 +1939,14 @@ int cli_NetSessionEnum(struct cli_state *cli, void (*fn)(char *, char *, uint16, fn(wsname, username, num_conns, num_opens, num_users, sess_time, idle_time, user_flags, clitype_name); } - + } else { DEBUG(4,("NetSessionEnum res=%d\n", res)); } } else { DEBUG(4,("NetSesssionEnum no data returned\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); @@ -1969,19 +1961,19 @@ int cli_NetSessionGetInfo(struct cli_state *cli, const char *workstation, void ( { char param[WORDSIZE /* api number */ +sizeof(RAP_NetSessionGetInfo_REQ) /* req string */ - +sizeof(RAP_SESSION_INFO_L2) /* return string */ + +sizeof(RAP_SESSION_INFO_L2) /* return string */ +RAP_MACHNAME_LEN /* wksta name */ +WORDSIZE /* info level */ +WORDSIZE]; /* buffer size */ char *p; char *rparam = NULL; - char *rdata = NULL; + char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; - + memset(param, '\0', sizeof(param)); - p = make_header(param, RAP_WsessionGetInfo, + p = make_header(param, RAP_WsessionGetInfo, RAP_NetSessionGetInfo_REQ, RAP_SESSION_INFO_L2); PUTSTRING(p, workstation, RAP_MACHNAME_LEN-1); PUTWORD(p,2); /* Info level 2 */ @@ -2000,7 +1992,7 @@ int cli_NetSessionGetInfo(struct cli_state *cli, const char *workstation, void ( if (rdata) { res = GETRES(rparam); - + if (res == 0 || res == ERRmoredata) { int converter; pstring wsname, username, clitype_name; @@ -2021,7 +2013,7 @@ int cli_NetSessionGetInfo(struct cli_state *cli, const char *workstation, void ( GETDWORD(p, idle_time); GETDWORD(p, user_flags); GETSTRINGP(p, clitype_name, rdata, converter); - + fn(wsname, username, num_conns, num_opens, num_users, sess_time, idle_time, user_flags, clitype_name); } else { @@ -2030,11 +2022,11 @@ int cli_NetSessionGetInfo(struct cli_state *cli, const char *workstation, void ( } else { DEBUG(4,("NetSessionGetInfo no data returned\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); - return res; + return res; } /**************************************************************************** @@ -2057,7 +2049,7 @@ int cli_NetSessionDel(struct cli_state *cli, const char *workstation) p = make_header(param, RAP_WsessionDel, RAP_NetSessionDel_REQ, NULL); PUTSTRING(p, workstation, RAP_MACHNAME_LEN-1); PUTWORD(p,0); /* reserved word of 0 */ - if (cli_api(cli, + if (cli_api(cli, param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ NULL, 0, 200, /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ @@ -2065,36 +2057,36 @@ int cli_NetSessionDel(struct cli_state *cli, const char *workstation) { res = GETRES(rparam); cli->rap_error = res; - + if (res == 0) { - /* nothing to do */ + /* nothing to do */ } else { DEBUG(4,("NetFileClose2 res=%d\n", res)); - } + } } else { res = -1; DEBUG(4,("NetFileClose2 failed\n")); } - + SAFE_FREE(rparam); SAFE_FREE(rdata); return res; } - + int cli_NetConnectionEnum(struct cli_state *cli, const char *qualifier, void (*fn)(uint16 conid, uint16 contype, uint16 numopens, uint16 numusers, uint32 contime, const char *username, const char *netname)) { char param[WORDSIZE /* api number */ +sizeof(RAP_NetConnectionEnum_REQ) /* req string */ - +sizeof(RAP_CONNECTION_INFO_L1) /* return string */ + +sizeof(RAP_CONNECTION_INFO_L1) /* return string */ +RAP_MACHNAME_LEN /* wksta name */ +WORDSIZE /* info level */ +WORDSIZE]; /* buffer size */ char *p; char *rparam = NULL; - char *rdata = NULL; + char *rdata = NULL; unsigned int rprcnt, rdrcnt; int res = -1; @@ -2140,7 +2132,7 @@ int cli_NetConnectionEnum(struct cli_state *cli, const char *qualifier, void (*f fn(conn_id, conn_type, num_opens, num_users, conn_time, username, netname); } - + } else { DEBUG(4,("NetConnectionEnum res=%d\n", res)); } -- cgit From fe1a12b22fd81ac01d30c0f561cacba82532cd0e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 3 Dec 2007 14:09:48 -0800 Subject: Remove pstring from clirap2 by completely rewriting the damn thing :-). Now with added paranoia. Jeremy. (This used to be commit b6b5f92bc9457220df384bdb13530c393d294ce7) --- source3/libsmb/clirap2.c | 3895 ++++++++++++++++++++++++++-------------------- 1 file changed, 2211 insertions(+), 1684 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index f522e13345..d5795643e8 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -3,6 +3,7 @@ More client RAP (SMB Remote Procedure Calls) functions Copyright (C) 2001 Steve French (sfrench@us.ibm.com) Copyright (C) 2001 Jim McDonough (jmcd@us.ibm.com) + Copyright (C) 2007 Jeremy Allison. jra@samba.org 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 @@ -80,916 +81,1140 @@ #define DWORDSIZE 4 #define PUTBYTE(p,b) do {SCVAL(p,0,b); p++;} while(0) -#define GETBYTE(p,b) do {b = CVAL(p,0); p++;} while(0) + +#define GETBYTE(p,b,endp) \ + do {\ + if (p+1 < endp) {\ + b = CVAL(p,0);\ + }\ + p++;\ + } while(0) + #define PUTWORD(p,w) do {SSVAL(p,0,w); p += WORDSIZE;} while(0) -#define GETWORD(p,w) do {w = SVAL(p,0); p += WORDSIZE;} while(0) + +#define GETWORD(p,w,endp) \ + do {\ + if (p+WORDSIZE < endp) {\ + w = SVAL(p,0);\ + }\ + p += WORDSIZE;\ + } while(0) + #define PUTDWORD(p,d) do {SIVAL(p,0,d); p += DWORDSIZE;} while(0) -#define GETDWORD(p,d) do {d = IVAL(p,0); p += DWORDSIZE;} while(0) -#define GETRES(p) p ? SVAL(p,0) : -1 + +#define GETDWORD(p,d,endp) \ + do {\ + if (p+DWORDSIZE < endp) {\ + d = IVAL(p,0);\ + }\ + p += DWORDSIZE;\ + } while(0) + +#define GETRES(p,endp) ((p && p+2 < endp) ? SVAL(p,0) : -1) + /* put string s at p with max len n and increment p past string */ -#define PUTSTRING(p,s,n) do {\ - push_ascii(p,s?s:"",n?n:256,STR_TERMINATE);\ - p = push_skip_string(p);\ - } while(0) +#define PUTSTRING(p,s,n) \ + do {\ + push_ascii(p,s?s:"",n?n:256,STR_TERMINATE);\ + p = push_skip_string(p);\ + } while(0) + /* put string s and p, using fixed len l, and increment p by l */ -#define PUTSTRINGF(p,s,l) do {\ - push_ascii(p,s?s:"",l,STR_TERMINATE);\ - p += l;\ - } while (0) +#define PUTSTRINGF(p,s,l) \ + do {\ + push_ascii(p,s?s:"",l,STR_TERMINATE);\ + p += l;\ + } while (0) + /* put string pointer at p, supplying offset o from rdata r, store */ /* dword offset at p, increment p by 4 and o by length of s. This */ /* means on the first call, you must calc the offset yourself! */ -#define PUTSTRINGP(p,s,r,o) do {\ - if (s) {\ - push_ascii(r+o,s,strlen(s)+1,STR_TERMINATE);\ - PUTDWORD(p,o);\ - o += strlen(s) + 1;\ - } else PUTDWORD(p,0);\ - }while(0); -/* get asciiz string s from p, increment p past string */ -#define GETSTRING(p,s) do {\ - pull_ascii_pstring(s,p);\ - p = push_skip_string(p);\ - } while(0) -/* get fixed length l string s from p, increment p by l */ -#define GETSTRINGF(p,s,l) do {\ - pull_ascii_pstring(s,p);\ - p += l;\ - } while(0) -/* get string s from offset (obtained at p) from rdata r - converter c */ -#define GETSTRINGP(p,s,r,c) do {\ - uint32 off;\ - GETDWORD(p,off);\ - off &= 0x0000FFFF; /* mask the obsolete segment number from the offset */ \ - pull_ascii_pstring(s, off?(r+off-c):"");\ - } while(0) + +#define PUTSTRINGP(p,s,r,o) \ + do {\ + if (s) {\ + push_ascii(r+o,s,strlen(s)+1,STR_TERMINATE);\ + PUTDWORD(p,o);\ + o += strlen(s) + 1;\ + } else {\ + PUTDWORD(p,0);\ + }\ + }while(0); + +/* get asciiz string dest from src, return increment past string */ + +static size_t rap_getstring(TALLOC_CTX *ctx, char *src, char **dest, const char *endp) +{ + char *p1; + size_t len; + + *dest = NULL; + for (p1 = src, len = 0; *p1 && p1 < endp; len++) + p1++; + if (!*p1) { + len++; + } + pull_string_talloc(ctx,src,0,dest,src,len,STR_ASCII); + return len; +} + +/* get fixed length l string dest from src, return increment for src */ + +static size_t rap_getstringf(char *src, char *dest, size_t l, size_t dlen, char *endp) +{ + char *p1; + size_t len; + + if (dlen) { + dest[0] = '\0'; + } + for (p1 = src, len = 0; *p1 && p1 < endp; len++) { + p1++; + } + if (!*p1) { + len++; + } + if (len > l) { + len = l; + } + if (len) { + pull_ascii(dest,src,len,len,STR_ASCII); + } + return l; +} + +/* get string dest from offset (obtained at p) from rdata r - converter c */ +static size_t rap_getstringp(TALLOC_CTX *ctx, char *p, char **dest, char *r, uint16_t c, char *endp) +{ + uint32_t off = 0; + const char *src; + size_t len=0; + + *dest = NULL; + if (p+4 < endp) { + GETDWORD(p,off,endp); + off &= 0x0000FFFF; /* mask the obsolete segment number from the offset */ + off -= c; + } + if (r+off > endp || r+off < r) { + src=""; + len=1; + } else { + const char *p1; + src=r+off; + for (p1 = src, len = 0; *p1 && p1 < endp; len++) { + p1++; + } + if (!*p1) { + len++; + } + } + pull_string_talloc(ctx,src,0,dest,src,len,STR_ASCII); + return len; +} static char *make_header(char *param, uint16 apinum, const char *reqfmt, const char *datafmt) { - PUTWORD(param,apinum); - if (reqfmt) - PUTSTRING(param,reqfmt,0); - else - *param++ = (char) 0; - - if (datafmt) - PUTSTRING(param,datafmt,0); - else - *param++ = (char) 0; - - return param; + PUTWORD(param,apinum); + if (reqfmt) + PUTSTRING(param,reqfmt,0); + else + *param++ = (char) 0; + + if (datafmt) + PUTSTRING(param,datafmt,0); + else + *param++ = (char) 0; + + return param; } /**************************************************************************** call a NetGroupDelete - delete user group from remote server ****************************************************************************/ -int cli_NetGroupDelete(struct cli_state *cli, const char *group_name ) + +int cli_NetGroupDelete(struct cli_state *cli, const char *group_name) { - char *rparam = NULL; - char *rdata = NULL; - char *p; - unsigned int rdrcnt,rprcnt; - int res; - char param[WORDSIZE /* api number */ + char *rparam = NULL; + char *rdata = NULL; + char *p; + unsigned int rdrcnt,rprcnt; + int res = -1; + char param[WORDSIZE /* api number */ +sizeof(RAP_NetGroupDel_REQ) /* parm string */ +1 /* no ret string */ +RAP_GROUPNAME_LEN /* group to del */ +WORDSIZE]; /* reserved word */ - /* now send a SMBtrans command with api GroupDel */ - p = make_header(param, RAP_WGroupDel, RAP_NetGroupDel_REQ, NULL); - PUTSTRING(p, group_name, RAP_GROUPNAME_LEN); - PUTWORD(p,0); /* reserved word MBZ on input */ + /* now send a SMBtrans command with api GroupDel */ + p = make_header(param, RAP_WGroupDel, RAP_NetGroupDel_REQ, NULL); + PUTSTRING(p, group_name, RAP_GROUPNAME_LEN); + PUTWORD(p,0); /* reserved word MBZ on input */ - if (cli_api(cli, + if (cli_api(cli, param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ NULL, 0, 200, /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ - { - res = GETRES(rparam); - - if (res == 0) { - /* nothing to do */ - } - else if ((res == 5) || (res == 65)) { - DEBUG(1, ("Access Denied\n")); - } - else if (res == 2220) { - DEBUG (1, ("Group does not exist\n")); - } - else { - DEBUG(4,("NetGroupDelete res=%d\n", res)); - } - } else { - res = -1; - DEBUG(4,("NetGroupDelete failed\n")); - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return res; + { + char *endp = rparam + rprcnt; + res = GETRES(rparam,endp); + + if (res == 0) { + /* nothing to do */ + } else if ((res == 5) || (res == 65)) { + DEBUG(1, ("Access Denied\n")); + } else if (res == 2220) { + DEBUG (1, ("Group does not exist\n")); + } else { + DEBUG(4,("NetGroupDelete res=%d\n", res)); + } + } else { + res = -1; + DEBUG(4,("NetGroupDelete failed\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; } /**************************************************************************** call a NetGroupAdd - add user group to remote server ****************************************************************************/ -int cli_NetGroupAdd(struct cli_state *cli, RAP_GROUP_INFO_1 * grinfo ) + +int cli_NetGroupAdd(struct cli_state *cli, RAP_GROUP_INFO_1 *grinfo) { - char *rparam = NULL; - char *rdata = NULL; - char *p; - unsigned int rdrcnt,rprcnt; - int res; - char param[WORDSIZE /* api number */ + char *rparam = NULL; + char *rdata = NULL; + char *p; + unsigned int rdrcnt,rprcnt; + int res = -1; + char param[WORDSIZE /* api number */ +sizeof(RAP_NetGroupAdd_REQ) /* req string */ +sizeof(RAP_GROUP_INFO_L1) /* return string */ +WORDSIZE /* info level */ +WORDSIZE]; /* reserved word */ - /* offset into data of free format strings. Will be updated */ - /* by PUTSTRINGP macro and end up with total data length. */ - int soffset = RAP_GROUPNAME_LEN + 1 + DWORDSIZE; - char *data; - size_t data_size; + /* offset into data of free format strings. Will be updated */ + /* by PUTSTRINGP macro and end up with total data length. */ + int soffset = RAP_GROUPNAME_LEN + 1 + DWORDSIZE; + char *data; + size_t data_size; - /* Allocate data. */ - data_size = MAX(soffset + strlen(grinfo->comment) + 1, 1024); + /* Allocate data. */ + data_size = MAX(soffset + strlen(grinfo->comment) + 1, 1024); - data = SMB_MALLOC_ARRAY(char, data_size); - if (!data) { - DEBUG (1, ("Malloc fail\n")); - return -1; - } + data = SMB_MALLOC_ARRAY(char, data_size); + if (!data) { + DEBUG (1, ("Malloc fail\n")); + return -1; + } - /* now send a SMBtrans command with api WGroupAdd */ + /* now send a SMBtrans command with api WGroupAdd */ - p = make_header(param, RAP_WGroupAdd, - RAP_NetGroupAdd_REQ, RAP_GROUP_INFO_L1); - PUTWORD(p, 1); /* info level */ - PUTWORD(p, 0); /* reserved word 0 */ + p = make_header(param, RAP_WGroupAdd, + RAP_NetGroupAdd_REQ, RAP_GROUP_INFO_L1); + PUTWORD(p, 1); /* info level */ + PUTWORD(p, 0); /* reserved word 0 */ - p = data; - PUTSTRINGF(p, grinfo->group_name, RAP_GROUPNAME_LEN); - PUTBYTE(p, 0); /* pad byte 0 */ - PUTSTRINGP(p, grinfo->comment, data, soffset); + p = data; + PUTSTRINGF(p, grinfo->group_name, RAP_GROUPNAME_LEN); + PUTBYTE(p, 0); /* pad byte 0 */ + PUTSTRINGP(p, grinfo->comment, data, soffset); - if (cli_api(cli, + if (cli_api(cli, param, sizeof(param), 1024, /* Param, length, maxlen */ data, soffset, sizeof(data), /* data, length, maxlen */ &rparam, &rprcnt, /* return params, length */ &rdata, &rdrcnt)) /* return data, length */ - { - res = GETRES(rparam); - - if (res == 0) { - /* nothing to do */ - } else if ((res == 5) || (res == 65)) { - DEBUG(1, ("Access Denied\n")); - } - else if (res == 2223) { - DEBUG (1, ("Group already exists\n")); - } - else { - DEBUG(4,("NetGroupAdd res=%d\n", res)); - } - } else { - res = -1; - DEBUG(4,("NetGroupAdd failed\n")); - } - - SAFE_FREE(data); - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return res; + { + char *endp = rparam + rprcnt; + res = GETRES(rparam, endp); + + if (res == 0) { + /* nothing to do */ + } else if ((res == 5) || (res == 65)) { + DEBUG(1, ("Access Denied\n")); + } else if (res == 2223) { + DEBUG (1, ("Group already exists\n")); + } else { + DEBUG(4,("NetGroupAdd res=%d\n", res)); + } + } else { + res = -1; + DEBUG(4,("NetGroupAdd failed\n")); + } + + SAFE_FREE(data); + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; } /**************************************************************************** -call a NetGroupEnum - try and list user groups on a different host + Call a NetGroupEnum - try and list user groups on a different host. ****************************************************************************/ + int cli_RNetGroupEnum(struct cli_state *cli, void (*fn)(const char *, const char *, void *), void *state) { - char param[WORDSIZE /* api number */ + char param[WORDSIZE /* api number */ +sizeof(RAP_NetGroupEnum_REQ) /* parm string */ +sizeof(RAP_GROUP_INFO_L1) /* return string */ +WORDSIZE /* info level */ +WORDSIZE]; /* buffer size */ - char *p; - char *rparam = NULL; - char *rdata = NULL; - unsigned int rprcnt, rdrcnt; - int res = -1; - + char *p; + char *rparam = NULL; + char *rdata = NULL; + unsigned int rprcnt, rdrcnt; + int res = -1; - memset(param, '\0', sizeof(param)); - p = make_header(param, RAP_WGroupEnum, + memset(param, '\0', sizeof(param)); + p = make_header(param, RAP_WGroupEnum, RAP_NetGroupEnum_REQ, RAP_GROUP_INFO_L1); - PUTWORD(p,1); /* Info level 1 */ /* add level 0 */ - PUTWORD(p,0xFFE0); /* Return buffer size */ + PUTWORD(p,1); /* Info level 1 */ /* add level 0 */ + PUTWORD(p,0xFFE0); /* Return buffer size */ - if (cli_api(cli, + if (cli_api(cli, param, PTR_DIFF(p,param),8, NULL, 0, 0xFFE0 /* data area size */, &rparam, &rprcnt, &rdata, &rdrcnt)) { - res = GETRES(rparam); - cli->rap_error = res; - if(cli->rap_error == 234) - DEBUG(1,("Not all group names were returned (such as those longer than 21 characters)\n")); - else if (cli->rap_error != 0) { - DEBUG(1,("NetGroupEnum gave error %d\n", cli->rap_error)); - } - } - - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int i, converter, count; - - p = rparam + WORDSIZE; /* skip result */ - GETWORD(p, converter); - GETWORD(p, count); - - for (i=0,p=rdata;irap_error = res; + if(cli->rap_error == 234) { + DEBUG(1,("Not all group names were returned (such as those longer than 21 characters)\n")); + } else if (cli->rap_error != 0) { + DEBUG(1,("NetGroupEnum gave error %d\n", cli->rap_error)); + } + } + + if (!rdata) { + DEBUG(4,("NetGroupEnum no data returned\n")); + goto out; + } + + if (res == 0 || res == ERRmoredata) { + char *endp = rparam + rprcnt; + int i, converter = 0, count = 0; + TALLOC_CTX *frame = talloc_stackframe(); + + p = rparam + WORDSIZE; /* skip result */ + GETWORD(p, converter, endp); + GETWORD(p, count, endp); + + endp = rdata + rdrcnt; + for (i=0,p=rdata; irap_error = res; + if(cli->rap_error == 234) { + DEBUG(1,("Not all group names were returned (such as those longer than 21 characters)\n")); + } else if (cli->rap_error != 0) { + DEBUG(1,("NetGroupEnum gave error %d\n", cli->rap_error)); + } + } - if (cli_api(cli, - param, PTR_DIFF(p,param),8, - NULL, 0, 0xFFE0 /* data area size */, - &rparam, &rprcnt, - &rdata, &rdrcnt)) { - res = GETRES(rparam); - cli->rap_error = res; - if(cli->rap_error == 234) - DEBUG(1,("Not all group names were returned (such as those longer than 21 characters)\n")); - else if (cli->rap_error != 0) { - DEBUG(1,("NetGroupEnum gave error %d\n", cli->rap_error)); - } - } - - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int i, count; - - p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ - GETWORD(p, count); - - for (i=0,p=rdata;irap_error = res; - if (res != 0) { - DEBUG(1,("NetGroupGetUsers gave error %d\n", res)); - } - } - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int i, count; - fstring username; - p = rparam + WORDSIZE + WORDSIZE; - GETWORD(p, count); - - for (i=0,p=rdata; irap_error = res; + if (res != 0) { + DEBUG(1,("NetGroupGetUsers gave error %d\n", res)); + } + } + + if (!rdata) { + DEBUG(4,("NetGroupGetUsers no data returned\n")); + goto out; + } + + if (res == 0 || res == ERRmoredata) { + char *endp = rparam + rprcnt; + int i, count = 0; + char username[RAP_USERNAME_LEN]; + + p = rparam + WORDSIZE + WORDSIZE; + GETWORD(p, count, endp); + + endp = rdata + rdrcnt; + for (i=0,p=rdata; irap_error = res; - if (res != 0) { - DEBUG(1,("NetUserGetGroups gave error %d\n", res)); - } - } - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int i, count; - fstring groupname; - p = rparam + WORDSIZE + WORDSIZE; - GETWORD(p, count); - - for (i=0,p=rdata; irap_error = res; + if (res != 0) { + DEBUG(1,("NetUserGetGroups gave error %d\n", res)); + } + } + + if (!rdata) { + DEBUG(4,("NetUserGetGroups no data returned\n")); + goto out; + } + if (res == 0 || res == ERRmoredata) { + char *endp = rparam + rprcnt; + int i, count = 0; + char groupname[RAP_GROUPNAME_LEN]; + + p = rparam + WORDSIZE + WORDSIZE; + GETWORD(p, count, endp); + + endp = rdata + rdrcnt; + for (i=0,p=rdata; ipasswrd) - PUTWORD(p,MIN(strlen(userinfo->passwrd), RAP_UPASSWD_LEN)); - else - PUTWORD(p, 0); /* password length */ - - p = data; - memset(data, '\0', soffset); - - PUTSTRINGF(p, userinfo->user_name, RAP_USERNAME_LEN); - PUTBYTE(p, 0); /* pad byte 0 */ - PUTSTRINGF(p, userinfo->passwrd, RAP_UPASSWD_LEN); - PUTDWORD(p, 0); /* pw age - n.a. on user add */ - PUTWORD(p, userinfo->priv); - PUTSTRINGP(p, userinfo->home_dir, data, soffset); - PUTSTRINGP(p, userinfo->comment, data, soffset); - PUTWORD(p, userinfo->userflags); - PUTSTRINGP(p, userinfo->logon_script, data, soffset); - - if (cli_api(cli, - param, sizeof(param), 1024, /* Param, length, maxlen */ - data, soffset, sizeof(data), /* data, length, maxlen */ - &rparam, &rprcnt, /* return params, length */ - &rdata, &rdrcnt)) /* return data, length */ - { - res = GETRES(rparam); - - if (res == 0) { - /* nothing to do */ - } - else if ((res == 5) || (res == 65)) { - DEBUG(1, ("Access Denied\n")); - } - else if (res == 2224) { - DEBUG (1, ("User already exists\n")); - } - else { - DEBUG(4,("NetUserAdd res=%d\n", res)); - } - } else { - res = -1; - DEBUG(4,("NetUserAdd failed\n")); - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return res; + char *rparam = NULL; + char *rdata = NULL; + char *p; + unsigned int rdrcnt,rprcnt; + int res = -1; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetUserAdd2_REQ) /* req string */ + +sizeof(RAP_USER_INFO_L1) /* data string */ + +WORDSIZE /* info level */ + +WORDSIZE /* buffer length */ + +WORDSIZE]; /* reserved */ + + char data[1024]; + /* offset into data of free format strings. Will be updated */ + /* by PUTSTRINGP macro and end up with total data length. */ + int soffset=RAP_USERNAME_LEN+1 /* user name + pad */ + + RAP_UPASSWD_LEN /* password */ + + DWORDSIZE /* password age */ + + WORDSIZE /* privilege */ + + DWORDSIZE /* home dir ptr */ + + DWORDSIZE /* comment ptr */ + + WORDSIZE /* flags */ + + DWORDSIZE; /* login script ptr*/ + + /* now send a SMBtrans command with api NetUserAdd */ + p = make_header(param, RAP_WUserAdd2, + RAP_NetUserAdd2_REQ, RAP_USER_INFO_L1); + + PUTWORD(p, 1); /* info level */ + PUTWORD(p, 0); /* pwencrypt */ + if(userinfo->passwrd) + PUTWORD(p,MIN(strlen(userinfo->passwrd), RAP_UPASSWD_LEN)); + else + PUTWORD(p, 0); /* password length */ + + p = data; + memset(data, '\0', soffset); + + PUTSTRINGF(p, userinfo->user_name, RAP_USERNAME_LEN); + PUTBYTE(p, 0); /* pad byte 0 */ + PUTSTRINGF(p, userinfo->passwrd, RAP_UPASSWD_LEN); + PUTDWORD(p, 0); /* pw age - n.a. on user add */ + PUTWORD(p, userinfo->priv); + PUTSTRINGP(p, userinfo->home_dir, data, soffset); + PUTSTRINGP(p, userinfo->comment, data, soffset); + PUTWORD(p, userinfo->userflags); + PUTSTRINGP(p, userinfo->logon_script, data, soffset); + + if (cli_api(cli, + param, sizeof(param), 1024, /* Param, length, maxlen */ + data, soffset, sizeof(data), /* data, length, maxlen */ + &rparam, &rprcnt, /* return params, length */ + &rdata, &rdrcnt)) /* return data, length */ + { + char *endp = rparam + rprcnt; + res = GETRES(rparam, endp); + + if (res == 0) { + /* nothing to do */ + } else if ((res == 5) || (res == 65)) { + DEBUG(1, ("Access Denied\n")); + } else if (res == 2224) { + DEBUG (1, ("User already exists\n")); + } else { + DEBUG(4,("NetUserAdd res=%d\n", res)); + } + } else { + res = -1; + DEBUG(4,("NetUserAdd failed\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; } /**************************************************************************** call a NetUserEnum - try and list users on a different host ****************************************************************************/ + int cli_RNetUserEnum(struct cli_state *cli, void (*fn)(const char *, const char *, const char *, const char *, void *), void *state) { - char param[WORDSIZE /* api number */ - +sizeof(RAP_NetUserEnum_REQ) /* parm string */ - +sizeof(RAP_USER_INFO_L1) /* return string */ - +WORDSIZE /* info level */ - +WORDSIZE]; /* buffer size */ - char *p; - char *rparam = NULL; - char *rdata = NULL; - unsigned int rprcnt, rdrcnt; - int res = -1; - - memset(param, '\0', sizeof(param)); - p = make_header(param, RAP_WUserEnum, - RAP_NetUserEnum_REQ, RAP_USER_INFO_L1); - PUTWORD(p,1); /* Info level 1 */ - PUTWORD(p,0xFF00); /* Return buffer size */ - -/* BB Fix handling of large numbers of users to be returned */ - if (cli_api(cli, - param, PTR_DIFF(p,param),8, - NULL, 0, CLI_BUFFER_SIZE, - &rparam, &rprcnt, - &rdata, &rdrcnt)) { - res = GETRES(rparam); - cli->rap_error = res; - if (cli->rap_error != 0) { - DEBUG(1,("NetUserEnum gave error %d\n", cli->rap_error)); - } - } - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int i, converter, count; - char username[RAP_USERNAME_LEN]; - char userpw[RAP_UPASSWD_LEN]; - pstring comment, homedir, logonscript; - - p = rparam + WORDSIZE; /* skip result */ - GETWORD(p, converter); - GETWORD(p, count); - - for (i=0,p=rdata;irap_error = res; + if (cli->rap_error != 0) { + DEBUG(1,("NetUserEnum gave error %d\n", cli->rap_error)); + } + } + + if (!rdata) { + DEBUG(4,("NetUserEnum no data returned\n")); + goto out; + } + + if (res == 0 || res == ERRmoredata) { + int i, converter = 0, count = 0; + char username[RAP_USERNAME_LEN]; + char userpw[RAP_UPASSWD_LEN]; + char *endp = rparam + rprcnt; + char *comment, *homedir, *logonscript; + TALLOC_CTX *frame = talloc_stackframe(); + + p = rparam + WORDSIZE; /* skip result */ + GETWORD(p, converter, endp); + GETWORD(p, count, endp); + + endp = rdata + rdrcnt; + for (i=0,p=rdata;irap_error = res; - if (cli->rap_error != 0) { - DEBUG(1,("NetUserEnum gave error %d\n", cli->rap_error)); - } - } - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int i, count; - char username[RAP_USERNAME_LEN]; - - p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ - GETWORD(p, count); - - for (i=0,p=rdata;irap_error = res; + if (cli->rap_error != 0) { + DEBUG(1,("NetUserEnum gave error %d\n", cli->rap_error)); + } + } + + if (!rdata) { + DEBUG(4,("NetUserEnum no data returned\n")); + goto out; + } + + if (res == 0 || res == ERRmoredata) { + int i, count = 0; + char *endp = rparam + rprcnt; + char username[RAP_USERNAME_LEN]; + + p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ + GETWORD(p, count, endp); + + endp = rdata + rdrcnt; + for (i=0,p=rdata;ishare_name, RAP_SHARENAME_LEN); - PUTBYTE(p, 0); /* pad byte 0 */ - - PUTWORD(p, sinfo->share_type); - PUTSTRINGP(p, sinfo->comment, data, soffset); - PUTWORD(p, sinfo->perms); - PUTWORD(p, sinfo->maximum_users); - PUTWORD(p, sinfo->active_users); - PUTSTRINGP(p, sinfo->path, data, soffset); - PUTSTRINGF(p, sinfo->password, RAP_SPASSWD_LEN); - SCVAL(p,-1,0x0A); /* required 0x0A at end of password */ - - if (cli_api(cli, - param, sizeof(param), 1024, /* Param, length, maxlen */ - data, soffset, sizeof(data), /* data, length, maxlen */ - &rparam, &rprcnt, /* return params, length */ - &rdata, &rdrcnt)) /* return data, length */ - { - res = rparam? SVAL(rparam,0) : -1; - - if (res == 0) { - /* nothing to do */ - } - else { - DEBUG(4,("NetShareAdd res=%d\n", res)); - } - } else { - res = -1; - DEBUG(4,("NetShareAdd failed\n")); - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return res; + char *rparam = NULL; + char *rdata = NULL; + char *p; + unsigned int rdrcnt,rprcnt; + int res = -1; + char param[WORDSIZE /* api number */ + +sizeof(RAP_WShareAdd_REQ) /* req string */ + +sizeof(RAP_SHARE_INFO_L2) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* reserved word */ + char data[1024]; + /* offset to free format string section following fixed length data. */ + /* will be updated by PUTSTRINGP macro and will end up with total len */ + int soffset = RAP_SHARENAME_LEN + 1 /* share name + pad */ + + WORDSIZE /* share type */ + + DWORDSIZE /* comment pointer */ + + WORDSIZE /* permissions */ + + WORDSIZE /* max users */ + + WORDSIZE /* active users */ + + DWORDSIZE /* share path */ + + RAP_SPASSWD_LEN + 1; /* share password + pad */ + + memset(param,'\0',sizeof(param)); + /* now send a SMBtrans command with api RNetShareAdd */ + p = make_header(param, RAP_WshareAdd, + RAP_WShareAdd_REQ, RAP_SHARE_INFO_L2); + PUTWORD(p, 2); /* info level */ + PUTWORD(p, 0); /* reserved word 0 */ + + p = data; + PUTSTRINGF(p, sinfo->share_name, RAP_SHARENAME_LEN); + PUTBYTE(p, 0); /* pad byte 0 */ + + PUTWORD(p, sinfo->share_type); + PUTSTRINGP(p, sinfo->comment, data, soffset); + PUTWORD(p, sinfo->perms); + PUTWORD(p, sinfo->maximum_users); + PUTWORD(p, sinfo->active_users); + PUTSTRINGP(p, sinfo->path, data, soffset); + PUTSTRINGF(p, sinfo->password, RAP_SPASSWD_LEN); + SCVAL(p,-1,0x0A); /* required 0x0A at end of password */ + + if (cli_api(cli, + param, sizeof(param), 1024, /* Param, length, maxlen */ + data, soffset, sizeof(data), /* data, length, maxlen */ + &rparam, &rprcnt, /* return params, length */ + &rdata, &rdrcnt)) /* return data, length */ + { + char *endp = rparam + rprcnt; + res = GETRES(rparam, endp); + + if (res == 0) { + /* nothing to do */ + } else { + DEBUG(4,("NetShareAdd res=%d\n", res)); + } + } else { + DEBUG(4,("NetShareAdd failed\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; } + /**************************************************************************** - call a NetShareDelete - unshare exported directory on remote server + Call a NetShareDelete - unshare exported directory on remote server. ****************************************************************************/ + int cli_NetShareDelete(struct cli_state *cli, const char * share_name ) { - char *rparam = NULL; - char *rdata = NULL; - char *p; - unsigned int rdrcnt,rprcnt; - int res; - char param[WORDSIZE /* api number */ - +sizeof(RAP_WShareDel_REQ) /* req string */ - +1 /* no ret string */ - +RAP_SHARENAME_LEN /* share to del */ - +WORDSIZE]; /* reserved word */ - - /* now send a SMBtrans command with api RNetShareDelete */ - p = make_header(param, RAP_WshareDel, RAP_WShareDel_REQ, NULL); - PUTSTRING(p,share_name,RAP_SHARENAME_LEN); - PUTWORD(p,0); /* reserved word MBZ on input */ - - if (cli_api(cli, - param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ - NULL, 0, 200, /* data, length, maxlen */ - &rparam, &rprcnt, /* return params, length */ - &rdata, &rdrcnt)) /* return data, length */ - { - res = GETRES(rparam); - - if (res == 0) { - /* nothing to do */ - } - else { - DEBUG(4,("NetShareDelete res=%d\n", res)); - } - } else { - res = -1; - DEBUG(4,("NetShareDelete failed\n")); - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return res; + char *rparam = NULL; + char *rdata = NULL; + char *p; + unsigned int rdrcnt,rprcnt; + int res = -1; + char param[WORDSIZE /* api number */ + +sizeof(RAP_WShareDel_REQ) /* req string */ + +1 /* no ret string */ + +RAP_SHARENAME_LEN /* share to del */ + +WORDSIZE]; /* reserved word */ + + /* now send a SMBtrans command with api RNetShareDelete */ + p = make_header(param, RAP_WshareDel, RAP_WShareDel_REQ, NULL); + PUTSTRING(p,share_name,RAP_SHARENAME_LEN); + PUTWORD(p,0); /* reserved word MBZ on input */ + + if (cli_api(cli, + param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ + NULL, 0, 200, /* data, length, maxlen */ + &rparam, &rprcnt, /* return params, length */ + &rdata, &rdrcnt)) /* return data, length */ + { + char *endp = rparam + rprcnt; + res = GETRES(rparam, endp); + + if (res == 0) { + /* nothing to do */ + } else { + DEBUG(4,("NetShareDelete res=%d\n", res)); + } + } else { + DEBUG(4,("NetShareDelete failed\n")); + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; } + /************************************************************************* * * Function Name: cli_get_pdc_name @@ -1223,63 +1468,77 @@ int cli_NetShareDelete(struct cli_state *cli, const char * share_name ) * False - failure * ************************************************************************/ -bool cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) + +bool cli_get_pdc_name(struct cli_state *cli, char *workgroup, char **pdc_name) { - char *rparam = NULL; - char *rdata = NULL; - unsigned int rdrcnt,rprcnt; - char *p; - char param[WORDSIZE /* api number */ - +sizeof(RAP_NetServerEnum2_REQ) /* req string */ - +sizeof(RAP_SERVER_INFO_L1) /* return string */ - +WORDSIZE /* info level */ - +WORDSIZE /* buffer size */ - +DWORDSIZE /* server type */ - +RAP_MACHNAME_LEN]; /* workgroup */ - int count = -1; - - *pdc_name = '\0'; - - /* send a SMBtrans command with api NetServerEnum */ - p = make_header(param, RAP_NetServerEnum2, - RAP_NetServerEnum2_REQ, RAP_SERVER_INFO_L1); - PUTWORD(p, 1); /* info level */ - PUTWORD(p, CLI_BUFFER_SIZE); - PUTDWORD(p, SV_TYPE_DOMAIN_CTRL); - PUTSTRING(p, workgroup, RAP_MACHNAME_LEN); - - if (cli_api(cli, - param, PTR_DIFF(p,param), 8, /* params, length, max */ - NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ - &rparam, &rprcnt, /* return params, return size */ - &rdata, &rdrcnt /* return data, return size */ - )) { - cli->rap_error = GETRES(rparam); - - /* - * We only really care to copy a name if the - * API succeeded and we got back a name. - */ - if (cli->rap_error == 0) { - p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ - GETWORD(p, count); - p = rdata; - - if (count > 0) - GETSTRING(p, pdc_name); - } - else { - DEBUG(4,("cli_get_pdc_name: machine %s failed the NetServerEnum call. " - "Error was : %s.\n", cli->desthost, cli_errstr(cli) )); - } - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return(count > 0); -} + char *rparam = NULL; + char *rdata = NULL; + unsigned int rdrcnt,rprcnt; + char *p; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetServerEnum2_REQ) /* req string */ + +sizeof(RAP_SERVER_INFO_L1) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE /* buffer size */ + +DWORDSIZE /* server type */ + +RAP_MACHNAME_LEN]; /* workgroup */ + int count = -1; + int res = -1; + + *pdc_name = NULL; + + /* send a SMBtrans command with api NetServerEnum */ + p = make_header(param, RAP_NetServerEnum2, + RAP_NetServerEnum2_REQ, RAP_SERVER_INFO_L1); + PUTWORD(p, 1); /* info level */ + PUTWORD(p, CLI_BUFFER_SIZE); + PUTDWORD(p, SV_TYPE_DOMAIN_CTRL); + PUTSTRING(p, workgroup, RAP_MACHNAME_LEN); + + if (cli_api(cli, + param, PTR_DIFF(p,param), 8, /* params, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt /* return data, return size */ + )) { + + char *endp = rparam + rprcnt; + res = GETRES(rparam, endp); + cli->rap_error = res; + + /* + * We only really care to copy a name if the + * API succeeded and we got back a name. + */ + if (cli->rap_error == 0) { + p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ + GETWORD(p, count, endp); + p = rdata; + endp = rdata + rdrcnt; + + if (count > 0) { + TALLOC_CTX *frame = talloc_stackframe(); + char *dcname; + p += rap_getstring(frame, + p, + &dcname, + endp); + if (dcname) { + *pdc_name = SMB_STRDUP(dcname); + } + TALLOC_FREE(frame); + } + } else { + DEBUG(4,("cli_get_pdc_name: machine %s failed the NetServerEnum call. " + "Error was : %s.\n", cli->desthost, cli_errstr(cli) )); + } + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + return(count > 0); +} /************************************************************************* * @@ -1303,49 +1562,62 @@ bool cli_get_pdc_name(struct cli_state *cli, char *workgroup, char *pdc_name) * Origins: samba 2.0.6 source/libsmb/clientgen.c cli_NetServerEnum() * ************************************************************************/ + bool cli_get_server_domain(struct cli_state *cli) { - char *rparam = NULL; - char *rdata = NULL; - unsigned int rdrcnt,rprcnt; - char *p; - char param[WORDSIZE /* api number */ - +sizeof(RAP_WWkstaGetInfo_REQ) /* req string */ - +sizeof(RAP_WKSTA_INFO_L10) /* return string */ - +WORDSIZE /* info level */ - +WORDSIZE]; /* buffer size */ - int res = -1; - - /* send a SMBtrans command with api NetWkstaGetInfo */ - p = make_header(param, RAP_WWkstaGetInfo, - RAP_WWkstaGetInfo_REQ, RAP_WKSTA_INFO_L10); - PUTWORD(p, 10); /* info level */ - PUTWORD(p, CLI_BUFFER_SIZE); - - if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ - NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ - &rparam, &rprcnt, /* return params, return size */ - &rdata, &rdrcnt)) { /* return data, return size */ - res = GETRES(rparam); - p = rdata; - - if (res == 0) { - int converter; - - p = rparam + WORDSIZE; - GETWORD(p, converter); - - p = rdata + DWORDSIZE + DWORDSIZE; /* skip computer & user names */ - GETSTRINGP(p, cli->server_domain, rdata, converter); - } - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return(res == 0); -} + char *rparam = NULL; + char *rdata = NULL; + unsigned int rdrcnt,rprcnt; + char *p; + char param[WORDSIZE /* api number */ + +sizeof(RAP_WWkstaGetInfo_REQ) /* req string */ + +sizeof(RAP_WKSTA_INFO_L10) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + int res = -1; + + /* send a SMBtrans command with api NetWkstaGetInfo */ + p = make_header(param, RAP_WWkstaGetInfo, + RAP_WWkstaGetInfo_REQ, RAP_WKSTA_INFO_L10); + PUTWORD(p, 10); /* info level */ + PUTWORD(p, CLI_BUFFER_SIZE); + + if (cli_api(cli, param, PTR_DIFF(p,param), 8, /* params, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt)) { /* return data, return size */ + char *endp = rparam + rprcnt; + res = GETRES(rparam, endp); + + if (res == 0) { + TALLOC_CTX *frame = talloc_stackframe(); + char *server_domain; + int converter = 0; + + p = rparam + WORDSIZE; + GETWORD(p, converter, endp); + + p = rdata + DWORDSIZE + DWORDSIZE; /* skip computer & user names */ + endp = rdata + rdrcnt; + p += rap_getstringp(frame, + p, + &server_domain, + rdata, + converter, + endp); + + if (server_domain) { + fstrcpy(cli->server_domain, server_domain); + } + TALLOC_FREE(frame); + } + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + return(res == 0); +} /************************************************************************* * @@ -1368,44 +1640,48 @@ bool cli_get_server_domain(struct cli_state *cli) * Origins: samba 2.0.6 source/libsmb/clientgen.c cli_NetServerEnum() * ************************************************************************/ + bool cli_get_server_type(struct cli_state *cli, uint32 *pstype) { - char *rparam = NULL; - char *rdata = NULL; - unsigned int rdrcnt,rprcnt; - char *p; - char param[WORDSIZE /* api number */ - +sizeof(RAP_WserverGetInfo_REQ) /* req string */ - +sizeof(RAP_SERVER_INFO_L1) /* return string */ - +WORDSIZE /* info level */ - +WORDSIZE]; /* buffer size */ - int res = -1; - - /* send a SMBtrans command with api NetServerGetInfo */ - p = make_header(param, RAP_WserverGetInfo, - RAP_WserverGetInfo_REQ, RAP_SERVER_INFO_L1); - PUTWORD(p, 1); /* info level */ - PUTWORD(p, CLI_BUFFER_SIZE); - - if (cli_api(cli, - param, PTR_DIFF(p,param), 8, /* params, length, max */ - NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ - &rparam, &rprcnt, /* return params, return size */ - &rdata, &rdrcnt /* return data, return size */ - )) { - - res = GETRES(rparam); - - if (res == 0 || res == ERRmoredata) { - p = rdata; - *pstype = IVAL(p,18) & ~SV_TYPE_LOCAL_LIST_ONLY; - } - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return(res == 0 || res == ERRmoredata); + char *rparam = NULL; + char *rdata = NULL; + unsigned int rdrcnt,rprcnt; + char *p; + char param[WORDSIZE /* api number */ + +sizeof(RAP_WserverGetInfo_REQ) /* req string */ + +sizeof(RAP_SERVER_INFO_L1) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + int res = -1; + + /* send a SMBtrans command with api NetServerGetInfo */ + p = make_header(param, RAP_WserverGetInfo, + RAP_WserverGetInfo_REQ, RAP_SERVER_INFO_L1); + PUTWORD(p, 1); /* info level */ + PUTWORD(p, CLI_BUFFER_SIZE); + + if (cli_api(cli, + param, PTR_DIFF(p,param), 8, /* params, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt /* return data, return size */ + )) { + char *endp = rparam + rprcnt; + res = GETRES(rparam,endp); + + if (res == 0 || res == ERRmoredata) { + p = rdata; + endp = rparam + rprcnt; + p += 18; + GETDWORD(p,*pstype,endp); + *pstype &= ~SV_TYPE_LOCAL_LIST_ONLY; + } + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return(res == 0 || res == ERRmoredata); } bool cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, @@ -1420,7 +1696,8 @@ bool cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, +sizeof(RAP_SERVER_INFO_L1) /* return string */ +WORDSIZE /* info level */ +WORDSIZE]; /* buffer size */ - bool res = False; + bool res = false; + char *endp; fstring tmp; /* send a SMBtrans command with api NetServerGetInfo */ @@ -1438,7 +1715,8 @@ bool cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, goto failed; } - if (GETRES(rparam) != 0) { + endp = rparam + rprcnt; + if (GETRES(rparam, endp) != 0) { goto failed; } @@ -1457,7 +1735,7 @@ bool cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, goto failed; } - res = True; + res = true; failed: SAFE_FREE(rparam); @@ -1491,655 +1769,904 @@ bool cli_get_server_name(TALLOC_CTX *mem_ctx, struct cli_state *cli, * False - failure * ************************************************************************/ + bool cli_ns_check_server_type(struct cli_state *cli, char *workgroup, uint32 stype) { - char *rparam = NULL; - char *rdata = NULL; - unsigned int rdrcnt,rprcnt; - char *p; - char param[WORDSIZE /* api number */ - +sizeof(RAP_NetServerEnum2_REQ) /* req string */ - +sizeof(RAP_SERVER_INFO_L0) /* return string */ - +WORDSIZE /* info level */ - +WORDSIZE /* buffer size */ - +DWORDSIZE /* server type */ - +RAP_MACHNAME_LEN]; /* workgroup */ - bool found_server = False; - int res = -1; - - /* send a SMBtrans command with api NetServerEnum */ - p = make_header(param, RAP_NetServerEnum2, - RAP_NetServerEnum2_REQ, RAP_SERVER_INFO_L0); - PUTWORD(p, 0); /* info level 0 */ - PUTWORD(p, CLI_BUFFER_SIZE); - PUTDWORD(p, stype); - PUTSTRING(p, workgroup, RAP_MACHNAME_LEN); - - if (cli_api(cli, - param, PTR_DIFF(p,param), 8, /* params, length, max */ - NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ - &rparam, &rprcnt, /* return params, return size */ - &rdata, &rdrcnt /* return data, return size */ - )) { - - res = GETRES(rparam); - cli->rap_error = res; - - if (res == 0 || res == ERRmoredata) { - int i, count; - - p = rparam + WORDSIZE + WORDSIZE; - GETWORD(p, count); - - p = rdata; - for (i = 0;i < count;i++, p += 16) { - char ret_server[RAP_MACHNAME_LEN]; - - GETSTRINGF(p, ret_server, RAP_MACHNAME_LEN); - if (strequal(ret_server, cli->desthost)) { - found_server = True; - break; - } - } - } - else { - DEBUG(4,("cli_ns_check_server_type: machine %s failed the NetServerEnum call. " - "Error was : %s.\n", cli->desthost, cli_errstr(cli) )); - } - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return found_server; - } + char *rparam = NULL; + char *rdata = NULL; + unsigned int rdrcnt,rprcnt; + char *p; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetServerEnum2_REQ) /* req string */ + +sizeof(RAP_SERVER_INFO_L0) /* return string */ + +WORDSIZE /* info level */ + +WORDSIZE /* buffer size */ + +DWORDSIZE /* server type */ + +RAP_MACHNAME_LEN]; /* workgroup */ + bool found_server = false; + int res = -1; + + /* send a SMBtrans command with api NetServerEnum */ + p = make_header(param, RAP_NetServerEnum2, + RAP_NetServerEnum2_REQ, RAP_SERVER_INFO_L0); + PUTWORD(p, 0); /* info level 0 */ + PUTWORD(p, CLI_BUFFER_SIZE); + PUTDWORD(p, stype); + PUTSTRING(p, workgroup, RAP_MACHNAME_LEN); + + if (cli_api(cli, + param, PTR_DIFF(p,param), 8, /* params, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt /* return data, return size */ + )) { + char *endp = rparam + rprcnt; + res = GETRES(rparam,endp); + cli->rap_error = res; + + if (res == 0 || res == ERRmoredata) { + int i, count = 0; + + p = rparam + WORDSIZE + WORDSIZE; + GETWORD(p, count,endp); + + p = rdata; + endp = rdata + rdrcnt; + for (i = 0;i < count && p < endp;i++, p += 16) { + char ret_server[RAP_MACHNAME_LEN]; + + p += rap_getstringf(p, + ret_server, + RAP_MACHNAME_LEN, + RAP_MACHNAME_LEN, + endp); + if (strequal(ret_server, cli->desthost)) { + found_server = true; + break; + } + } + } else { + DEBUG(4,("cli_ns_check_server_type: machine %s failed the NetServerEnum call. " + "Error was : %s.\n", cli->desthost, cli_errstr(cli) )); + } + } + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return found_server; +} /**************************************************************************** - perform a NetWkstaUserLogoff + Perform a NetWkstaUserLogoff. ****************************************************************************/ -bool cli_NetWkstaUserLogoff(struct cli_state *cli,char *user, char *workstation) + +bool cli_NetWkstaUserLogoff(struct cli_state *cli, const char *user, const char *workstation) { - char *rparam = NULL; - char *rdata = NULL; - char *p; - unsigned int rdrcnt,rprcnt; - char param[WORDSIZE /* api number */ - +sizeof(RAP_NetWkstaUserLogoff_REQ) /* req string */ - +sizeof(RAP_USER_LOGOFF_INFO_L1) /* return string */ - +RAP_USERNAME_LEN+1 /* user name+pad */ - +RAP_MACHNAME_LEN /* wksta name */ - +WORDSIZE /* buffer size */ - +WORDSIZE]; /* buffer size? */ - fstring upperbuf; - - memset(param, 0, sizeof(param)); - - /* send a SMBtrans command with api NetWkstaUserLogoff */ - p = make_header(param, RAP_WWkstaUserLogoff, - RAP_NetWkstaUserLogoff_REQ, RAP_USER_LOGOFF_INFO_L1); - PUTDWORD(p, 0); /* Null pointer */ - PUTDWORD(p, 0); /* Null pointer */ - fstrcpy(upperbuf, user); - strupper_m(upperbuf); - PUTSTRINGF(p, upperbuf, RAP_USERNAME_LEN); - p++; /* strange format, but ok */ - fstrcpy(upperbuf, workstation); - strupper_m(upperbuf); - PUTSTRINGF(p, upperbuf, RAP_MACHNAME_LEN); - PUTWORD(p, CLI_BUFFER_SIZE); - PUTWORD(p, CLI_BUFFER_SIZE); - - if (cli_api(cli, - param, PTR_DIFF(p,param),1024, /* param, length, max */ - NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ - &rparam, &rprcnt, /* return params, return size */ - &rdata, &rdrcnt /* return data, return size */ - )) { - cli->rap_error = GETRES(rparam); - - if (cli->rap_error != 0) { - DEBUG(4,("NetwkstaUserLogoff gave error %d\n", cli->rap_error)); - } - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - return (cli->rap_error == 0); + char *rparam = NULL; + char *rdata = NULL; + char *p; + unsigned int rdrcnt,rprcnt; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetWkstaUserLogoff_REQ) /* req string */ + +sizeof(RAP_USER_LOGOFF_INFO_L1) /* return string */ + +RAP_USERNAME_LEN+1 /* user name+pad */ + +RAP_MACHNAME_LEN /* wksta name */ + +WORDSIZE /* buffer size */ + +WORDSIZE]; /* buffer size? */ + char upperbuf[MAX(RAP_USERNAME_LEN,RAP_MACHNAME_LEN)]; + int res = -1; + + memset(param, 0, sizeof(param)); + + /* send a SMBtrans command with api NetWkstaUserLogoff */ + p = make_header(param, RAP_WWkstaUserLogoff, + RAP_NetWkstaUserLogoff_REQ, RAP_USER_LOGOFF_INFO_L1); + PUTDWORD(p, 0); /* Null pointer */ + PUTDWORD(p, 0); /* Null pointer */ + strlcpy(upperbuf, user, sizeof(upperbuf)); + strupper_m(upperbuf); + PUTSTRINGF(p, upperbuf, RAP_USERNAME_LEN); + p++; /* strange format, but ok */ + strlcpy(upperbuf, workstation, sizeof(upperbuf)); + strupper_m(upperbuf); + PUTSTRINGF(p, upperbuf, RAP_MACHNAME_LEN); + PUTWORD(p, CLI_BUFFER_SIZE); + PUTWORD(p, CLI_BUFFER_SIZE); + + if (cli_api(cli, + param, PTR_DIFF(p,param),1024, /* param, length, max */ + NULL, 0, CLI_BUFFER_SIZE, /* data, length, max */ + &rparam, &rprcnt, /* return params, return size */ + &rdata, &rdrcnt /* return data, return size */ + )) { + char *endp = rparam + rprcnt; + res = GETRES(rparam,endp); + cli->rap_error = res; + + if (cli->rap_error != 0) { + DEBUG(4,("NetwkstaUserLogoff gave error %d\n", cli->rap_error)); + } + } + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + return (cli->rap_error == 0); } int cli_NetPrintQEnum(struct cli_state *cli, void (*qfn)(const char*,uint16,uint16,uint16,const char*,const char*,const char*,const char*,const char*,uint16,uint16), void (*jfn)(uint16,const char*,const char*,const char*,const char*,uint16,uint16,const char*,uint,uint,const char*)) { - char param[WORDSIZE /* api number */ - +sizeof(RAP_NetPrintQEnum_REQ) /* req string */ - +sizeof(RAP_PRINTQ_INFO_L2) /* return string */ - +WORDSIZE /* info level */ - +WORDSIZE /* buffer size */ - +sizeof(RAP_SMB_PRINT_JOB_L1)]; /* more ret data */ - char *p; - char *rparam = NULL; - char *rdata = NULL; - unsigned int rprcnt, rdrcnt; - int res = -1; - - - memset(param, '\0',sizeof(param)); - p = make_header(param, RAP_WPrintQEnum, - RAP_NetPrintQEnum_REQ, RAP_PRINTQ_INFO_L2); - PUTWORD(p,2); /* Info level 2 */ - PUTWORD(p,0xFFE0); /* Return buffer size */ - PUTSTRING(p, RAP_SMB_PRINT_JOB_L1, 0); - - if (cli_api(cli, - param, PTR_DIFF(p,param),1024, - NULL, 0, CLI_BUFFER_SIZE, - &rparam, &rprcnt, - &rdata, &rdrcnt)) { - res = GETRES(rparam); - cli->rap_error = res; - if (res != 0) { - DEBUG(1,("NetPrintQEnum gave error %d\n", res)); - } - } - - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int i, converter, count; - - p = rparam + WORDSIZE; - GETWORD(p, converter); - GETWORD(p, count); - - p = rdata; - for (i=0;irap_error = res; + if (res != 0) { + DEBUG(1,("NetPrintQEnum gave error %d\n", res)); + } + } + + if (!rdata) { + DEBUG(4,("NetPrintQEnum no data returned\n")); + goto out; + } + + if (res == 0 || res == ERRmoredata) { + TALLOC_CTX *frame = talloc_stackframe(); + char *endp = rparam + rprcnt; + int i, converter = 0, count = 0; + + p = rparam + WORDSIZE; + GETWORD(p, converter, endp); + GETWORD(p, count, endp); + + p = rdata; + endp = rdata + rdrcnt; + for (i=0;irap_error = res; - if (res != 0) { - DEBUG(1,("NetPrintQGetInfo gave error %d\n", res)); - } - } - - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int rsize, converter; - pstring qname, sep_file, print_proc, dest, parms, comment; - uint16 jobcount, priority, start_time, until_time, status; - - p = rparam + WORDSIZE; - GETWORD(p, converter); - GETWORD(p, rsize); - - p = rdata; - GETSTRINGF(p, qname, RAP_SHARENAME_LEN); - p++; /* pad */ - GETWORD(p, priority); - GETWORD(p, start_time); - GETWORD(p, until_time); - GETSTRINGP(p, sep_file, rdata, converter); - GETSTRINGP(p, print_proc, rdata, converter); - GETSTRINGP(p, dest, rdata, converter); - GETSTRINGP(p, parms, rdata, converter); - GETSTRINGP(p, comment, rdata, converter); - GETWORD(p, status); - GETWORD(p, jobcount); - qfn(qname, priority, start_time, until_time, sep_file, print_proc, - dest, parms, comment, status, jobcount); - if (jobcount) { - int j; - for (j=0;(jrap_error = res; + if (res != 0) { + DEBUG(1,("NetPrintQGetInfo gave error %d\n", res)); + } + } + + if (!rdata) { + DEBUG(4,("NetPrintQGetInfo no data returned\n")); + goto out; + } + + if (res == 0 || res == ERRmoredata) { + TALLOC_CTX *frame = talloc_stackframe(); + char *endp = rparam + rprcnt; + int rsize = 0, converter = 0; + char qname[RAP_SHARENAME_LEN]; + char *sep_file, *print_proc, *dest, *parms, *comment; + uint16_t jobcount = 0, priority = 0; + uint16_t start_time = 0, until_time = 0, status = 0; + + p = rparam + WORDSIZE; + GETWORD(p, converter, endp); + GETWORD(p, rsize, endp); + + p = rdata; + endp = rdata + rdrcnt; + p += rap_getstringf(p, + qname, + RAP_SHARENAME_LEN, + RAP_SHARENAME_LEN, + endp); + p++; /* pad */ + GETWORD(p, priority, endp); + GETWORD(p, start_time, endp); + GETWORD(p, until_time, endp); + p += rap_getstringp(frame, + p, + &sep_file, + rdata, + converter, + endp); + p += rap_getstringp(frame, + p, + &print_proc, + rdata, + converter, + endp); + p += rap_getstringp(frame, + p, + &dest, + rdata, + converter, + endp); + p += rap_getstringp(frame, + p, + &parms, + rdata, + converter, + endp); + p += rap_getstringp(frame, + p, + &comment, + rdata, + converter, + endp); + GETWORD(p, status, endp); + GETWORD(p, jobcount, endp); + + if (sep_file && print_proc && dest && + parms && comment) { + qfn(qname, priority, start_time, until_time, sep_file, print_proc, + dest, parms, comment, status, jobcount); + } + if (jobcount) { + int j; + for (j=0;(jrap_error = res; + if(cli->rap_error == 234) { + DEBUG(1,("Not all service names were returned (such as those longer than 15 characters)\n")); + } else if (cli->rap_error != 0) { + DEBUG(1,("NetServiceEnum gave error %d\n", cli->rap_error)); + } + } + if (!rdata) { + DEBUG(4,("NetServiceEnum no data returned\n")); + goto out; + } - memset(param, '\0', sizeof(param)); - p = make_header(param, RAP_WServiceEnum, - RAP_NetServiceEnum_REQ, RAP_SERVICE_INFO_L2); - PUTWORD(p,2); /* Info level 2 */ - PUTWORD(p,0xFFE0); /* Return buffer size */ + if (res == 0 || res == ERRmoredata) { + char *endp = rparam + rprcnt; + int i, count = 0; + + p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ + GETWORD(p, count,endp); + + endp = rdata + rdrcnt; + for (i=0,p=rdata;irap_error = res; - if(cli->rap_error == 234) - DEBUG(1,("Not all service names were returned (such as those longer than 15 characters)\n")); - else if (cli->rap_error != 0) { - DEBUG(1,("NetServiceEnum gave error %d\n", cli->rap_error)); - } - } - - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int i, count; - - p = rparam + WORDSIZE + WORDSIZE; /* skip result and converter */ - GETWORD(p, count); - - for (i=0,p=rdata;irap_error = res; - if (res != 0) { - DEBUG(1,("NetSessionEnum gave error %d\n", res)); - } - } - - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int i, converter, count; - - p = rparam + WORDSIZE; - GETWORD(p, converter); - GETWORD(p, count); - - for (i=0,p=rdata;irap_error = res; + if (res != 0) { + DEBUG(1,("NetSessionEnum gave error %d\n", res)); + } + } + + if (!rdata) { + DEBUG(4,("NetSesssionEnum no data returned\n")); + goto out; + } + + if (res == 0 || res == ERRmoredata) { + TALLOC_CTX *frame = talloc_stackframe(); + char *endp = rparam + rprcnt; + int i, converter = 0, count = 0; + + p = rparam + WORDSIZE; + GETWORD(p, converter, endp); + GETWORD(p, count, endp); + + endp = rdata + rdrcnt; + for (i=0,p=rdata;irap_error = SVAL(rparam,0); - if (cli->rap_error != 0) { - DEBUG(1,("NetSessionGetInfo gave error %d\n", cli->rap_error)); - } - } - - if (rdata) { - res = GETRES(rparam); - - if (res == 0 || res == ERRmoredata) { - int converter; - pstring wsname, username, clitype_name; - uint16 num_conns, num_opens, num_users; - unsigned int sess_time, idle_time, user_flags; - - p = rparam + WORDSIZE; - GETWORD(p, converter); - p += WORDSIZE; /* skip rsize */ - - p = rdata; - GETSTRINGP(p, wsname, rdata, converter); - GETSTRINGP(p, username, rdata, converter); - GETWORD(p, num_conns); - GETWORD(p, num_opens); - GETWORD(p, num_users); - GETDWORD(p, sess_time); - GETDWORD(p, idle_time); - GETDWORD(p, user_flags); - GETSTRINGP(p, clitype_name, rdata, converter); - - fn(wsname, username, num_conns, num_opens, num_users, sess_time, - idle_time, user_flags, clitype_name); - } else { - DEBUG(4,("NetSessionGetInfo res=%d\n", res)); - } - } else { - DEBUG(4,("NetSessionGetInfo no data returned\n")); - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return res; + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetSessionGetInfo_REQ) /* req string */ + +sizeof(RAP_SESSION_INFO_L2) /* return string */ + +RAP_MACHNAME_LEN /* wksta name */ + +WORDSIZE /* info level */ + +WORDSIZE]; /* buffer size */ + char *p; + char *rparam = NULL; + char *rdata = NULL; + unsigned int rprcnt, rdrcnt; + char *endp; + int res = -1; + + memset(param, '\0', sizeof(param)); + p = make_header(param, RAP_WsessionGetInfo, + RAP_NetSessionGetInfo_REQ, RAP_SESSION_INFO_L2); + PUTSTRING(p, workstation, RAP_MACHNAME_LEN-1); + PUTWORD(p,2); /* Info level 2 */ + PUTWORD(p,0xFF); /* Return buffer size */ + + if (cli_api(cli, + param, PTR_DIFF(p,param),PTR_DIFF(p,param), + NULL, 0, CLI_BUFFER_SIZE, + &rparam, &rprcnt, + &rdata, &rdrcnt)) { + endp = rparam + rprcnt; + res = GETRES(rparam, endp); + cli->rap_error = res; + if (cli->rap_error != 0) { + DEBUG(1,("NetSessionGetInfo gave error %d\n", cli->rap_error)); + } + } + + if (!rdata) { + DEBUG(4,("NetSessionGetInfo no data returned\n")); + goto out; + } + + endp = rparam + rprcnt; + res = GETRES(rparam, endp); + + if (res == 0 || res == ERRmoredata) { + TALLOC_CTX *frame = talloc_stackframe(); + int converter = 0; + char *wsname, *username, *clitype_name; + uint16_t num_conns = 0, num_opens = 0, num_users = 0; + unsigned int sess_time = 0, idle_time = 0, user_flags = 0; + + p = rparam + WORDSIZE; + GETWORD(p, converter,endp); + p += WORDSIZE; /* skip rsize */ + + p = rdata; + endp = rdata + rdrcnt; + p += rap_getstringp(frame, + p, + &wsname, + rdata, + converter, + endp); + p += rap_getstringp(frame, + p, + &username, + rdata, + converter, + endp); + GETWORD(p, num_conns, endp); + GETWORD(p, num_opens, endp); + GETWORD(p, num_users, endp); + GETDWORD(p, sess_time, endp); + GETDWORD(p, idle_time, endp); + GETDWORD(p, user_flags, endp); + p += rap_getstringp(frame, + p, + &clitype_name, + rdata, + converter, + endp); + + if (wsname && username && clitype_name) { + fn(wsname, username, num_conns, num_opens, num_users, sess_time, + idle_time, user_flags, clitype_name); + } + TALLOC_FREE(frame); + } else { + DEBUG(4,("NetSessionGetInfo res=%d\n", res)); + } + + out: + + SAFE_FREE(rparam); + SAFE_FREE(rdata); + + return res; } /**************************************************************************** -call a NetSessionDel - close a session to an SMB server + Call a NetSessionDel - close a session to an SMB server. ****************************************************************************/ + int cli_NetSessionDel(struct cli_state *cli, const char *workstation) { - char param[WORDSIZE /* api number */ - +sizeof(RAP_NetSessionDel_REQ) /* req string */ - +1 /* no return string */ - +RAP_MACHNAME_LEN /* workstation name */ - +WORDSIZE]; /* reserved (0) */ - char *p; - char *rparam = NULL; - char *rdata = NULL; - unsigned int rprcnt, rdrcnt; - int res; - - memset(param, '\0', sizeof(param)); - p = make_header(param, RAP_WsessionDel, RAP_NetSessionDel_REQ, NULL); - PUTSTRING(p, workstation, RAP_MACHNAME_LEN-1); - PUTWORD(p,0); /* reserved word of 0 */ - if (cli_api(cli, - param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ - NULL, 0, 200, /* data, length, maxlen */ - &rparam, &rprcnt, /* return params, length */ - &rdata, &rdrcnt)) /* return data, length */ - { - res = GETRES(rparam); - cli->rap_error = res; - - if (res == 0) { - /* nothing to do */ - } - else { - DEBUG(4,("NetFileClose2 res=%d\n", res)); - } - } else { - res = -1; - DEBUG(4,("NetFileClose2 failed\n")); - } - - SAFE_FREE(rparam); - SAFE_FREE(rdata); - - return res; -} + char param[WORDSIZE /* api number */ + +sizeof(RAP_NetSessionDel_REQ) /* req string */ + +1 /* no return string */ + +RAP_MACHNAME_LEN /* workstation name */ + +WORDSIZE]; /* reserved (0) */ + char *p; + char *rparam = NULL; + char *rdata = NULL; + unsigned int rprcnt, rdrcnt; + int res = -1; + + memset(param, '\0', sizeof(param)); + p = make_header(param, RAP_WsessionDel, RAP_NetSessionDel_REQ, NULL); + PUTSTRING(p, workstation, RAP_MACHNAME_LEN-1); + PUTWORD(p,0); /* reserved word of 0 */ + + if (cli_api(cli, + param, PTR_DIFF(p,param), 1024, /* Param, length, maxlen */ + NULL, 0, 200, /* data, length, maxlen */ + &rparam, &rprcnt, /* return params, length */ + &rdata, &rdrcnt)) /* return data, length */ + { + char *endp = rparam + rprcnt; + res = GETRES(rparam, endp); + cli->rap_error = res; + + if (res == 0) { + /* nothing to do */ + } else { + DEBUG(4,("NetFileClose2 res=%d\n", res)); + } + } else { + res = -1; + DEBUG(4,("NetFileClose2 failed\n")); + } + SAFE_FREE(rparam); + SAFE_FREE(rdata); -int cli_NetConnectionEnum(struct cli_state *cli, const char *qualifier, void (*fn)(uint16 conid, uint16 contype, uint16 numopens, uint16 numusers, uint32 contime, const char *username, const char *netname)) + return res; +} + +int cli_NetConnectionEnum(struct cli_state *cli, const char *qualifier, + void (*fn)(uint16_t conid, uint16_t contype, + uint16_t numopens, uint16_t numusers, + uint32_t contime, const char *username, + const char *netname)) { - char param[WORDSIZE /* api number */ - +sizeof(RAP_NetConnectionEnum_REQ) /* req string */ - +sizeof(RAP_CONNECTION_INFO_L1) /* return string */ - +RAP_MACHNAME_LEN /* wksta name */ - +WORDSIZE /* info level */ - +WORDSIZE]; /* buffer size */ - char *p; - char *rparam = NULL; - char *rdata = NULL; - unsigned int rprcnt, rdrcnt; - int res = -1; - - memset(param, '\0', sizeof(param)); - p = make_header(param, RAP_WconnectionEnum, - RAP_NetConnectionEnum_REQ, RAP_CONNECTION_INFO_L1); - PUTSTRING(p, qualifier, RAP_MACHNAME_LEN-1);/* Workstation name */ - PUTWORD(p,1); /* Info level 1 */ - PUTWORD(p,0xFFE0); /* Return buffer size */ - - if (cli_api(cli, - param, PTR_DIFF(p,param),PTR_DIFF(p,param), - NULL, 0, CLI_BUFFER_SIZE, - &rparam, &rprcnt, - &rdata, &rdrcnt)) { - res = GETRES(rparam); - cli->rap_error = res; - if (res != 0) { - DEBUG(1,("NetConnectionEnum gave error %d\n", res)); - } - } - if (rdata) { - if (res == 0 || res == ERRmoredata) { - int i, converter, count; - - p = rparam + WORDSIZE; - GETWORD(p, converter); - GETWORD(p, count); - - for (i=0,p=rdata;irap_error = res; + if (res != 0) { + DEBUG(1,("NetConnectionEnum gave error %d\n", res)); + } + } + + if (!rdata) { + DEBUG(4,("NetConnectionEnum no data returned\n")); + goto out; + } + + if (res == 0 || res == ERRmoredata) { + TALLOC_CTX *frame = talloc_stackframe(); + char *endp = rparam + rprcnt; + int i, converter = 0, count = 0; + + p = rparam + WORDSIZE; + GETWORD(p, converter, endp); + GETWORD(p, count, endp); + + endp = rdata + rdrcnt; + for (i=0,p=rdata;i Date: Wed, 2 Apr 2008 12:23:07 +0200 Subject: Apply some const in clirap. Guenther (This used to be commit 8a1a9f967db25d3928f19e46d60af249f934f323) --- source3/libsmb/clirap2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index d5795643e8..9cc8110576 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -1469,7 +1469,7 @@ int cli_NetShareDelete(struct cli_state *cli, const char * share_name ) * ************************************************************************/ -bool cli_get_pdc_name(struct cli_state *cli, char *workgroup, char **pdc_name) +bool cli_get_pdc_name(struct cli_state *cli, const char *workgroup, char **pdc_name) { char *rparam = NULL; char *rdata = NULL; -- cgit From 1939177582867fb54a416f3ea979ebd8d4335885 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 15 Jul 2008 23:05:13 +0200 Subject: fix build warning. Guenther (This used to be commit 507660706901a79544d436046127947e4baa7e52) --- source3/libsmb/clirap2.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'source3/libsmb/clirap2.c') diff --git a/source3/libsmb/clirap2.c b/source3/libsmb/clirap2.c index 9cc8110576..a15fa5f7d8 100644 --- a/source3/libsmb/clirap2.c +++ b/source3/libsmb/clirap2.c @@ -1856,6 +1856,7 @@ bool cli_NetWkstaUserLogoff(struct cli_state *cli, const char *user, const char +WORDSIZE]; /* buffer size? */ char upperbuf[MAX(RAP_USERNAME_LEN,RAP_MACHNAME_LEN)]; int res = -1; + char *tmp = NULL; memset(param, 0, sizeof(param)); @@ -1866,11 +1867,13 @@ bool cli_NetWkstaUserLogoff(struct cli_state *cli, const char *user, const char PUTDWORD(p, 0); /* Null pointer */ strlcpy(upperbuf, user, sizeof(upperbuf)); strupper_m(upperbuf); - PUTSTRINGF(p, upperbuf, RAP_USERNAME_LEN); + tmp = upperbuf; + PUTSTRINGF(p, tmp, RAP_USERNAME_LEN); p++; /* strange format, but ok */ strlcpy(upperbuf, workstation, sizeof(upperbuf)); strupper_m(upperbuf); - PUTSTRINGF(p, upperbuf, RAP_MACHNAME_LEN); + tmp = upperbuf; + PUTSTRINGF(p, tmp, RAP_MACHNAME_LEN); PUTWORD(p, CLI_BUFFER_SIZE); PUTWORD(p, CLI_BUFFER_SIZE); -- cgit