r23785: use the GPLv3 boilerplate as recommended by the FSF and the license text
[ira/wip.git] / testsuite / printing / psec.c
index e3490de7598e4df220021530ccd3a25b2fe838cb..33a45e89d03d097280f04212e77398ce4f2b1118 100644 (file)
@@ -8,7 +8,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -17,8 +17,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 /* This program can get or set NT printer security permissions from the 
@@ -71,7 +70,7 @@ TDB_CONTEXT *tdb;
 
 char *ace_type_to_str(uint ace_type)
 {
-       fstring temp;
+       static fstring temp;
 
        switch(ace_type) {
        case SEC_ACE_TYPE_ACCESS_DENIED:
@@ -99,7 +98,7 @@ uint str_to_ace_type(char *ace_type)
 
 char *ace_mask_to_str(uint32 ace_mask)
 {
-       fstring temp;
+       static fstring temp;
 
        switch (ace_mask) {
        case PRINTER_ACE_FULL_CONTROL:
@@ -132,7 +131,7 @@ uint32 str_to_ace_mask(char *ace_mask)
 
 char *ace_to_str(SEC_ACE *ace)
 {
-       pstring temp;
+       static pstring temp;
        fstring sidstr;
 
        sid_to_string(sidstr, &ace->sid);
@@ -144,7 +143,7 @@ char *ace_to_str(SEC_ACE *ace)
        return temp;
 }
 
-int str_to_ace(SEC_ACE *ace, char *ace_str)
+void str_to_ace(SEC_ACE *ace, char *ace_str)
 {
        SEC_ACCESS sa;
        DOM_SID sid;
@@ -165,9 +164,13 @@ int psec_getsec(char *printer)
        prs_struct ps;
        int result = 0, i;
 
+       ZERO_STRUCT(ps);
+
        /* Open tdb for reading */
 
-       slprintf(tdb_path, "%s/ntdrivers.tdb", LOCKDIR);
+       slprintf(tdb_path, sizeof(tdb_path) - 1, "%s/ntdrivers.tdb", 
+                lp_lockdir());
+
        tdb = tdb_open(tdb_path, 0, 0, O_RDONLY, 0600);
 
        if (!tdb) {
@@ -191,8 +194,11 @@ int psec_getsec(char *printer)
        if (tdb_prs_fetch(tdb, keystr, &ps, mem_ctx) != 0) {
                printf("error fetching descriptor for printer %s\n",
                       printer);
-               result = 1;
-               goto done;
+               /* cannot do a prs_mem_free() when tdb_prs_fetch fails */
+               /* as the prs structure has not been initialized */
+               tdb_close(tdb);
+               talloc_destroy(mem_ctx);
+               return 1;
        }
 
        /* Unpack into security descriptor buffer */
@@ -230,7 +236,6 @@ int psec_getsec(char *printer)
 
        for (i = 0; i < secdesc_ctr->sec->dacl->num_aces; i++) {
                SEC_ACE *ace = &secdesc_ctr->sec->dacl->ace[i];
-               fstring sidstr;
 
                sid_to_string(sidstr, &ace->sid);
 
@@ -242,6 +247,7 @@ int psec_getsec(char *printer)
        if (tdb) tdb_close(tdb);
        if (mem_ctx) talloc_destroy(mem_ctx);
        if (secdesc_ctr) free_sec_desc_buf(&secdesc_ctr);
+       prs_mem_free(&ps);
 
        return result;
 }
@@ -252,7 +258,7 @@ int psec_setsec(char *printer)
 {
        DOM_SID user_sid, group_sid;
        SEC_ACE *ace_list = NULL;
-       SEC_ACL *dacl;
+       SEC_ACL *dacl = NULL;
        SEC_DESC *sd;
        SEC_DESC_BUF *sdb = NULL;
        int result = 0, num_aces = 0;
@@ -262,9 +268,13 @@ int psec_setsec(char *printer)
        TALLOC_CTX *mem_ctx = NULL;
        BOOL has_user_sid = False, has_group_sid = False;
 
+       ZERO_STRUCT(ps);
+
        /* Open tdb for reading */
 
-       slprintf(tdb_path, "%s/ntdrivers.tdb", LOCKDIR);
+       slprintf(tdb_path, sizeof(tdb_path) - 1, "%s/ntdrivers.tdb", 
+                lp_lockdir());
+
        tdb = tdb_open(tdb_path, 0, 0, O_RDWR, 0600);
 
        if (!tdb) {
@@ -319,14 +329,15 @@ int psec_setsec(char *printer)
 
        /* Create security descriptor */
 
-       sd = make_sec_desc(SEC_DESC_REVISION, SEC_DESC_SELF_RELATIVE |
-                          SEC_DESC_DACL_PRESENT, 
+       sd = make_sec_desc(SEC_DESC_REVISION,
                           has_user_sid ? &user_sid : NULL, 
                           has_group_sid ? &group_sid : NULL,
                           NULL, /* System ACL */
                           dacl, /* Discretionary ACL */
                           &size);
 
+       free_sec_acl(&dacl);
+
        sdb = make_sec_desc_buf(size, sd);
 
        free_sec_desc(&sd);
@@ -360,6 +371,7 @@ int psec_setsec(char *printer)
        if (tdb) tdb_close(tdb);
        if (sdb) free_sec_desc_buf(&sdb);
        if (mem_ctx) talloc_destroy(mem_ctx);
+       prs_mem_free(&ps);
 
        return result;
 }
@@ -375,6 +387,8 @@ void usage(void)
 
 int main(int argc, char **argv)
 {
+       pstring servicesf = CONFIGFILE;
+
        /* Argument check */
 
        if (argc == 1) {
@@ -382,6 +396,16 @@ int main(int argc, char **argv)
                return 1;
        }
 
+       /* Load smb.conf file */
+
+       charset_initialise();
+
+       if (!lp_load(servicesf,False,False,True)) {
+               fprintf(stderr, "Couldn't load confiuration file %s\n",
+                       servicesf);
+               return 1;
+       }
+
        /* Do commands */
 
        if (strcmp(argv[1], "setsec") == 0) {