s3:net: fix some i18n messages in net_registry_getsd_internal().
[ira/wip.git] / source3 / registry / reg_backend_shares.c
1 /* 
2  *  Unix SMB/CIFS implementation.
3  *  Virtual Windows Registry Layer
4  *  Copyright (C) Gerald Carter                     2005
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 3 of the License, or
9  *  (at your option) any later version.
10  *  
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *  
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 /* Implementation of registry virtual views for printing information */
21
22 #include "includes.h"
23
24 #undef DBGC_CLASS
25 #define DBGC_CLASS DBGC_REGISTRY
26
27 /**********************************************************************
28  It is safe to assume that every registry path passed into one of
29  the exported functions here begins with KEY_SHARES else
30  these functions would have never been called.  This is a small utility
31  function to strip the beginning of the path and make a copy that the
32  caller can modify.  Note that the caller is responsible for releasing
33  the memory allocated here.
34  **********************************************************************/
35
36 static char* trim_reg_path( const char *path )
37 {
38         const char *p;
39         uint16 key_len = strlen(KEY_SHARES);
40
41         /* 
42          * sanity check...this really should never be True.
43          * It is only here to prevent us from accessing outside
44          * the path buffer in the extreme case.
45          */
46
47         if ( strlen(path) < key_len ) {
48                 DEBUG(0,("trim_reg_path: Registry path too short! [%s]\n", path));
49                 return NULL;
50         }
51
52         p = path + strlen( KEY_SHARES );
53
54         if ( *p == '\\' )
55                 p++;
56
57         if ( *p )
58                 return SMB_STRDUP(p);
59         else
60                 return NULL;
61 }
62
63 /**********************************************************************
64  Enumerate registry subkey names given a registry path.  
65  Caller is responsible for freeing memory to **subkeys
66  *********************************************************************/
67
68 static int shares_subkey_info( const char *key, struct regsubkey_ctr *subkey_ctr )
69 {
70         char            *path;
71         bool            top_level = False;
72         int             num_subkeys = 0;
73
74         DEBUG(10, ("shares_subkey_info: key=>[%s]\n", key));
75
76         path = trim_reg_path( key );
77
78         /* check to see if we are dealing with the top level key */
79
80         if ( !path )
81                 top_level = True;
82
83         if ( top_level ) {
84                 num_subkeys = 1;
85                 regsubkey_ctr_addkey( subkey_ctr, "Security" );
86         }
87 #if 0
88         else
89                 num_subkeys = handle_share_subpath( path, subkey_ctr, NULL );
90 #endif
91
92         SAFE_FREE( path );
93
94         return num_subkeys;
95 }
96
97 /**********************************************************************
98  Enumerate registry values given a registry path.  
99  Caller is responsible for freeing memory 
100  *********************************************************************/
101
102 static int shares_value_info(const char *key, struct regval_ctr *val)
103 {
104         char            *path;
105         bool            top_level = False;
106         int             num_values = 0;
107
108         DEBUG(10, ("shares_value_info: key=>[%s]\n", key));
109
110         path = trim_reg_path( key );
111
112         /* check to see if we are dealing with the top level key */
113
114         if ( !path )
115                 top_level = True;
116
117         /* fill in values from the getprinterdata_printer_server() */
118         if ( top_level )
119                 num_values = 0;
120 #if 0
121         else
122                 num_values = handle_printing_subpath( path, NULL, val );
123 #endif
124
125         SAFE_FREE(path);
126
127         return num_values;
128 }
129
130 /**********************************************************************
131  Stub function which always returns failure since we don't want
132  people storing share information directly via registry calls
133  (for now at least)
134  *********************************************************************/
135
136 static bool shares_store_subkey( const char *key, struct regsubkey_ctr *subkeys )
137 {
138         return False;
139 }
140
141 /**********************************************************************
142  Stub function which always returns failure since we don't want
143  people storing share information directly via registry calls
144  (for now at least)
145  *********************************************************************/
146
147 static bool shares_store_value(const char *key, struct regval_ctr *val)
148 {
149         return False;
150 }
151
152 /* 
153  * Table of function pointers for accessing printing data
154  */
155  
156 struct registry_ops shares_reg_ops = {
157         .fetch_subkeys = shares_subkey_info,
158         .fetch_values = shares_value_info,
159         .store_subkeys = shares_store_subkey,
160         .store_values = shares_store_value,
161 };
162
163