⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util_sid.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		*rid = sid->sub_auths[sid->num_auths];		return True;	}	return False;}/***************************************************************** Return the last rid from the end of a sid*****************************************************************/  BOOL sid_peek_rid(const DOM_SID *sid, uint32 *rid){	if (!sid || !rid)		return False;				if (sid->num_auths > 0) {		*rid = sid->sub_auths[sid->num_auths - 1];		return True;	}	return False;}/***************************************************************** Return the last rid from the end of a sid and check the sid against the exp_dom_sid  *****************************************************************/  BOOL sid_peek_check_rid(const DOM_SID *exp_dom_sid, const DOM_SID *sid, uint32 *rid){	if (!exp_dom_sid || !sid || !rid)		return False;				if (sid->num_auths != (exp_dom_sid->num_auths+1)) {		return False;	}	if (sid_compare_domain(exp_dom_sid, sid)!=0){		*rid=(-1);		return False;	}		return sid_peek_rid(sid, rid);}/***************************************************************** Copies a sid*****************************************************************/  void sid_copy(DOM_SID *dst, const DOM_SID *src){	int i;	ZERO_STRUCTP(dst);	dst->sid_rev_num = src->sid_rev_num;	dst->num_auths = src->num_auths;	memcpy(&dst->id_auth[0], &src->id_auth[0], sizeof(src->id_auth));	for (i = 0; i < src->num_auths; i++)		dst->sub_auths[i] = src->sub_auths[i];}/***************************************************************** Write a sid out into on-the-wire format.*****************************************************************/  BOOL sid_linearize(char *outbuf, size_t len, const DOM_SID *sid){	size_t i;	if (len < sid_size(sid))		return False;	SCVAL(outbuf,0,sid->sid_rev_num);	SCVAL(outbuf,1,sid->num_auths);	memcpy(&outbuf[2], sid->id_auth, 6);	for(i = 0; i < sid->num_auths; i++)		SIVAL(outbuf, 8 + (i*4), sid->sub_auths[i]);	return True;}/***************************************************************** Parse a on-the-wire SID to a DOM_SID.*****************************************************************/  BOOL sid_parse(const char *inbuf, size_t len, DOM_SID *sid){	int i;	if (len < 8)		return False;	ZERO_STRUCTP(sid);	sid->sid_rev_num = CVAL(inbuf, 0);	sid->num_auths = CVAL(inbuf, 1);	memcpy(sid->id_auth, inbuf+2, 6);	if (len < 8 + sid->num_auths*4)		return False;	for (i=0;i<sid->num_auths;i++)		sid->sub_auths[i] = IVAL(inbuf, 8+i*4);	return True;}/***************************************************************** Compare the auth portion of two sids.*****************************************************************/  static int sid_compare_auth(const DOM_SID *sid1, const DOM_SID *sid2){	int i;	if (sid1 == sid2)		return 0;	if (!sid1)		return -1;	if (!sid2)		return 1;	if (sid1->sid_rev_num != sid2->sid_rev_num)		return sid1->sid_rev_num - sid2->sid_rev_num;	for (i = 0; i < 6; i++)		if (sid1->id_auth[i] != sid2->id_auth[i])			return sid1->id_auth[i] - sid2->id_auth[i];	return 0;}/***************************************************************** Compare two sids.*****************************************************************/  int sid_compare(const DOM_SID *sid1, const DOM_SID *sid2){	int i;	if (sid1 == sid2)		return 0;	if (!sid1)		return -1;	if (!sid2)		return 1;	/* Compare most likely different rids, first: i.e start at end */	if (sid1->num_auths != sid2->num_auths)		return sid1->num_auths - sid2->num_auths;	for (i = sid1->num_auths-1; i >= 0; --i)		if (sid1->sub_auths[i] != sid2->sub_auths[i])			return sid1->sub_auths[i] - sid2->sub_auths[i];	return sid_compare_auth(sid1, sid2);}/***************************************************************** See if 2 SIDs are in the same domain this just compares the leading sub-auths*****************************************************************/  int sid_compare_domain(const DOM_SID *sid1, const DOM_SID *sid2){	int n, i;	n = MIN(sid1->num_auths, sid2->num_auths);	for (i = n-1; i >= 0; --i)		if (sid1->sub_auths[i] != sid2->sub_auths[i])			return sid1->sub_auths[i] - sid2->sub_auths[i];	return sid_compare_auth(sid1, sid2);}/***************************************************************** Compare two sids.*****************************************************************/  BOOL sid_equal(const DOM_SID *sid1, const DOM_SID *sid2){	return sid_compare(sid1, sid2) == 0;}/***************************************************************** Check if the SID is the builtin SID (S-1-5-32).*****************************************************************/  BOOL sid_check_is_builtin(const DOM_SID *sid){	return sid_equal(sid, &global_sid_Builtin);}/***************************************************************** Check if the SID is one of the builtin SIDs (S-1-5-32-a).*****************************************************************/  BOOL sid_check_is_in_builtin(const DOM_SID *sid){	DOM_SID dom_sid;	uint32 rid;	sid_copy(&dom_sid, sid);	sid_split_rid(&dom_sid, &rid);		return sid_equal(&dom_sid, &global_sid_Builtin);}/***************************************************************** Calculates size of a sid.*****************************************************************/  size_t sid_size(const DOM_SID *sid){	if (sid == NULL)		return 0;	return sid->num_auths * sizeof(uint32) + 8;}/***************************************************************** Returns true if SID is internal (and non-mappable).*****************************************************************/BOOL non_mappable_sid(DOM_SID *sid){	DOM_SID dom;	uint32 rid;	sid_copy(&dom, sid);	sid_split_rid(&dom, &rid);	if (sid_equal(&dom, &global_sid_Builtin))		return True;	if (sid_equal(&dom, &global_sid_NT_Authority))		return True;	return False;}/***************************************************************** Return the binary string representation of a DOM_SID. Caller must free.*****************************************************************/char *sid_binstring(const DOM_SID *sid){	char *buf, *s;	int len = sid_size(sid);	buf = SMB_MALLOC(len);	if (!buf)		return NULL;	sid_linearize(buf, len, sid);	s = binary_string(buf, len);	free(buf);	return s;}/******************************************************************* Tallocs a duplicate SID. ********************************************************************/ DOM_SID *sid_dup_talloc(TALLOC_CTX *ctx, const DOM_SID *src){	DOM_SID *dst;		if(!src)		return NULL;		if((dst = TALLOC_ZERO_P(ctx, DOM_SID)) != NULL) {		sid_copy( dst, src);	}		return dst;}/******************************************************************** Add SID to an array SIDs********************************************************************/void add_sid_to_array(TALLOC_CTX *mem_ctx, const DOM_SID *sid, 		      DOM_SID **sids, size_t *num){	if (mem_ctx != NULL)		*sids = TALLOC_REALLOC_ARRAY(mem_ctx, *sids, DOM_SID,					     (*num)+1);	else		*sids = SMB_REALLOC_ARRAY(*sids, DOM_SID, (*num)+1);	if (*sids == NULL)		return;	sid_copy(&((*sids)[*num]), sid);	*num += 1;	return;}/******************************************************************** Add SID to an array SIDs ensuring that it is not already there********************************************************************/void add_sid_to_array_unique(TALLOC_CTX *mem_ctx, const DOM_SID *sid,			     DOM_SID **sids, size_t *num_sids){	size_t i;	for (i=0; i<(*num_sids); i++) {		if (sid_compare(sid, &(*sids)[i]) == 0)			return;	}	add_sid_to_array(mem_ctx, sid, sids, num_sids);}/******************************************************************** Remove SID from an array********************************************************************/void del_sid_from_array(const DOM_SID *sid, DOM_SID **sids, size_t *num){	DOM_SID *sid_list = *sids;	size_t i;	for ( i=0; i<*num; i++ ) {		/* if we find the SID, then decrement the count		   and break out of the loop */		if ( sid_equal(sid, &sid_list[i]) ) {			*num -= 1;			break;		}	}	/* This loop will copy the remainder of the array 	   if i < num of sids ni the array */	for ( ; i<*num; i++ ) 		sid_copy( &sid_list[i], &sid_list[i+1] );		return;}BOOL is_null_sid(const DOM_SID *sid){	static const DOM_SID null_sid = {0};	return sid_equal(sid, &null_sid);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -