Added Shirish's client side caching policy change.
authorJeremy Allison <jra@samba.org>
Wed, 10 Apr 2002 01:04:13 +0000 (01:04 +0000)
committerJeremy Allison <jra@samba.org>
Wed, 10 Apr 2002 01:04:13 +0000 (01:04 +0000)
Jeremy.

source/include/rpc_srvsvc.h
source/param/loadparm.c
source/rpc_parse/parse_srv.c
source/rpc_server/srv_srvsvc_nt.c
source/smbd/reply.c
source/tdb/tdb.c

index c605684558b01ff2df01e41cf988b2bfb3f10df5..5ebb41036e8fd7cf6d7858e0e5c77694b6c04ca0 100644 (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;
 
index 790d73d3cbd0e07c96cdbedb56a5b11fdbcf4bfc..11c8f2c44b9b1a5ccd50d964c765e8524f07b443 100644 (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)
index f94c51bfa0ae3823baddbf1d3127e70b1162294a..9c9d5f1e9cb9e513c787b147bdd13f41f6963bf9 100644 (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;
index 295c733ab564150d1f4136e0d56b88a4899bc40c..6416cfc4ac537a629937687f0a577442da128037 100644 (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;
index 421f8862838354efe0585fc0a40f311647f2f60d..f3b3ce4a8a2473925aab3108953cdfdf4d26b9a6 100644 (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);
        }
index 0a847ed690c49ffe021c9e062df5ba8ecdf8c110..98caca82a100ba702cdbe6d03ad9ce2532058397 100644 (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;