1
0
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:
Jeremy Allison 2002-04-10 01:04:13 +00:00
parent 74af2c2cca
commit 4ad0ff29bf
6 changed files with 212 additions and 6 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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);
}

View File

@ -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;