Author: skel Date: 2005-08-30 20:12:11 +0000 (Tue, 30 Aug 2005) New Revision: 9810
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=9810 Log: cac_SamGetNamesFromRids() and cac_SamGetRidsFromNames() now return success if num_rids or num_names is 0 added cac_SamFlush() Modified: branches/SOC/SAMBA_3_0/source/include/libmsrpc.h branches/SOC/SAMBA_3_0/source/libmsrpc/cac_samr.c Changeset: Modified: branches/SOC/SAMBA_3_0/source/include/libmsrpc.h =================================================================== --- branches/SOC/SAMBA_3_0/source/include/libmsrpc.h 2005-08-30 19:44:33 UTC (rev 9809) +++ branches/SOC/SAMBA_3_0/source/include/libmsrpc.h 2005-08-30 20:12:11 UTC (rev 9810) @@ -1782,7 +1782,7 @@ } in; struct { - /**the number of names returned*/ + /**the number of names returned - if this is 0, the map is NULL*/ uint32 num_names; /**array contiaing the Names and RIDs*/ @@ -1813,7 +1813,7 @@ } in; struct { - /**the number of names returned*/ + /**the number of names returned - if this is 0, then map is NULL*/ uint32 num_rids; /**array contiaing the Names and RIDs*/ @@ -2673,6 +2673,30 @@ */ int cac_SamGetSecurityObject(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetSecurityObject *op); +struct SamFlush { + struct { + /**Open handle to the domain SAM*/ + POLICY_HND *dom_hnd; + + /**(Optional)Domain SID. If NULL, the domain in hnd->domain will be opened*/ + DOM_SID *sid; + + /**(Optional)Desired access to re-open the domain with. If 0, MAXIMUM_ALLOWED_ACCESS is used.*/ + uint32 access; + } in; +}; + +/** + * Closes the domain handle, then re-opens it - effectively flushing any changes made. + * WARNING: if this fails you will no longer have an open handle to the domain SAM. + * @param hnd Initialized and connected server handle + * @param mem_ctx Context for memory allocation + * @param op Initialized Parameters + * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately + * CAC_SUCCESS - the operation was successful + */ +int cac_SamFlush(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamFlush *op); + /[EMAIL PROTECTED]/ /*SAM_Functions*/ /[EMAIL PROTECTED] SCM_Functions Service Control Manager Functions Modified: branches/SOC/SAMBA_3_0/source/libmsrpc/cac_samr.c =================================================================== --- branches/SOC/SAMBA_3_0/source/libmsrpc/cac_samr.c 2005-08-30 19:44:33 UTC (rev 9809) +++ branches/SOC/SAMBA_3_0/source/libmsrpc/cac_samr.c 2005-08-30 20:12:11 UTC (rev 9810) @@ -479,11 +479,22 @@ return CAC_FAILURE; } - if(!op || !op->in.dom_hnd || !op->in.rids || op->in.num_rids == 0 || !mem_ctx) { + if(!op || !op->in.dom_hnd || !mem_ctx) { hnd->status = NT_STATUS_INVALID_PARAMETER; return CAC_FAILURE; } + if(!op->in.rids && op->in.num_rids != 0) { + hnd->status = NT_STATUS_INVALID_PARAMETER; + return CAC_FAILURE; + } + + if(op->in.num_rids == 0) { + /*nothing to do*/ + op->out.num_names = 0; + return CAC_SUCCESS; + } + srv = cac_GetServer(hnd); if(!srv) { hnd->status = NT_STATUS_INVALID_CONNECTION; @@ -548,11 +559,22 @@ return CAC_FAILURE; } - if(!op || !op->in.dom_hnd || !op->in.names || op->in.num_names == 0 || !mem_ctx) { + if(!op || !op->in.dom_hnd || !mem_ctx) { hnd->status = NT_STATUS_INVALID_PARAMETER; return CAC_FAILURE; } + if(!op->in.names && op->in.num_names != 0) { + hnd->status = NT_STATUS_INVALID_PARAMETER; + return CAC_FAILURE; + } + + if(op->in.num_names == 0) { + /*then we don't have to do anything*/ + op->out.num_rids = 0; + return CAC_SUCCESS; + } + srv = cac_GetServer(hnd); if(!srv) { hnd->status = NT_STATUS_INVALID_CONNECTION; @@ -850,7 +872,6 @@ srv->cli.pipe_idx = PI_SAMR; - printf("addgroupmember: adding rid 0x%x\n", op->in.rid); hnd->status = cli_samr_add_groupmem( &(srv->cli), mem_ctx, op->in.group_hnd, op->in.rid); if(!NT_STATUS_IS_OK(hnd->status)) @@ -2395,3 +2416,47 @@ return CAC_SUCCESS; } + +int cac_SamFlush(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamFlush *op) { + SMBCSRV *srv = NULL; + + struct SamOpenDomain od; + + if(!hnd) + return CAC_FAILURE; + + if(!hnd->_internal.ctx || !hnd->_internal.pipes[PI_SAMR]) { + hnd->status = NT_STATUS_INVALID_HANDLE; + return CAC_FAILURE; + } + + if(!op || !op->in.dom_hnd || !mem_ctx) { + hnd->status = NT_STATUS_INVALID_PARAMETER; + return CAC_FAILURE; + } + + srv = cac_GetServer(hnd); + if(!srv) { + hnd->status = NT_STATUS_INVALID_CONNECTION; + return CAC_FAILURE; + } + + srv->cli.pipe_idx = PI_SAMR; + + if(!cac_SamClose(hnd, mem_ctx, op->in.dom_hnd)) + return CAC_FAILURE; + + ZERO_STRUCT(od); + od.in.access = (op->in.access) ? op->in.access : MAXIMUM_ALLOWED_ACCESS; + od.in.sid = op->in.sid; + + if(!cac_SamOpenDomain(hnd, mem_ctx, &od)) + return CAC_FAILURE; + + /*this function does not use an output parameter to make it as convenient as possible to use*/ + *op->in.dom_hnd = *od.out.dom_hnd; + + talloc_free(od.out.dom_hnd); + + return CAC_SUCCESS; +}