Some const correctness. Stop tdb being used as a remote backend. If an
authorJeremy Allison <jra@samba.org>
Fri, 27 Jun 2003 20:55:48 +0000 (20:55 +0000)
committerJeremy Allison <jra@samba.org>
Fri, 27 Jun 2003 20:55:48 +0000 (20:55 +0000)
idmap backend is specified cause smbd to ask winbindd (use winbindd if
you want a consistant remote backend solution).
Should work well enough for next beta now...
Jeremy.
(This used to be commit 8f830c509af5976d988a30f0b0aee4ec61dd97a3)

source3/nsswitch/winbindd.c
source3/printing/notify.c
source3/sam/idmap.c
source3/sam/idmap_tdb.c
source3/sam/idmap_winbind.c
source3/smbd/nttrans.c
source3/smbd/server.c
source3/utils/net_idmap.c
source3/utils/pdbedit.c
source3/utils/smbcontrol.c

index 85403eedebce228001aafbfa9a98056c0b9cad1c..ff9d0b90b9d209aae0e99d442f970753ddad4629 100644 (file)
@@ -845,7 +845,7 @@ int main(int argc, char **argv)
        if (!winbindd_upgrade_idmap())
                return 1;
 
-       if (!idmap_init())
+       if (!idmap_init(lp_idmap_backend()))
                return 1;
 
        if (!idmap_init_wellknown_sids())
index ee973da211c5c41e6db6e66b7f9d5907fe0bad29..479d883134b9bedcd66f90dde777975fd3290518 100644 (file)
@@ -480,7 +480,7 @@ void notify_printer_location(int snum, char *location)
                snum, strlen(location) + 1, location);
 }
 
