mirror of
https://github.com/samba-team/samba.git
synced 2025-02-23 09:57:40 +03:00
Added Shirish's client side caching policy change.
Jeremy. (This used to be commit 16015c07eab2e57fa3771051e3e08fde21757cfa)
This commit is contained in:
parent
74af2c2cca
commit
4ad0ff29bf
@ -348,6 +348,27 @@ typedef struct share_info_2_info
|
||||
|
||||
} SRV_SHARE_INFO_2;
|
||||
|
||||
typedef struct ptr_share_info501
|
||||
{
|
||||
uint32 ptr_netname; /* pointer to net name */
|
||||
uint32 type; /* ipc, print, disk */
|
||||
uint32 ptr_remark; /* pointer to comment */
|
||||
uint32 csc_policy; /* client-side offline caching policy << 4 */
|
||||
} SH_INFO_501;
|
||||
|
||||
typedef struct str_share_info501
|
||||
{
|
||||
UNISTR2 uni_netname; /* unicode string of net name */
|
||||
UNISTR2 uni_remark; /* unicode string of comment */
|
||||
} SH_INFO_501_STR;
|
||||
|
||||
/* SRV_SHARE_INFO_501 */
|
||||
typedef struct share_info_501_info
|
||||
{
|
||||
SH_INFO_501 info_501;
|
||||
SH_INFO_501_STR info_501_str;
|
||||
} SRV_SHARE_INFO_501;
|
||||
|
||||
/* SH_INFO_502 (pointers to level 502 share info strings) */
|
||||
typedef struct ptr_share_info502
|
||||
{
|
||||
@ -413,6 +434,7 @@ typedef struct srv_share_info_ctr_info
|
||||
union {
|
||||
SRV_SHARE_INFO_1 *info1; /* share info level 1 */
|
||||
SRV_SHARE_INFO_2 *info2; /* share info level 2 */
|
||||
SRV_SHARE_INFO_501 *info501; /* share info level 501 */
|
||||
SRV_SHARE_INFO_502 *info502; /* share info level 502 */
|
||||
void *info;
|
||||
|
||||
@ -469,9 +491,10 @@ typedef struct srv_share_info {
|
||||
union {
|
||||
SRV_SHARE_INFO_1 info1;
|
||||
SRV_SHARE_INFO_2 info2;
|
||||
SRV_SHARE_INFO_501 info501;
|
||||
SRV_SHARE_INFO_502 info502;
|
||||
SRV_SHARE_INFO_1005 info1005;
|
||||
SRV_SHARE_INFO_1501 info1501;
|
||||
SRV_SHARE_INFO_1005 info1005;
|
||||
SRV_SHARE_INFO_1501 info1501;
|
||||
} share;
|
||||
} SRV_SHARE_INFO;
|
||||
|
||||
|
@ -345,6 +345,7 @@ typedef struct
|
||||
int iDefaultCase;
|
||||
int iPrinting;
|
||||
int iOplockContentionLimit;
|
||||
int iCSCPolicy;
|
||||
BOOL bAlternatePerm;
|
||||
BOOL bPreexecClose;
|
||||
BOOL bRootpreexecClose;
|
||||
@ -461,6 +462,7 @@ static service sDefault = {
|
||||
CASE_LOWER, /* iDefaultCase */
|
||||
DEFAULT_PRINTING, /* iPrinting */
|
||||
2, /* iOplockContentionLimit */
|
||||
0, /* iCSCPolicy */
|
||||
False, /* bAlternatePerm */
|
||||
False, /* bPreexecClose */
|
||||
False, /* bRootpreexecClose */
|
||||
@ -514,8 +516,6 @@ static service sDefault = {
|
||||
"" /* dummy */
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* local variables */
|
||||
static service **ServicePtrs = NULL;
|
||||
static int iNumServices = 0;
|
||||
@ -634,6 +634,19 @@ static struct enum_list enum_bool_auto[] = {
|
||||
{-1, NULL}
|
||||
};
|
||||
|
||||
/* Client-side offline caching policy types */
|
||||
#define CSC_POLICY_MANUAL 0
|
||||
#define CSC_POLICY_DOCUMENTS 1
|
||||
#define CSC_POLICY_PROGRAMS 2
|
||||
#define CSC_POLICY_DISABLE 3
|
||||
|
||||
static struct enum_list enum_csc_policy[] = {
|
||||
{CSC_POLICY_MANUAL, "manual"},
|
||||
{CSC_POLICY_DOCUMENTS, "documents"},
|
||||
{CSC_POLICY_PROGRAMS, "programs"},
|
||||
{CSC_POLICY_DISABLE, "disable"}
|
||||
};
|
||||
|
||||
/*
|
||||
Do you want session setups at user level security with a invalid
|
||||
password to be rejected or allowed in as guest? WinNT rejects them
|
||||
@ -968,6 +981,7 @@ static struct parm_struct parm_table[] = {
|
||||
{"Locking Options", P_SEP, P_SEPARATOR},
|
||||
|
||||
{"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
|
||||
{"csc policy", P_ENUM, P_LOCAL, &sDefault.iCSCPolicy, NULL, enum_csc_policy, FLAG_SHARE | FLAG_GLOBAL},
|
||||
{"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE},
|
||||
{"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
|
||||
{"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
|
||||
@ -1771,6 +1785,7 @@ FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
|
||||
FN_LOCAL_INTEGER(lp_maxprintjobs, iMaxPrintJobs)
|
||||
FN_LOCAL_INTEGER(lp_printing, iPrinting)
|
||||
FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
|
||||
FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
|
||||
FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
|
||||
FN_LOCAL_CHAR(lp_magicchar, magic_char)
|
||||
FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
|
||||
|
@ -207,6 +207,87 @@ static BOOL srv_io_share_info2(char *desc, SH_INFO_2 *sh2, prs_struct *ps, int d
|
||||
return True;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Inits a SH_INFO_2 structure
|
||||
*******************************************************************/
|
||||
|
||||
void init_srv_share_info501(SH_INFO_501 *sh501, char *net_name, uint32 type, char *remark, uint32 csc_policy)
|
||||
{
|
||||
DEBUG(5,("init_srv_share_info501: %s %8x %s %08x\n", net_name, type,
|
||||
remark, csc_policy));
|
||||
|
||||
ZERO_STRUCTP(sh501);
|
||||
|
||||
sh501->ptr_netname = (net_name != NULL) ? 1 : 0;
|
||||
sh501->type = type;
|
||||
sh501->ptr_remark = (remark != NULL) ? 1 : 0;
|
||||
sh501->csc_policy = csc_policy;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Reads of writes a structure.
|
||||
*******************************************************************/
|
||||
|
||||
static BOOL srv_io_share_info501(char *desc, SH_INFO_501 *sh501, prs_struct *ps, int depth)
|
||||
{
|
||||
if (sh501 == NULL)
|
||||
return False;
|
||||
|
||||
prs_debug(ps, depth, desc, "srv_io_share_info501");
|
||||
depth++;
|
||||
|
||||
if (!prs_align(ps))
|
||||
return False;
|
||||
|
||||
if (!prs_uint32("ptr_netname", ps, depth, &sh501->ptr_netname))
|
||||
return False;
|
||||
if (!prs_uint32("type ", ps, depth, &sh501->type))
|
||||
return False;
|
||||
if (!prs_uint32("ptr_remark ", ps, depth, &sh501->ptr_remark))
|
||||
return False;
|
||||
if (!prs_uint32("csc_policy ", ps, depth, &sh501->csc_policy))
|
||||
return False;
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
Inits a SH_INFO_501_STR structure
|
||||
********************************************************************/
|
||||
|
||||
void init_srv_share_info501_str(SH_INFO_501_STR *sh501, char *net_name, char *remark)
|
||||
{
|
||||
DEBUG(5,("init_srv_share_info501_str\n"));
|
||||
|
||||
init_unistr2(&sh501->uni_netname, net_name, strlen(net_name)+1);
|
||||
init_unistr2(&sh501->uni_remark, remark, strlen(remark)+1);
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Reads or writes a structure.
|
||||
********************************************************************/
|
||||
|
||||
static BOOL srv_io_share_info501_str(char *desc, SH_INFO_501_STR *sh501, prs_struct *ps, int depth)
|
||||
{
|
||||
if (sh501 == NULL)
|
||||
return False;
|
||||
|
||||
prs_debug(ps, depth, desc, "srv_io_share_info501_str");
|
||||
depth++;
|
||||
|
||||
if(!prs_align(ps))
|
||||
return False;
|
||||
if(!smb_io_unistr2("", &sh501->uni_netname, True, ps, depth))
|
||||
return False;
|
||||
|
||||
if(!prs_align(ps))
|
||||
return False;
|
||||
if(!smb_io_unistr2("", &sh501->uni_remark, True, ps, depth))
|
||||
return False;
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Inits a SH_INFO_502 structure
|
||||
********************************************************************/
|
||||
@ -502,6 +583,32 @@ static BOOL srv_io_srv_share_ctr(char *desc, SRV_SHARE_INFO_CTR *ctr, prs_struct
|
||||
break;
|
||||
}
|
||||
|
||||
case 501:
|
||||
{
|
||||
SRV_SHARE_INFO_501 *info501 = ctr->share.info501;
|
||||
int num_entries = ctr->num_entries;
|
||||
int i;
|
||||
|
||||
if (UNMARSHALLING(ps)) {
|
||||
if (!(info501 = (SRV_SHARE_INFO_501 *) prs_alloc_mem(ps, num_entries *
|
||||
sizeof (SRV_SHARE_INFO_501))))
|
||||
return False;
|
||||
ctr->share.info501 = info501;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_entries; i++) {
|
||||
if (!srv_io_share_info501("", &info501[i].info_501, ps, depth))
|
||||
return False;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_entries; i++) {
|
||||
if (!srv_io_share_info501_str("", &info501[i].info_501_str, ps, depth))
|
||||
return False;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 502:
|
||||
{
|
||||
SRV_SHARE_INFO_502 *info502 = ctr->share.info502;
|
||||
@ -691,6 +798,13 @@ static BOOL srv_io_srv_share_info(char *desc, prs_struct *ps, int depth, SRV_SHA
|
||||
return False;
|
||||
|
||||
break;
|
||||
case 501:
|
||||
if (!srv_io_share_info501("", &r_n->share.info501.info_501, ps, depth))
|
||||
return False;
|
||||
if (!srv_io_share_info501_str("", &r_n->share.info501.info_501_str, ps, depth))
|
||||
return False;
|
||||
break;
|
||||
|
||||
case 502:
|
||||
if(!srv_io_share_info502("", &r_n->share.info502.info_502, ps, depth))
|
||||
return False;
|
||||
|
@ -342,6 +342,38 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Fill in a share info level 501 structure.
|
||||
********************************************************************/
|
||||
|
||||
static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum)
|
||||
{
|
||||
int len_net_name;
|
||||
pstring net_name;
|
||||
pstring remark;
|
||||
uint32 type;
|
||||
uint32 csc_policy;
|
||||
|
||||
pstrcpy(net_name, lp_servicename(snum));
|
||||
pstrcpy(remark, lp_comment(snum));
|
||||
standard_sub_conn(p->conn, remark);
|
||||
|
||||
len_net_name = strlen(net_name);
|
||||
|
||||
/* work out the share type */
|
||||
type = STYPE_DISKTREE;
|
||||
|
||||
if (lp_print_ok(snum))
|
||||
type = STYPE_PRINTQ;
|
||||
if (strequal("IPC$", net_name) || strequal("ADMIN$", net_name))
|
||||
type = STYPE_IPC;
|
||||
if (net_name[len_net_name] == '$')
|
||||
type |= STYPE_HIDDEN;
|
||||
|
||||
init_srv_share_info501(&sh501->info_501, net_name, type, remark, (lp_csc_policy(snum) << 4));
|
||||
init_srv_share_info501_str(&sh501->info_501_str, net_name, remark);
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Fill in a share info level 502 structure.
|
||||
********************************************************************/
|
||||
@ -484,6 +516,23 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr,
|
||||
break;
|
||||
}
|
||||
|
||||
case 501:
|
||||
{
|
||||
SRV_SHARE_INFO_501 *info501;
|
||||
int i = 0;
|
||||
|
||||
info501 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_501));
|
||||
|
||||
for (snum = *resume_hnd; snum < num_services; snum++) {
|
||||
if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) {
|
||||
init_srv_share_info_501(p, &info501[i++], snum);
|
||||
}
|
||||
}
|
||||
|
||||
ctr->share.info501 = info501;
|
||||
break;
|
||||
}
|
||||
|
||||
case 502:
|
||||
{
|
||||
SRV_SHARE_INFO_502 *info502;
|
||||
@ -552,6 +601,9 @@ static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_I
|
||||
case 2:
|
||||
init_srv_share_info_2(p, &r_n->info.share.info2, snum);
|
||||
break;
|
||||
case 501:
|
||||
init_srv_share_info_501(p, &r_n->info.share.info501, snum);
|
||||
break;
|
||||
case 502:
|
||||
init_srv_share_info_502(p, &r_n->info.share.info502, snum);
|
||||
break;
|
||||
|
@ -285,7 +285,8 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
|
||||
|
||||
/* what does setting this bit do? It is set by NT4 and
|
||||
may affect the ability to autorun mounted cdroms */
|
||||
SSVAL(outbuf, smb_vwv2, SMB_SUPPORT_SEARCH_BITS);
|
||||
SSVAL(outbuf, smb_vwv2, SMB_SUPPORT_SEARCH_BITS|
|
||||
(lp_csc_policy(SNUM(conn)) << 2));
|
||||
|
||||
init_dfsroot(conn, inbuf, outbuf);
|
||||
}
|
||||
|
@ -306,7 +306,8 @@ static int tdb_oob(TDB_CONTEXT *tdb, tdb_off len, int probe)
|
||||
}
|
||||
|
||||
/* Unmap, update size, remap */
|
||||
tdb_munmap(tdb);
|
||||
if (tdb_munmap(tdb) == -1)
|
||||
return TDB_ERRCODE(TDB_ERR_IO, -1);
|
||||
tdb->map_size = st.st_size;
|
||||
tdb_mmap(tdb);
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user