-void notify_printer_byname( char *printername, uint32 change, char *value )
+void notify_printer_byname( const char *printername, uint32 change, char *value )
 {
        int snum = print_queue_snum(printername);
        int type = PRINTER_NOTIFY_TYPE;
index 25a3c2ba94f8529e038be0a125d83fa79139d96f..7e50fe1906fccdbe2f1fbafc5abf8c120a922779 100644 (file)
@@ -4,6 +4,7 @@
    Copyright (C) Tim Potter 2000
    Copyright (C) Anthony Liguori <aliguor@us.ibm.com>  2003
    Copyright (C) Simo Sorce 2003
+   Copyright (C) Jeremy Allison 2003.
 
    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
@@ -32,37 +33,37 @@ struct idmap_function_entry {
 
 static struct idmap_function_entry *backends = NULL;
 
-static struct idmap_methods *local_map;
+static struct idmap_methods *cache_map;
 static struct idmap_methods *remote_map;
 
-static void lazy_initialize_idmap(void)
-{
-       static BOOL initialized = False;
+/**********************************************************************
+ Get idmap methods. Don't allow tdb to be a remote method.
+**********************************************************************/
 
-       if(!initialized) {
-               idmap_init();
-               initialized = True;
-       }
-}
-
-static struct idmap_methods *get_methods(const char *name)
+static struct idmap_methods *get_methods(const char *name, BOOL cache_method)
 {
        struct idmap_function_entry *entry = backends;
 
-       while(entry) {
-               if (strcmp(entry->name, name) == 0) return entry->methods;
-               entry = entry->next;
+       for(entry = backends; entry; entry = entry->next) {
+               if (!cache_method && strequal(entry->name, "tdb"))
+                       continue; /* tdb is only cache method. */
+               if (strequal(entry->name, name))
+                       return entry->methods;
        }
 
        return NULL;
 }
 
+/**********************************************************************
+ Allow a module to register itself as a method.
+**********************************************************************/
+
 NTSTATUS smb_register_idmap(int version, const char *name, struct idmap_methods *methods)
 {
        struct idmap_function_entry *entry;
 
        if ((version != SMB_IDMAP_INTERFACE_VERSION)) {
-               DEBUG(0, ("Failed to register idmap module.\n"
+               DEBUG(0, ("smb_register_idmap: Failed to register idmap module.\n"
                          "The module was compiled against SMB_IDMAP_INTERFACE_VERSION %d,\n"
                          "current SMB_IDMAP_INTERFACE_VERSION is %d.\n"
                          "Please recompile against the current version of samba!\n",  
@@ -71,12 +72,12 @@ NTSTATUS smb_register_idmap(int version, const char *name, struct idmap_methods
        }
 
        if (!name || !name[0] || !methods) {
-               DEBUG(0,("smb_register_idmap() called with NULL pointer or empty name!\n"));
+               DEBUG(0,("smb_register_idmap: called with NULL pointer or empty name!\n"));
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       if (get_methods(name)) {
-               DEBUG(0,("idmap module %s already registered!\n", name));
+       if (get_methods(name, False)) {
+               DEBUG(0,("smb_register_idmap: idmap module %s already registered!\n", name));
                return NT_STATUS_OBJECT_NAME_COLLISION;
        }
 
@@ -85,67 +86,73 @@ NTSTATUS smb_register_idmap(int version, const char *name, struct idmap_methods
        entry->methods = methods;
 
        DLIST_ADD(backends, entry);
-       DEBUG(5, ("Successfully added idmap backend '%s'\n", name));
+       DEBUG(5, ("smb_register_idmap: Successfully added idmap backend '%s'\n", name));
        return NT_STATUS_OK;
 }
 
-/* Initialize backend */
-BOOL idmap_init(void)
-{
-       const char *remote_backend = lp_idmap_backend();
+/**********************************************************************
+ Initialise idmap cache and a remote backend (if configured).
+**********************************************************************/
 
+BOOL idmap_init(const char *remote_backend)
+{
        if (!backends)
                static_init_idmap;
 
-       if (!local_map) {
-               local_map = get_methods("tdb");
+       if (!cache_map) {
+               cache_map = get_methods("tdb", True);
 
-               if (!local_map) {
-                       DEBUG(0, ("idmap_init: could not find tdb backend!\n"));
+               if (!cache_map) {
+                       DEBUG(0, ("idmap_init: could not find tdb cache backend!\n"));
                        return False;
                }
                
-               if (!NT_STATUS_IS_OK(local_map->init( NULL ))) {
-                       DEBUG(0, ("idmap_init: could not load or create local backend!\n"));
+               if (!NT_STATUS_IS_OK(cache_map->init( NULL ))) {
+                       DEBUG(0, ("idmap_init: could not initialise tdb cache backend!\n"));
                        return False;
                }
        }
        
        if (!remote_map && remote_backend && *remote_backend != 0) {
+               char *rem_backend = smb_xstrdup(remote_backend);
                fstring params = "";
                char *pparams;
                
                /* get any mode parameters passed in */
                
-               if ( (pparams = strchr( remote_backend, ':' )) != NULL ) {
+               if ( (pparams = strchr( rem_backend, ':' )) != NULL ) {
                        *pparams = '\0';
                        pparams++;
                        fstrcpy( params, pparams );
                }
                
-               DEBUG(3, ("idmap_init: using '%s' as remote backend\n", remote_backend));
+               DEBUG(3, ("idmap_init: using '%s' as remote backend\n", rem_backend));
                
-               if((remote_map = get_methods(remote_backend)) ||
-                   (NT_STATUS_IS_OK(smb_probe_module("idmap", remote_backend)) && 
-                   (remote_map = get_methods(remote_backend)))) {
+               if((remote_map = get_methods(rem_backend, False)) ||
+                   (NT_STATUS_IS_OK(smb_probe_module("idmap", rem_backend)) && 
+                   (remote_map = get_methods(rem_backend, False)))) {
                        remote_map->init(params);
                } else {
-                       DEBUG(0, ("idmap_init: could not load remote backend '%s'\n", remote_backend));
+                       DEBUG(0, ("idmap_init: could not load remote backend '%s'\n", rem_backend));
+                       SAFE_FREE(rem_backend);
                        return False;
                }
-
+               SAFE_FREE(rem_backend);
        }
 
        return True;
 }
 
+/**************************************************************************
+ This is a rare operation, designed to allow an explicit mapping to be
+ set up for a sid to a POSIX id. Usually called to set up mappings for groups.
+**************************************************************************/
+
 NTSTATUS idmap_set_mapping(const DOM_SID *sid, unid_t id, int id_type)
 {
        NTSTATUS ret;
 
-       lazy_initialize_idmap();
-
-       ret = local_map->set_mapping(sid, id, id_type);
+       ret = cache_map->set_mapping(sid, id, id_type);
        if (!NT_STATUS_IS_OK(ret)) {
                DEBUG (0, ("idmap_set_mapping: Error, unable to modify local cache!\n"));
                DEBUGADD(0, ("Error: %s", nt_errstr(ret)));
@@ -165,19 +172,21 @@ NTSTATUS idmap_set_mapping(const DOM_SID *sid, unid_t id, int id_type)
        return ret;
 }
 
-/* Get ID from SID */
+/**************************************************************************
+ Get ID from SID. This can create a mapping for a SID to a POSIX id.
+**************************************************************************/
+
 NTSTATUS idmap_get_id_from_sid(unid_t *id, int *id_type, const DOM_SID *sid)
 {
        NTSTATUS ret;
        int loc_type;
 
-       lazy_initialize_idmap();
-
        loc_type = *id_type;
-       if (remote_map) { /* We have a central remote idmap */
+       if (remote_map) {
+               /* We have a central remote idmap so only look in cache not set. */
                loc_type |= ID_QUERY_ONLY;
        }
-       ret = local_map->get_id_from_sid(id, &loc_type, sid);
+       ret = cache_map->get_id_from_sid(id, &loc_type, sid);
        if (!NT_STATUS_IS_OK(ret)) {
                if (remote_map) {
                        ret = remote_map->get_id_from_sid(id, id_type, sid);
@@ -185,6 +194,7 @@ NTSTATUS idmap_get_id_from_sid(unid_t *id, int *id_type, const DOM_SID *sid)
                                DEBUG(3, ("idmap_get_id_from_sid: error fetching id!\n"));
                                return ret;
                        } else {
+                               /* The remote backend gave us a valid mapping, cache it. */
                                loc_type |= ID_CACHE_SAVE;
                                idmap_set_mapping(sid, *id, loc_type);
                        }
@@ -196,19 +206,20 @@ NTSTATUS idmap_get_id_from_sid(unid_t *id, int *id_type, const DOM_SID *sid)
        return ret;
 }
 
-/* Get SID from ID */
+/**************************************************************************
+ Get SID from ID. This must have been created before.
+**************************************************************************/
+
 NTSTATUS idmap_get_sid_from_id(DOM_SID *sid, unid_t id, int id_type)
 {
        NTSTATUS ret;
        int loc_type;
 
-       lazy_initialize_idmap();
-
        loc_type = id_type;
        if (remote_map) {
                loc_type = id_type | ID_QUERY_ONLY;
        }
-       ret = local_map->get_sid_from_id(sid, id, loc_type);
+       ret = cache_map->get_sid_from_id(sid, id, loc_type);
        if (!NT_STATUS_IS_OK(ret)) {
                if (remote_map) {
                        ret = remote_map->get_sid_from_id(sid, id, id_type);
@@ -216,8 +227,9 @@ NTSTATUS idmap_get_sid_from_id(DOM_SID *sid, unid_t id, int id_type)
                                DEBUG(3, ("idmap_get_sid_from_id: unable to fetch sid!\n"));
                                return ret;
                        } else {
+                               /* The remote backend gave us a valid mapping, cache it. */
                                loc_type |= ID_CACHE_SAVE;
-                               idmap_set_mapping(sid, id, loc_type);
+                               ret = cache_map->set_mapping(sid, id, loc_type);
                        }
                }
        }
@@ -225,14 +237,17 @@ NTSTATUS idmap_get_sid_from_id(DOM_SID *sid, unid_t id, int id_type)
        return ret;
 }
 
-/* Close backend */
+/**************************************************************************
+ Shutdown maps.
+**************************************************************************/
+
 NTSTATUS idmap_close(void)
 {
        NTSTATUS ret;
 
-       ret = local_map->close();
+       ret = cache_map->close();
        if (!NT_STATUS_IS_OK(ret)) {
-               DEBUG(3, ("idmap_close: failed to close local cache!\n"));
+               DEBUG(3, ("idmap_close: failed to close local tdb cache!\n"));
        }
 
        if (remote_map) {
@@ -245,11 +260,13 @@ NTSTATUS idmap_close(void)
        return ret;
 }
 
-/* Dump backend status */
+/**************************************************************************
+ Dump backend status.
+**************************************************************************/
+
 void idmap_status(void)
 {
-       lazy_initialize_idmap();
-
-       local_map->status();
-       if (remote_map) remote_map->status();
+       cache_map->status();
+       if (remote_map)
+               remote_map->status();
 }
index c30443f6daf5d29b27460cda87113b621395d744..18a082cb848510b28a08614339ac34d04726df11 100644 (file)
@@ -393,7 +393,7 @@ static NTSTATUS db_set_mapping(const DOM_SID *sid, unid_t id, int id_type)
        
        /* Lock the record for this SID. */
        if (tdb_chainlock(idmap_tdb, ksid) != 0) {
-               DEBUG(10,("db_get_id_from_sid: failed to lock record %s. Error %s\n",
+               DEBUG(10,("db_set_mapping: failed to lock record %s. Error %s\n",
                                ksidstr, tdb_errorstr(idmap_tdb) ));
                return NT_STATUS_UNSUCCESSFUL;
        }
index 6c0d80ab1c0b1b7606c469e2bfdc5e989a7e119f..159071e292dc8de36b78f8d977663deeed01e878 100644 (file)
@@ -157,7 +157,6 @@ static struct idmap_methods winbind_methods = {
        db_set_mapping,
        db_close,
        db_status
-
 };
 
 NTSTATUS idmap_winbind_init(void)
index 0030acc78bd70a68ab4fa4e8e2ed3b50f0bc8f81..13692d3c2c237cd43fb92517ddf11af93e56f23e 100644 (file)
@@ -1753,7 +1753,7 @@ static int call_nt_transact_ioctl(connection_struct *conn, char *inbuf, char *ou
                   but works ok like this --metze
                 */
 
-               DEBUG(1,("FSCTL_GET_REPARSE_POINT: fnum=%d control=0x%08x\n",fnum,control));
+               DEBUG(10,("FSCTL_GET_REPARSE_POINT: fnum=%d control=0x%08x\n",fnum,control));
                send_nt_replies(inbuf, outbuf, bufsize, NT_STATUS_OK, NULL, 0, NULL, 0);
                return -1;
 
@@ -1762,7 +1762,7 @@ static int call_nt_transact_ioctl(connection_struct *conn, char *inbuf, char *ou
                 * --metze
                 */
 
-               DEBUG(1,("FSCTL_GET_REPARSE_POINT: fnum=%d control=0x%08x\n",fnum,control));
+               DEBUG(10,("FSCTL_GET_REPARSE_POINT: fnum=%d control=0x%08x\n",fnum,control));
                send_nt_replies(inbuf, outbuf, bufsize, NT_STATUS_NOT_A_REPARSE_POINT, NULL, 0, NULL, 0);
                return -1;
 
@@ -1771,7 +1771,7 @@ static int call_nt_transact_ioctl(connection_struct *conn, char *inbuf, char *ou
                 * --metze
                 */
 
-               DEBUG(1,("FSCTL_SET_REPARSE_POINT: fnum=%d control=0x%08x\n",fnum,control));
+               DEBUG(10,("FSCTL_SET_REPARSE_POINT: fnum=%d control=0x%08x\n",fnum,control));
                send_nt_replies(inbuf, outbuf, bufsize, NT_STATUS_NOT_A_REPARSE_POINT, NULL, 0, NULL, 0);
                return -1;
                        
@@ -1788,14 +1788,14 @@ static int call_nt_transact_ioctl(connection_struct *conn, char *inbuf, char *ou
                uid_t uid;
                size_t sid_len=SID_MAX_SIZE;
                
-               DEBUG(1,("FSCTL_FIND_FILES_BY_SID: fnum=%d control=0x%08x\n",fnum,control));
+               DEBUG(10,("FSCTL_FIND_FILES_BY_SID: fnum=%d control=0x%08x\n",fnum,control));
                
                /* this is not the length of the sid :-( so unknown 4 bytes */
                /*sid_len = IVAL(pdata,0);      
                DEBUGADD(0,("sid_len: (%u)\n",sid_len));*/
                
                sid_parse(pdata+4,sid_len,&sid);
-               DEBUGADD(2,("SID: %s\n",sid_string_static(&sid)));
+               DEBUGADD(10,("SID: %s\n",sid_string_static(&sid)));
 
                if (!NT_STATUS_IS_OK(sid_to_uid(&sid, &uid))) {
                        DEBUG(0,("sid_to_uid: failed, sid[%s]\n",
index 24cfed5be937697ff1d399eace6380cbabff6389..a767014232be14b2277c5b539445d50e763da3b5 100644 (file)
@@ -845,8 +845,12 @@ void build_options(BOOL screen);
        if(!initialize_password_db(False))
                exit(1);
 
-       if (!idmap_init())
-               exit(1);
+       {
+               const char *idmap_back = lp_idmap_backend();
+
+               if (!idmap_init((idmap_back && *idmap_back) ? "winbind" : NULL))
+                       exit(1);
+       }
 
        if (!idmap_init_wellknown_sids())
                exit(1);
index 0fea4311ecda94558c2d54eb3acb47cf033b94f6..689d4ff8137ec9c6961b1ebab4b3fff42c4d45db 100644 (file)
@@ -75,7 +75,7 @@ static int net_idmap_dump(int argc, const char **argv)
  **********************************************************/
 static int net_idmap_restore(int argc, const char **argv)
 {
-       if (!idmap_init()) {
+       if (!idmap_init(lp_idmap_backend())) {
                d_printf("Could not init idmap\n");
                return -1;
        }
index aa11f2bfdf559df20f23e57c2c57df628bb515c3..3fa27513472a0cd7d95fc1dbe356c815810f2edf 100644 (file)
@@ -609,7 +609,7 @@ int main (int argc, char **argv)
        if (!init_names())
                exit(1);
 
-       if (!idmap_init())
+       if (!idmap_init(lp_idmap_backend()))
                exit(1);
 
        if (!idmap_init_wellknown_sids())
index 06add6af228a306dbe90edf040cc7412a7a9b2eb..e168cf7837c99472d24eb69620be11eb536d9c9f 100644 (file)
@@ -34,7 +34,7 @@ static int num_replies;               /* Used by message callback fns */
 
 /* Send a message to a destination pid.  Zero means broadcast smbd. */
 
-static BOOL send_message(pid_t pid, int msg_type, void *buf, int len,
+static BOOL send_message(pid_t pid, int msg_type, const void *buf, int len,
                         BOOL duplicates)
 {
        TDB_CONTEXT *tdb;
@@ -92,7 +92,7 @@ static void print_string_cb(int msg_type, pid_t pid, void *buf, size_t len)
 
 /* Send no message.  Useful for testing. */
 
-static BOOL do_noop(const pid_t pid, const int argc, char **argv)
+static BOOL do_noop(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> noop\n");
@@ -106,7 +106,7 @@ static BOOL do_noop(const pid_t pid, const int argc, char **argv)
 
 /* Send a debug string */
 
-static BOOL do_debug(const pid_t pid, const int argc, char **argv)
+static BOOL do_debug(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 2) {
                fprintf(stderr, "Usage: smbcontrol <dest> debug "
@@ -120,7 +120,7 @@ static BOOL do_debug(const pid_t pid, const int argc, char **argv)
 
 /* Force a browser election */
 
-static BOOL do_election(const pid_t pid, const int argc, char **argv)
+static BOOL do_election(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> force-election\n");
@@ -139,7 +139,7 @@ static void pong_cb(int msg_type, pid_t pid, void *buf, size_t len)
        num_replies++;
 }
 
-static BOOL do_ping(const pid_t pid, const int argc, char **argv)
+static BOOL do_ping(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> ping\n");
@@ -167,7 +167,7 @@ static BOOL do_ping(const pid_t pid, const int argc, char **argv)
 
 /* Set profiling options */
 
-static BOOL do_profile(const pid_t pid, const int argc, char **argv)
+static BOOL do_profile(const pid_t pid, const int argc, const char **argv)
 {
        int v;
 
@@ -239,7 +239,7 @@ static void profilelevel_rqst(int msg_type, pid_t pid, void *buf, size_t len)
        send_message(pid, MSG_PROFILELEVEL, &v, sizeof(int), False);
 }
 
-static BOOL do_profilelevel(const pid_t pid, const int argc, char **argv)
+static BOOL do_profilelevel(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> profilelevel\n");
@@ -268,7 +268,7 @@ static BOOL do_profilelevel(const pid_t pid, const int argc, char **argv)
 
 /* Display debug level settings */
 
-static BOOL do_debuglevel(const pid_t pid, const int argc, char **argv)
+static BOOL do_debuglevel(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> debuglevel\n");
@@ -296,9 +296,9 @@ static BOOL do_debuglevel(const pid_t pid, const int argc, char **argv)
 
 /* Send a print notify message */
 
-static BOOL do_printnotify(const pid_t pid, const int argc, char **argv)
+static BOOL do_printnotify(const pid_t pid, const int argc, const char **argv)
 {
-       char *cmd;
+       const char *cmd;
 
        /* Check for subcommand */
 
@@ -434,7 +434,7 @@ send:
 
 /* Close a share */
 
-static BOOL do_closeshare(const pid_t pid, const int argc, char **argv)
+static BOOL do_closeshare(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 2) {
                fprintf(stderr, "Usage: smbcontrol <dest> close-share "
@@ -448,7 +448,7 @@ static BOOL do_closeshare(const pid_t pid, const int argc, char **argv)
 
 /* Force a SAM synchronisation */
 
-static BOOL do_samsync(const pid_t pid, const int argc, char **argv)
+static BOOL do_samsync(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> samsync\n");
@@ -461,7 +461,7 @@ static BOOL do_samsync(const pid_t pid, const int argc, char **argv)
 
 /* Force a SAM replication */
 
-static BOOL do_samrepl(const pid_t pid, const int argc, char **argv)
+static BOOL do_samrepl(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> samrepl\n");
@@ -474,7 +474,7 @@ static BOOL do_samrepl(const pid_t pid, const int argc, char **argv)
 
 /* Display talloc pool usage */
 
-static BOOL do_poolusage(const pid_t pid, const int argc, char **argv)
+static BOOL do_poolusage(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> pool-usage\n");
@@ -502,7 +502,7 @@ static BOOL do_poolusage(const pid_t pid, const int argc, char **argv)
 
 /* Perform a dmalloc mark */
 
-static BOOL do_dmalloc_mark(const pid_t pid, const int argc, char **argv)
+static BOOL do_dmalloc_mark(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> dmalloc-mark\n");
@@ -515,8 +515,7 @@ static BOOL do_dmalloc_mark(const pid_t pid, const int argc, char **argv)
 
 /* Perform a dmalloc changed */
 
-static BOOL do_dmalloc_changed(const pid_t pid, const int argc, 
-                              char **argv)
+static BOOL do_dmalloc_changed(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> "
@@ -530,7 +529,7 @@ static BOOL do_dmalloc_changed(const pid_t pid, const int argc,
 
 /* Shutdown a server process */
 
-static BOOL do_shutdown(const pid_t pid, const int argc, char **argv)
+static BOOL do_shutdown(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 1) {
                fprintf(stderr, "Usage: smbcontrol <dest> shutdown\n");
@@ -542,7 +541,7 @@ static BOOL do_shutdown(const pid_t pid, const int argc, char **argv)
 
 /* Notify a driver upgrade */
 
-static BOOL do_drvupgrade(const pid_t pid, const int argc, char **argv)
+static BOOL do_drvupgrade(const pid_t pid, const int argc, const char **argv)
 {
        if (argc != 2) {
                fprintf(stderr, "Usage: smbcontrol <dest> drvupgrade "
@@ -558,7 +557,7 @@ static BOOL do_drvupgrade(const pid_t pid, const int argc, char **argv)
 
 static const struct {
        const char *name;       /* Option name */
-       BOOL (*fn)(const pid_t pid, const int argc, char **argv);
+       BOOL (*fn)(const pid_t pid, const int argc, const char **argv);
        const char *help;       /* Short help text */
 } msg_types[] = {
        { "debug", do_debug, "Set debuglevel"  },
@@ -613,7 +612,7 @@ static void usage(poptContext *pc)
 
 /* Return the pid number for a string destination */
 
-static pid_t parse_dest(char *dest)
+static pid_t parse_dest(const char *dest)
 {
        pid_t pid;
 
@@ -644,9 +643,9 @@ static pid_t parse_dest(char *dest)
 
 /* Execute smbcontrol command */
 
-static BOOL do_command(int argc, char **argv)
+static BOOL do_command(int argc, const char **argv)
 {
-       char *dest = argv[0], *command = argv[1];
+       const char *dest = argv[0], *command = argv[1];
        pid_t pid;
        int i;
 
@@ -669,7 +668,7 @@ static BOOL do_command(int argc, char **argv)
 
 /* Main program */
 
-int main(int argc, char **argv)
+int main(int argc, const char **argv)
 {
        poptContext pc;
        int opt;
@@ -726,7 +725,7 @@ int main(int argc, char **argv)
            argv.  The argc parameter should have been decremented to the
            correct value in the above switch statement. */
 
-       argv = (char **)poptGetArgs(pc);
+       argv = (const char **)poptGetArgs(pc);
        argc--;                 /* Don't forget about argv[0] */
 
        if (argc == 1)