diff options
author | Gerald Carter <jerry@samba.org> | 2006-01-24 03:54:33 +0000 |
---|---|---|
committer | Gerald Carter <jerry@samba.org> | 2006-01-24 03:54:33 +0000 |
commit | 4b9ea8812ef3f7612c41bf3aaab1371c981279cc (patch) | |
tree | 12df5cd6251aa0dbeb06f309ccf25b3096a08a14 | |
parent | 6de6cd120873b7879ec314299de1bcd5bf82c73d (diff) | |
download | samba-4b9ea8812ef3f7612c41bf3aaab1371c981279cc.tar.gz samba-4b9ea8812ef3f7612c41bf3aaab1371c981279cc.tar.xz samba-4b9ea8812ef3f7612c41bf3aaab1371c981279cc.zip |
r13105: pulling some code over for the 3.0.21b release....first take at it
106 files changed, 2174 insertions, 990 deletions
diff --git a/examples/VFS/configure.in b/examples/VFS/configure.in index fda4cf3a316..515d43f0096 100644 --- a/examples/VFS/configure.in +++ b/examples/VFS/configure.in @@ -84,11 +84,11 @@ fi ################################################# # check for krb5-config from recent MIT and Heimdal kerberos 5 - AC_PATH_PROG(KRB5_CONFIG, krb5-config) + AC_PATH_PROG(KRB5CONFIG, krb5-config) AC_MSG_CHECKING(for working krb5-config) - if test -x "$KRB5_CONFIG"; then - CFLAGS="$CFLAGS `$KRB5_CONFIG --cflags | sed s/@INCLUDE_des@//`" - CPPFLAGS="$CPPFLAGS `$KRB5_CONFIG --cflags | sed s/@INCLUDE_des@//`" + if test -x "$KRB5CONFIG"; then + CFLAGS="$CFLAGS `$KRB5CONFIG --cflags | sed s/@INCLUDE_des@//`" + CPPFLAGS="$CPPFLAGS `$KRB5CONFIG --cflags | sed s/@INCLUDE_des@//`" FOUND_KRB5=yes AC_MSG_RESULT(yes) else diff --git a/examples/auth/crackcheck/crackcheck.c b/examples/auth/crackcheck/crackcheck.c index 338433779b0..ac29b22592e 100644 --- a/examples/auth/crackcheck/crackcheck.c +++ b/examples/auth/crackcheck/crackcheck.c @@ -13,36 +13,104 @@ void usage(char *command) { comm = c + 1; } - fprintf(stderr, "Usage: %s -d dictionary\n\n", comm); - fprintf(stderr, " -d dictionary file for cracklib\n\n"); - fprintf(stderr, " The password is expected to be given via stdin.\n\n"); + fprintf(stderr, "Usage: %s [-c] [-s] [-d <dictionary>]\n\n", comm); + fprintf(stderr, " -c enables NT like complexity checks\n"); + fprintf(stderr, " -d <dictionary file> for cracklib\n"); + fprintf(stderr, " -s simple check use NT like checks ONLY\n\n"); + fprintf(stderr, "The password is read via stdin.\n\n"); exit(-1); } +int complexity(char* passwd) +{ + /* TG 26.10.2005 + * check password for complexity like MS Windows NT + */ + + int c_upper = 0; + int c_lower = 0; + int c_digit = 0; + int c_punct = 0; + int c_tot = 0; + int i, len; + + if (!passwd) goto fail; + len = strlen(passwd); + + for (i = 0; i < len; i++) { + + if (c_tot >= 3) break; + + if (isupper(passwd[i])) { + if (!c_upper) { + c_upper = 1; + c_tot += 1; + } + continue; + } + if (islower(passwd[i])) { + if (!c_lower) { + c_lower = 1; + c_tot += 1; + } + continue; + } + if (isdigit(passwd[i])) { + if (!c_digit) { + c_digit = 1; + c_tot += 1; + } + continue; + } + if (ispunct(passwd[i])) { + if (!c_punct) { + c_punct = 1; + c_tot += 1; + } + continue; + } + } + + if ((c_tot) < 3) goto fail; + return 0; + +fail: + fprintf(stderr, "ERR Complexity check failed\n\n"); + return -4; +} + int main(int argc, char **argv) { extern char *optarg; - int c; + int c, ret, complex_check = 0, simplex_check = 0; char f[256]; char *dictionary = NULL; char *password; char *reply; - while ( (c = getopt(argc, argv, "d:")) != EOF){ + while ( (c = getopt(argc, argv, "d:cs")) != EOF){ switch(c) { case 'd': dictionary = strdup(optarg); break; + case 'c': + complex_check = 1; + break; + case 's': + complex_check = 1; + simplex_check = 1; + break; default: usage(argv[0]); } } - if (dictionary == NULL) { - fprintf(stderr, "ERR - Wrong Command Line\n\n"); + if (!simplex_check && dictionary == NULL) { + fprintf(stderr, "ERR - Missing cracklib dictionary\n\n"); usage(argv[0]); } + fflush(stdin); password = fgets(f, sizeof(f), stdin); if (password == NULL) { @@ -50,6 +118,17 @@ int main(int argc, char **argv) { exit(-2); } + if (complex_check) { + ret = complexity(password); + if (ret) { + exit(ret); + } + } + + if (simplex_check) { + exit(0); + } + reply = FascistCheck(password, dictionary); if (reply != NULL) { fprintf(stderr, "ERR - %s\n\n", reply); @@ -57,6 +136,5 @@ int main(int argc, char **argv) { } exit(0); - } diff --git a/examples/libsmbclient/Makefile b/examples/libsmbclient/Makefile index c324a578d14..a88f4a240cd 100644 --- a/examples/libsmbclient/Makefile +++ b/examples/libsmbclient/Makefile @@ -17,6 +17,7 @@ TESTS= testsmbc \ testbrowse \ testbrowse2 \ teststat \ + teststat2 \ testchmod \ testutime \ testread @@ -47,6 +48,10 @@ teststat: teststat.o @echo Linking teststat @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ /usr/local/samba/lib/libsmbclient.so -lpopt $< +teststat2: teststat2.o + @echo Linking teststat2 + @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ /usr/local/samba/lib/libsmbclient.so -lpopt $< + testchmod: testchmod.o @echo Linking testchmod @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ /usr/local/samba/lib/libsmbclient.so -lpopt $< diff --git a/examples/libsmbclient/smbwrapper/Makefile b/examples/libsmbclient/smbwrapper/Makefile index 8e7070cb597..c94ef8fa6af 100644 --- a/examples/libsmbclient/smbwrapper/Makefile +++ b/examples/libsmbclient/smbwrapper/Makefile @@ -10,8 +10,11 @@ CFLAGS= -fpic -g -O0 $(DEFS) $(SMBINCLUDE) BIN = . -SMBWRAPPER_OBJS = smbw.o smbw_dir.o smbw_stat.o wrapper.o select.o -SMBSH_OBJS = smbsh.o +STRFUNC = bsd-strlcat.o bsd-strlcpy.o + + +SMBWRAPPER_OBJS = smbw.o smbw_dir.o smbw_stat.o wrapper.o select.o $(STRFUNC) +SMBSH_OBJS = smbsh.o $(STRFUNC) all: $(BIN)/smbwrapper.so $(BIN)/smbsh diff --git a/examples/libsmbclient/smbwrapper/smbsh.c b/examples/libsmbclient/smbwrapper/smbsh.c index 7b33de766fd..23b1ac26c79 100644 --- a/examples/libsmbclient/smbwrapper/smbsh.c +++ b/examples/libsmbclient/smbwrapper/smbsh.c @@ -28,6 +28,7 @@ #include <limits.h> #include <string.h> #include <libsmbclient.h> +#include "bsd-strlfunc.h" #ifndef FALSE # define FALSE (0) @@ -67,13 +68,13 @@ int main(int argc, char *argv[]) switch (opt) { case 'p': /* prepend library before smbwrapper.so */ if (*pre != '\0') - strncat(pre, " ", PATH_MAX - strlen(pre)); - strncat(pre, optarg, PATH_MAX - strlen(pre)); + smbw_strlcat(pre, " ", sizeof(pre)); + smbw_strlcat(pre, optarg, sizeof(pre)); break; case 'a': /* append library after smbwrapper.so */ - strncat(post, " ", PATH_MAX - strlen(post)); - strncat(post, optarg, PATH_MAX - strlen(post)); + smbw_strlcat(post, " ", sizeof(post)); + smbw_strlcat(post, optarg, sizeof(post)); break; case 'd': @@ -121,20 +122,22 @@ int main(int argc, char *argv[]) } } - strncpy(line, pre, PATH_MAX - strlen(line)); - strncat(line, " ", PATH_MAX - strlen(line)); - strncat(line, libd, PATH_MAX - strlen(line)); - strncat(line, "/smbwrapper.so", PATH_MAX - strlen(line)); - strncat(line, post, PATH_MAX - strlen(line)); + smbw_strlcpy(line, pre, PATH_MAX - strlen(line)); + smbw_strlcat(line, " ", sizeof(line)); + smbw_strlcat(line, libd, sizeof(line)); + smbw_strlcat(line, "/smbwrapper.so", sizeof(line)); + smbw_strlcat(line, post, sizeof(line)); setenv("LD_PRELOAD", line, TRUE); setenv("LD_BIND_NOW", "true", TRUE); snprintf(line,sizeof(line)-1,"%s/smbwrapper.32.so", libd); if (stat(line, &statbuf) == 0 && S_ISREG(statbuf.st_mode)) { - snprintf(line,sizeof(line)-1,"%s/smbwrapper.32.so:DEFAULT", libd); + snprintf(line, sizeof(line)-1, + "%s/smbwrapper.32.so:DEFAULT", libd); setenv("_RLD_LIST", line, TRUE); - snprintf(line,sizeof(line)-1,"%s/smbwrapper.so:DEFAULT", libd); + snprintf(line, sizeof(line)-1, + "%s/smbwrapper.so:DEFAULT", libd); setenv("_RLDN32_LIST", line, TRUE); } else { snprintf(line,sizeof(line)-1,"%s/smbwrapper.so:DEFAULT", libd); diff --git a/examples/libsmbclient/smbwrapper/smbw.c b/examples/libsmbclient/smbwrapper/smbw.c index d2f1c18695d..a44f2f4046a 100644 --- a/examples/libsmbclient/smbwrapper/smbw.c +++ b/examples/libsmbclient/smbwrapper/smbw.c @@ -26,6 +26,13 @@ #include <stdarg.h> #include <assert.h> #include "smbw.h" +#include "bsd-strlfunc.h" + +typedef enum StartupType +{ + StartupType_Fake, + StartupType_Real +} StartupType; int smbw_fd_map[__FD_SETSIZE]; int smbw_ref_count[__FD_SETSIZE]; @@ -44,6 +51,9 @@ static SMBCCTX *smbw_ctx; extern int smbw_debug; +/***************************************************** +smbw_ref -- manipulate reference counts +******************************************************/ int smbw_ref(int client_fd, Ref_Count_Type type, ...) { va_list ap; @@ -100,9 +110,9 @@ static void get_envvar_auth_data(const char *srv, p = getenv("PASSWORD"); if (p == NULL) p = ""; - strncpy(wg, w, wglen); - strncpy(un, u, unlen); - strncpy(pw, p, pwlen); + smbw_strlcpy(wg, w, wglen); + smbw_strlcpy(un, u, unlen); + smbw_strlcpy(pw, p, pwlen); } static smbc_get_auth_data_fn get_auth_data_fn = get_envvar_auth_data; @@ -130,7 +140,7 @@ static void do_shutdown(void) /***************************************************** initialise structures *******************************************************/ -static void do_init(int is_real_startup) +static void do_init(StartupType startupType) { int i; char *p; @@ -147,7 +157,7 @@ static void do_init(int is_real_startup) /* See if we've been told to start in a particular directory */ if ((p=getenv("SMBW_DIR")) != NULL) { - strncpy(smbw_cwd, p, PATH_MAX); + smbw_strlcpy(smbw_cwd, p, PATH_MAX); /* we don't want the old directory to be busy */ (* smbw_libc.chdir)("/"); @@ -161,6 +171,7 @@ static void do_init(int is_real_startup) } if ((smbw_ctx = smbc_new_context()) == NULL) { + fprintf(stderr, "Could not create a context.\n"); exit(1); } @@ -169,16 +180,16 @@ static void do_init(int is_real_startup) smbw_ctx->options.browse_max_lmb_count = 0; smbw_ctx->options.urlencode_readdir_entries = 1; smbw_ctx->options.one_share_per_server = 1; -// smbw_cache_functions(smbw_ctx); if (smbc_init_context(smbw_ctx) == NULL) { + fprintf(stderr, "Could not initialize context.\n"); exit(1); } smbc_set_context(smbw_ctx); /* if not real startup, exit handler has already been established */ - if (is_real_startup) { + if (startupType == StartupType_Real) { atexit(do_shutdown); } } @@ -188,7 +199,7 @@ initialise structures, real start up vs a fork() *******************************************************/ void smbw_init(void) { - do_init(1); + do_init(StartupType_Real); } @@ -407,6 +418,10 @@ ssize_t smbw_pread(int smbw_fd, void *buf, size_t count, SMBW_OFF_T ofs) int saved_errno; SMBW_OFF_T old_ofs; + if (count == 0) { + return 0; + } + client_fd = smbw_fd_map[smbw_fd]; if ((old_ofs = smbc_lseek(client_fd, 0, SEEK_CUR)) < 0 || @@ -460,6 +475,10 @@ ssize_t smbw_pwrite(int smbw_fd, void *buf, size_t count, SMBW_OFF_T ofs) ssize_t ret; SMBW_OFF_T old_ofs; + if (count == 0) { + return 0; + } + client_fd = smbw_fd_map[smbw_fd]; if ((old_ofs = smbc_lseek(client_fd, 0, SEEK_CUR)) < 0 || @@ -731,7 +750,7 @@ int smbw_fork(void) } /* Re-initialize this library for the child */ - do_init(0); + do_init(StartupType_Fake); /* and continue in the child */ return 0; diff --git a/examples/libsmbclient/smbwrapper/smbw.h b/examples/libsmbclient/smbwrapper/smbw.h index 717b5c2f1c7..161d57ebbb1 100644 --- a/examples/libsmbclient/smbwrapper/smbw.h +++ b/examples/libsmbclient/smbwrapper/smbw.h @@ -34,6 +34,10 @@ #include "libsmbclient.h" #include "wrapper.h" +#ifndef __restrict +# define __restrict +#endif + #undef DEBUG #define DEBUG(level, s) do { if (level <= debug_level) printf s; } while (0) diff --git a/examples/libsmbclient/smbwrapper/smbw_dir.c b/examples/libsmbclient/smbwrapper/smbw_dir.c index f3ec03e5a85..986b7f82204 100644 --- a/examples/libsmbclient/smbwrapper/smbw_dir.c +++ b/examples/libsmbclient/smbwrapper/smbw_dir.c @@ -21,6 +21,7 @@ */ #include "smbw.h" +#include "bsd-strlfunc.h" /***************************************************** determine if a directory handle is a smb one @@ -70,12 +71,12 @@ int smbw_getdents(unsigned int fd_smbw, dirent_external->d_reclen = sizeof(struct SMBW_dirent); dirent_external->d_type = dirent_internal->smbc_type; - strncpy(dirent_external->d_name, - dirent_internal->name, - sizeof(dirent_external->d_name) - 1); - strncpy(dirent_external->d_comment, - dirent_internal->comment, - sizeof(dirent_external->d_comment) - 1); + smbw_strlcpy(dirent_external->d_name, + dirent_internal->name, + sizeof(dirent_external->d_name) - 1); + smbw_strlcpy(dirent_external->d_comment, + dirent_internal->comment, + sizeof(dirent_external->d_comment) - 1); } return(count - remaining); @@ -128,7 +129,7 @@ int smbw_chdir(const char *name) } } - strncpy(smbw_cwd, path, PATH_MAX); + smbw_strlcpy(smbw_cwd, path, PATH_MAX); /* we don't want the old directory to be busy */ (* smbw_libc.chdir)("/"); @@ -196,7 +197,7 @@ char *smbw_getcwd(char *buf, size_t size) } } - strncpy(buf, smbw_cwd, size); + smbw_strlcpy(buf, smbw_cwd, size); buf[size-1] = '\0'; return buf; } @@ -278,12 +279,12 @@ struct SMBW_dirent *smbw_readdir(DIR *dirp) dirent_external.d_off = smbc_telldir(fd_client); dirent_external.d_reclen = sizeof(struct SMBW_dirent); dirent_external.d_type = dirent_internal->smbc_type; - strncpy(dirent_external.d_name, - dirent_internal->name, - sizeof(dirent_external.d_name) - 1); - strncpy(dirent_external.d_comment, - dirent_internal->comment, - sizeof(dirent_external.d_comment) - 1); + smbw_strlcpy(dirent_external.d_name, + dirent_internal->name, + sizeof(dirent_external.d_name) - 1); + smbw_strlcpy(dirent_external.d_comment, + dirent_internal->comment, + sizeof(dirent_external.d_comment) - 1); return &dirent_external; } diff --git a/examples/libsmbclient/smbwrapper/wrapper.c b/examples/libsmbclient/smbwrapper/wrapper.c index 71d6f203ada..e6f764c16d8 100644 --- a/examples/libsmbclient/smbwrapper/wrapper.c +++ b/examples/libsmbclient/smbwrapper/wrapper.c @@ -62,9 +62,17 @@ #include <dirent.h> #include <signal.h> #include <stdarg.h> +#ifdef __USE_GNU +# define SMBW_USE_GNU +#endif +#define __USE_GNU /* need this to have RTLD_NEXT defined */ #include <dlfcn.h> +#ifndef SMBW_USE_GNU +# undef __USE_GNU +#endif #include <errno.h> #include "libsmbclient.h" +#include "bsd-strlfunc.h" #include "wrapper.h" /* @@ -106,12 +114,12 @@ static int debugFd = 2; if (! initialized) initialize(); \ (* smbw_libc.write)(debugFd, "["buf"]", sizeof(buf)+1); \ errno = saved_errno; \ - } while (0); + } while (0) #else # define check_init(buf) \ do { \ if (! initialized) smbw_initialize(); \ - } while (0); + } while (0) #endif static void initialize(void); @@ -130,36 +138,30 @@ void smbw_initialize(void) static void initialize(void) { - void *lib = NULL; int saved_errno; #if SMBW_DEBUG & 0x1 char *error; #endif - + saved_errno = errno; if (initialized) { - errno = saved_errno; return; } initialized = 1; - if ((lib = dlopen("/lib/libc.so.6", RTLD_NOW | RTLD_GLOBAL)) == NULL) { - exit(1); - } - #if SMBW_DEBUG & 0x1 -# define GETSYM(symname, symstring) \ - if ((smbw_libc.symname = dlsym(lib, symstring)) == NULL) { \ - if (smbw_libc.write != NULL && \ - (error = dlerror()) != NULL) { \ - (* smbw_libc.write)(1, error, strlen(error)); \ - (* smbw_libc.write)(1, "\n", 1); \ - } \ +# define GETSYM(symname, symstring) \ + if ((smbw_libc.symname = dlsym(RTLD_NEXT, symstring)) == NULL) { \ + if (smbw_libc.write != NULL && \ + (error = dlerror()) != NULL) { \ + (* smbw_libc.write)(1, error, strlen(error)); \ + (* smbw_libc.write)(1, "\n", 1); \ + } \ } #else # define GETSYM(symname, symstring) \ - smbw_libc.symname = dlsym(lib, symstring); + smbw_libc.symname = dlsym(RTLD_NEXT, symstring); #endif /* @@ -171,117 +173,109 @@ static void initialize(void) * C library doesn't support them, then the wrapper function will * never be called, and the null pointer will never be dereferenced. */ - do { - GETSYM(write, "write"); /* first, to allow debugging */ - GETSYM(open, "open"); - GETSYM(_open, "_open"); - GETSYM(__open, "__open"); - GETSYM(open64, "open64"); - GETSYM(_open64, "_open64"); - GETSYM(__open64, "__open64"); - GETSYM(pread, "pread"); - GETSYM(pread64, "pread64"); - GETSYM(pwrite, "pwrite"); - GETSYM(pwrite64, "pwrite64"); - GETSYM(close, "close"); - GETSYM(__close, "__close"); - GETSYM(_close, "_close"); - GETSYM(fcntl, "fcntl"); - GETSYM(__fcntl, "__fcntl"); - GETSYM(_fcntl, "_fcntl"); - GETSYM(getdents, "getdents"); - GETSYM(__getdents, "__getdents"); - GETSYM(_getdents, "_getdents"); - GETSYM(getdents64, "getdents64"); - GETSYM(lseek, "lseek"); - GETSYM(__lseek, "__lseek"); - GETSYM(_lseek, "_lseek"); - GETSYM(lseek64, "lseek64"); - GETSYM(__lseek64, "__lseek64"); - GETSYM(_lseek64, "_lseek64"); - GETSYM(read, "read"); - GETSYM(__read, "__read"); - GETSYM(_read, "_read"); - GETSYM(__write, "__write"); - GETSYM(_write, "_write"); - GETSYM(access, "access"); - GETSYM(chmod, "chmod"); - GETSYM(fchmod, "fchmod"); - GETSYM(chown, "chown"); - GETSYM(fchown, "fchown"); - GETSYM(__xstat, "__xstat"); - GETSYM(getcwd, "getcwd"); - GETSYM(mkdir, "mkdir"); - GETSYM(__fxstat, "__fxstat"); - GETSYM(__lxstat, "__lxstat"); - GETSYM(stat, "stat"); - GETSYM(lstat, "lstat"); - GETSYM(fstat, "fstat"); - GETSYM(unlink, "unlink"); - GETSYM(utime, "utime"); - GETSYM(utimes, "utimes"); - GETSYM(readlink, "readlink"); - GETSYM(rename, "rename"); - GETSYM(rmdir, "rmdir"); - GETSYM(symlink, "symlink"); - GETSYM(dup, "dup"); - GETSYM(dup2, "dup2"); - GETSYM(opendir, "opendir"); - GETSYM(readdir, "readdir"); - GETSYM(closedir, "closedir"); - GETSYM(telldir, "telldir"); - GETSYM(seekdir, "seekdir"); - GETSYM(creat, "creat"); - GETSYM(creat64, "creat64"); - GETSYM(__xstat64, "__xstat64"); - GETSYM(stat64, "stat64"); - GETSYM(__fxstat64, "__fxstat64"); - GETSYM(fstat64, "fstat64"); - GETSYM(__lxstat64, "__lxstat64"); - GETSYM(lstat64, "lstat64"); - GETSYM(_llseek, "_llseek"); - GETSYM(readdir64, "readdir64"); - GETSYM(readdir_r, "readdir_r"); - GETSYM(readdir64_r, "readdir64_r"); - GETSYM(setxattr, "setxattr"); - GETSYM(lsetxattr, "lsetxattr"); - GETSYM(fsetxattr, "fsetxattr"); - GETSYM(getxattr, "getxattr"); - GETSYM(lgetxattr, "lgetxattr"); - GETSYM(fgetxattr, "fgetxattr"); - GETSYM(removexattr, "removexattr"); - GETSYM(lremovexattr, "lremovexattr"); - GETSYM(fremovexattr, "fremovexattr"); - GETSYM(listxattr, "listxattr"); - GETSYM(llistxattr, "llistxattr"); - GETSYM(flistxattr, "flistxattr"); - GETSYM(chdir, "chdir"); - GETSYM(fchdir, "fchdir"); - GETSYM(fork, "fork"); - GETSYM(select, "select"); - GETSYM(_select, "_select"); - GETSYM(__select, "__select"); - } while (0); - - dlclose(lib); - - if ((lib = dlopen("/lib/libc.so.6", RTLD_NOW | RTLD_GLOBAL)) == NULL) { - exit(1); - } + GETSYM(write, "write"); /* first, to allow debugging */ + GETSYM(open, "open"); + GETSYM(_open, "_open"); + GETSYM(__open, "__open"); + GETSYM(open64, "open64"); + GETSYM(_open64, "_open64"); + GETSYM(__open64, "__open64"); + GETSYM(pread, "pread"); + GETSYM(pread64, "pread64"); + GETSYM(pwrite, "pwrite"); + GETSYM(pwrite64, "pwrite64"); + GETSYM(close, "close"); + GETSYM(__close, "__close"); + GETSYM(_close, "_close"); + GETSYM(fcntl, "fcntl"); + GETSYM(__fcntl, "__fcntl"); + GETSYM(_fcntl, "_fcntl"); + GETSYM(getdents, "getdents"); + GETSYM(__getdents, "__getdents"); + GETSYM(_getdents, "_getdents"); + GETSYM(getdents64, "getdents64"); + GETSYM(lseek, "lseek"); + GETSYM(__lseek, "__lseek"); + GETSYM(_lseek, "_lseek"); + GETSYM(lseek64, "lseek64"); + GETSYM(__lseek64, "__lseek64"); + GETSYM(_lseek64, "_lseek64"); + GETSYM(read, "read"); + GETSYM(__read, "__read"); + GETSYM(_read, "_read"); + GETSYM(__write, "__write"); + GETSYM(_write, "_write"); + GETSYM(access, "access"); + GETSYM(chmod, "chmod"); + GETSYM(fchmod, "fchmod"); + GETSYM(chown, "chown"); + GETSYM(fchown, "fchown"); + GETSYM(__xstat, "__xstat"); + GETSYM(getcwd, "getcwd"); + GETSYM(mkdir, "mkdir"); + GETSYM(__fxstat, "__fxstat"); + GETSYM(__lxstat, "__lxstat"); + GETSYM(stat, "stat"); + GETSYM(lstat, "lstat"); + GETSYM(fstat, "fstat"); + GETSYM(unlink, "unlink"); + GETSYM(utime, "utime"); + GETSYM(utimes, "utimes"); + GETSYM(readlink, "readlink"); + GETSYM(rename, "rename"); + GETSYM(rmdir, "rmdir"); + GETSYM(symlink, "symlink"); + GETSYM(dup, "dup"); + GETSYM(dup2, "dup2"); + GETSYM(opendir, "opendir"); + GETSYM(readdir, "readdir"); + GETSYM(closedir, "closedir"); + GETSYM(telldir, "telldir"); + GETSYM(seekdir, "seekdir"); + GETSYM(creat, "creat"); + GETSYM(creat64, "creat64"); + GETSYM(__xstat64, "__xstat64"); + GETSYM(stat64, "stat64"); + GETSYM(__fxstat64, "__fxstat64"); + GETSYM(fstat64, "fstat64"); + GETSYM(__lxstat64, "__lxstat64"); + GETSYM(lstat64, "lstat64"); + GETSYM(_llseek, "_llseek"); + GETSYM(readdir64, "readdir64"); + GETSYM(readdir_r, "readdir_r"); + GETSYM(readdir64_r, "readdir64_r"); + GETSYM(setxattr, "setxattr"); + GETSYM(lsetxattr, "lsetxattr"); + GETSYM(fsetxattr, "fsetxattr"); + GETSYM(getxattr, "getxattr"); + GETSYM(lgetxattr, "lgetxattr"); + GETSYM(fgetxattr, "fgetxattr"); + GETSYM(removexattr, "removexattr"); + GETSYM(lremovexattr, "lremovexattr"); + GETSYM(fremovexattr, "fremovexattr"); + GETSYM(listxattr, "listxattr"); + GETSYM(llistxattr, "llistxattr"); + GETSYM(flistxattr, "flistxattr"); + GETSYM(chdir, "chdir"); + GETSYM(fchdir, "fchdir"); + GETSYM(fork, "fork"); + GETSYM(select, "select"); + GETSYM(_select, "_select"); + GETSYM(__select, "__select"); #if SMBW_DEBUG & 4 { - if ((debugFd = - open(SMBW_DEBUG_FILE, O_WRONLY | O_CREAT | O_APPEND)) < 0) - { + if ((debugFd = + open(SMBW_DEBUG_FILE, O_WRONLY | O_CREAT | O_APPEND)) < 0) + { # define SMBW_MESSAGE "Could not create " SMBW_DEBUG_FILE "\n" - (* smbw_libc.write)(1, SMBW_MESSAGE, sizeof(SMBW_MESSAGE)); + (* smbw_libc.write)(1, SMBW_MESSAGE, sizeof(SMBW_MESSAGE)); # undef SMBW_MESSAGE - exit(1); - } + exit(1); + } } #endif - + errno = saved_errno; } @@ -328,11 +322,11 @@ static void stat64_convert(struct SMBW_stat *src, struct stat64 *dest) static void dirent_convert(struct SMBW_dirent *src, struct dirent *dest) { char *p; - + memset(dest, '\0', sizeof(*dest)); dest->d_ino = src->d_ino; dest->d_off = src->d_off; - + switch(src->d_type) { case SMBC_WORKGROUP: @@ -362,21 +356,23 @@ static void dirent_convert(struct SMBW_dirent *src, struct dirent *dest) dest->d_type = DT_LNK; break; } - + dest->d_reclen = src->d_reclen; - strncpy(dest->d_name, src->d_name, sizeof(dest->d_name)); + smbw_strlcpy(dest->d_name, src->d_name, sizeof(dest->d_name)); p = dest->d_name + strlen(dest->d_name) + 1; - strncpy(p, src->d_comment, sizeof(dest->d_name) - (p - dest->d_name)); + smbw_strlcpy(p, + src->d_comment, + sizeof(dest->d_name) - (p - dest->d_name)); } static void dirent64_convert(struct SMBW_dirent *src, struct dirent64 *dest) { char *p; - + memset(dest, '\0', sizeof(*dest)); dest->d_ino = src->d_ino; dest->d_off = src->d_off; - + switch(src->d_type) { case SMBC_WORKGROUP: @@ -406,11 +402,13 @@ static void dirent64_convert(struct SMBW_dirent *src, struct dirent64 *dest) dest->d_type = DT_LNK; break; } - + dest->d_reclen = src->d_reclen; - strncpy(dest->d_name, src->d_name, sizeof(dest->d_name)); + smbw_strlcpy(dest->d_name, src->d_name, sizeof(dest->d_name)); p = dest->d_name + strlen(dest->d_name) + 1; - strncpy(p, src->d_comment, sizeof(dest->d_name) - (p - dest->d_name)); + smbw_strlcpy(p, + src->d_comment, + sizeof(dest->d_name) - (p - dest->d_name)); } static int openx(char *name, int flags, mode_t mode, int (* f)(char *, int, mode_t)) @@ -418,7 +416,7 @@ static int openx(char *name, int flags, mode_t mode, int (* f)(char *, int, mode if (smbw_path(name)) { return smbw_open(name, flags, mode); } - + return (* f)(name, flags, mode); } @@ -427,7 +425,7 @@ static int closex(int fd, int (* f)(int fd)) if (smbw_fd(fd)) { return smbw_close(fd); } - + return (* f)(fd); } @@ -436,7 +434,7 @@ static int fcntlx(int fd, int cmd, long arg, int (* f)(int, int, long)) if (smbw_fd(fd)) { return smbw_fcntl(fd, cmd, arg); } - + return (* f)(fd, cmd, arg); } @@ -448,14 +446,14 @@ static int getdentsx(int fd, struct dirent *external, unsigned int count, int (* struct SMBW_dirent *internal; int ret; int n; - + /* * LIMITATION: If they pass a count which is not a multiple of * the size of struct dirent, they will not get a partial * structure; we ignore the excess count. */ n = (count / sizeof(struct dirent)); - + internal_count = sizeof(struct SMBW_dirent) * n; internal = malloc(internal_count); if (internal == NULL) { @@ -465,15 +463,15 @@ static int getdentsx(int fd, struct dirent *external, unsigned int count, int (* ret = smbw_getdents(fd, internal, internal_count); if (ret <= 0) return ret; - + ret = sizeof(struct dirent) * n; for (i = 0; i < n; i++) dirent_convert(&internal[i], &external[i]); - + return ret; } - + return (* f)(fd, external, count); } @@ -483,7 +481,7 @@ static off_t lseekx(int fd, off_t (* f)(int, off_t, int)) { off_t ret; - + /* * We have left the definitions of the smbw_ functions undefined, * because types such as off_t can differ in meaning betweent his @@ -491,11 +489,11 @@ static off_t lseekx(int fd, * integer value, however, MUST have their return value defined. */ off64_t smbw_lseek(); - + if (smbw_fd(fd)) { return (off_t) smbw_lseek(fd, offset, whence); } - + ret = (* f)(fd, offset, whence); if (smbw_debug) { @@ -513,7 +511,7 @@ static off64_t lseek64x(int fd, off64_t (* f)(int, off64_t, int)) { off64_t ret; - + /* * We have left the definitions of the smbw_ functions undefined, * because types such as off_t can differ in meaning betweent his @@ -521,7 +519,7 @@ static off64_t lseek64x(int fd, * integer value, however, MUST have their return value defined. */ off64_t smbw_lseek(); - + if (smbw_fd(fd)) ret = smbw_lseek(fd, offset, whence); else @@ -541,7 +539,7 @@ static ssize_t readx(int fd, void *buf, size_t count, ssize_t (* f)(int, void *, if (smbw_fd(fd)) { return smbw_read(fd, buf, count); } - + return (* f)(fd, buf, count); } @@ -550,7 +548,7 @@ static ssize_t writex(int fd, void *buf, size_t count, ssize_t (* f)(int, void * if (smbw_fd(fd)) { return smbw_write(fd, buf, count); } - + return (* f)(fd, buf, count); } @@ -563,27 +561,27 @@ int open(__const char *name, int flags, ...) { va_list ap; mode_t mode; - + va_start(ap, flags); mode = va_arg(ap, mode_t); va_end(ap); - + check_init("open"); - + return openx((char *) name, flags, mode, smbw_libc.open); } int _open(char *name, int flags, mode_t mode) { check_init("open"); - + return openx(name, flags, mode, smbw_libc._open); } int __open(char *name, int flags, mode_t mode) { check_init("open"); - + return openx(name, flags, mode, smbw_libc.__open); } @@ -591,11 +589,11 @@ int open64 (__const char *name, int flags, ...) { va_list ap; mode_t mode; - + va_start(ap, flags); mode = va_arg(ap, mode_t); va_end(ap); - + check_init("open64"); return openx((char *) name, flags, mode, smbw_libc.open64); } @@ -615,44 +613,44 @@ int __open64(char *name, int flags, mode_t mode) ssize_t pread(int fd, void *buf, size_t size, off_t ofs) { check_init("pread"); - + if (smbw_fd(fd)) { return smbw_pread(fd, buf, size, ofs); } - + return (* smbw_libc.pread)(fd, buf, size, ofs); } ssize_t pread64(int fd, void *buf, size_t size, off64_t ofs) { check_init("pread64"); - + if (smbw_fd(fd)) { return smbw_pread(fd, buf, size, (off_t) ofs); } - + return (* smbw_libc.pread64)(fd, buf, size, ofs); } ssize_t pwrite(int fd, const void *buf, size_t size, off_t ofs) { check_init("pwrite"); - + if (smbw_fd(fd)) { return smbw_pwrite(fd, (void *) buf, size, ofs); } - + return (* smbw_libc.pwrite)(fd, (void *) buf, size, ofs); } ssize_t pwrite64(int fd, const void *buf, size_t size, off64_t ofs) { check_init("pwrite64"); - + if (smbw_fd(fd)) { return smbw_pwrite(fd, (void *) buf, size, (off_t) ofs); } - + return (* smbw_libc.pwrite64)(fd, (void *) buf, size, ofs); } @@ -714,11 +712,11 @@ int fcntl (int fd, int cmd, ...) { va_list ap; long arg; - + va_start(ap, cmd); arg = va_arg(ap, long); va_end(ap); - + check_init("fcntl"); return fcntlx(fd, cmd, arg, smbw_libc.fcntl); } @@ -727,11 +725,11 @@ int __fcntl(int fd, int cmd, ...) { va_list ap; long arg; - + va_start(ap, cmd); arg = va_arg(ap, long); va_end(ap); - + check_init("__fcntl"); return fcntlx(fd, cmd, arg, smbw_libc.__fcntl); } @@ -740,11 +738,11 @@ int _fcntl(int fd, int cmd, ...) { va_list ap; long arg; - + va_start(ap, cmd); arg = va_arg(ap, long); va_end(ap); - + check_init("_fcntl"); return fcntlx(fd, cmd, arg, smbw_libc._fcntl); } @@ -775,14 +773,14 @@ int getdents64(int fd, struct dirent64 *external, unsigned int count) struct SMBW_dirent *internal; int ret; int n; - + /* * LIMITATION: If they pass a count which is not a multiple of * the size of struct dirent, they will not get a partial * structure; we ignore the excess count. */ n = (count / sizeof(struct dirent64)); - + internal = malloc(sizeof(struct SMBW_dirent) * n); if (internal == NULL) { errno = ENOMEM; @@ -791,15 +789,15 @@ int getdents64(int fd, struct dirent64 *external, unsigned int count) ret = smbw_getdents(fd, internal, count); if (ret <= 0) return ret; - + ret = sizeof(struct dirent) * count; for (i = 0; count; i++, count--) dirent64_convert(&internal[i], &external[i]); - + return ret; } - + return (* smbw_libc.getdents64)(fd, external, count); } @@ -923,57 +921,57 @@ ssize_t _write(int fd, const void *buf, size_t count) int access(const char *name, int mode) { check_init("access"); - + if (smbw_path((char *) name)) { return smbw_access((char *) name, mode); } - + return (* smbw_libc.access)((char *) name, mode); } int chmod(const char *name, mode_t mode) { check_init("chmod"); - + if (smbw_path((char *) name)) { return smbw_chmod((char *) name, mode); } - + return (* smbw_libc.chmod)((char *) name, mode); } int fchmod(int fd, mode_t mode) { check_init("fchmod"); - + if (smbw_fd(fd)) { /* Not yet implemented in libsmbclient */ return ENOTSUP; } - + return (* smbw_libc.fchmod)(fd, mode); } int chown(const char *name, uid_t owner, gid_t group) { check_init("chown"); - + if (smbw_path((char *) name)) { return smbw_chown((char *) name, owner, group); } - + return (* smbw_libc.chown)((char *) name, owner, group); } int fchown(int fd, uid_t owner, gid_t group) { check_init("fchown"); - + if (smbw_fd(fd)) { /* Not yet implemented in libsmbclient */ return ENOTSUP; } - + return (* smbw_libc.fchown)(fd, owner, group); } @@ -986,148 +984,148 @@ char *getcwd(char *buf, size_t size) int mkdir(const char *name, mode_t mode) { check_init("mkdir"); - + if (smbw_path((char *) name)) { return smbw_mkdir((char *) name, mode); } - + return (* smbw_libc.mkdir)((char *) name, mode); } int __fxstat(int vers, int fd, struct stat *st) { check_init("__fxstat"); - + if (smbw_fd(fd)) { struct SMBW_stat statbuf; int ret = smbw_fstat(fd, &statbuf); stat_convert(&statbuf, st); return ret; } - + return (* smbw_libc.__fxstat)(vers, fd, st); } int __xstat(int vers, const char *name, struct stat *st) { check_init("__xstat"); - + if (smbw_path((char *) name)) { struct SMBW_stat statbuf; int ret = smbw_stat((char *) name, &statbuf); stat_convert(&statbuf, st); return ret; } - + return (* smbw_libc.__xstat)(vers, (char *) name, st); } int __lxstat(int vers, const char *name, struct stat *st) { check_init("__lxstat"); - + if (smbw_path((char *) name)) { struct SMBW_stat statbuf; int ret = smbw_stat((char *) name, &statbuf); stat_convert(&statbuf, st); return ret; } - + return (* smbw_libc.__lxstat)(vers, (char *) name, st); } int stat(const char *name, struct stat *st) { check_init("stat"); - + if (smbw_path((char *) name)) { struct SMBW_stat statbuf; int ret = smbw_stat((char *) name, &statbuf); stat_convert(&statbuf, st); return ret; } - + return (* smbw_libc.stat)((char *) name, st); } int lstat(const char *name, struct stat *st) { check_init("lstat"); - + if (smbw_path((char *) name)) { struct SMBW_stat statbuf; int ret = smbw_stat((char *) name, &statbuf); stat_convert(&statbuf, st); return ret; } - + return (* smbw_libc.lstat)((char *) name, st); } int fstat(int fd, struct stat *st) { check_init("fstat"); - + if (smbw_fd(fd)) { struct SMBW_stat statbuf; int ret = smbw_fstat(fd, &statbuf); stat_convert(&statbuf, st); return ret; } - + return (* smbw_libc.fstat)(fd, st); } int unlink(const char *name) { check_init("unlink"); - + if (smbw_path((char *) name)) { return smbw_unlink((char *) name); } - + return (* smbw_libc.unlink)((char *) name); } int utime(const char *name, const struct utimbuf *tvp) { check_init("utime"); - + if (smbw_path(name)) { return smbw_utime(name, (struct utimbuf *) tvp); } - + return (* smbw_libc.utime)((char *) name, (struct utimbuf *) tvp); } int utimes(const char *name, const struct timeval *tvp) { check_init("utimes"); - + if (smbw_path(name)) { return smbw_utimes(name, (struct timeval *) tvp); } - + return (* smbw_libc.utimes)((char *) name, (struct timeval *) tvp); } int readlink(const char *path, char *buf, size_t bufsize) { check_init("readlink"); - + if (smbw_path((char *) path)) { return smbw_readlink(path, (char *) buf, bufsize); } - + return (* smbw_libc.readlink)((char *) path, buf, bufsize); } int rename(const char *oldname, const char *newname) { int p1, p2; - + check_init("rename"); - + p1 = smbw_path((char *) oldname); p2 = smbw_path((char *) newname); if (p1 ^ p2) { @@ -1138,27 +1136,27 @@ int rename(const char *oldname, const char *newname) if (p1 && p2) { return smbw_rename((char *) oldname, (char *) newname); } - + return (* smbw_libc.rename)((char *) oldname, (char *) newname); } int rmdir(const char *name) { check_init("rmdir"); - + if (smbw_path((char *) name)) { return smbw_rmdir((char *) name); } - + return (* smbw_libc.rmdir)((char *) name); } int symlink(const char *topath, const char *frompath) { int p1, p2; - + check_init("symlink"); - + p1 = smbw_path((char *) topath); p2 = smbw_path((char *) frompath); if (p1 || p2) { @@ -1166,25 +1164,25 @@ int symlink(const char *topath, const char *frompath) errno = EPERM; return -1; } - + return (* smbw_libc.symlink)((char *) topath, (char *) frompath); } int dup(int fd) { check_init("dup"); - + if (smbw_fd(fd)) { return smbw_dup(fd); } - + return (* smbw_libc.dup)(fd); } int dup2(int oldfd, int newfd) { check_init("dup2"); - + if (smbw_fd(newfd)) { (* smbw_libc.close)(newfd); } @@ -1192,7 +1190,7 @@ int dup2(int oldfd, int newfd) if (smbw_fd(oldfd)) { return smbw_dup2(oldfd, newfd); } - + return (* smbw_libc.dup2)(oldfd, newfd); } @@ -1200,18 +1198,18 @@ int dup2(int oldfd, int newfd) DIR *opendir(const char *name) { check_init("opendir"); - + if (smbw_path((char *) name)) { return (void *)smbw_opendir((char *) name); } - + return (* smbw_libc.opendir)((char *) name); } struct dirent *readdir(DIR *dir) { check_init("readdir"); - + if (smbw_dirp(dir)) { static struct dirent external; struct SMBW_dirent * internal = (void *)smbw_readdir(dir); @@ -1227,41 +1225,41 @@ struct dirent *readdir(DIR *dir) int closedir(DIR *dir) { check_init("closedir"); - + if (smbw_dirp(dir)) { return smbw_closedir(dir); } - + return (* smbw_libc.closedir)(dir); } long telldir(DIR *dir) { check_init("telldir"); - + if (smbw_dirp(dir)) { return (long) smbw_telldir(dir); } - + return (* smbw_libc.telldir)(dir); } void seekdir(DIR *dir, long offset) { check_init("seekdir"); - + if (smbw_dirp(dir)) { smbw_seekdir(dir, (long long) offset); return; } - + (* smbw_libc.seekdir)(dir, offset); } int creat(const char *path, mode_t mode) { extern int creat_bits; - + check_init("creat"); return openx((char *) path, creat_bits, mode, smbw_libc.open); } @@ -1269,7 +1267,7 @@ int creat(const char *path, mode_t mode) int creat64(const char *path, mode_t mode) { extern int creat_bits; - + check_init("creat64"); return openx((char *) path, creat_bits, mode, smbw_libc.open64); } @@ -1277,103 +1275,103 @@ int creat64(const char *path, mode_t mode) int __xstat64 (int ver, const char *name, struct stat64 *st64) { check_init("__xstat64"); - + if (smbw_path((char *) name)) { struct SMBW_stat statbuf; int ret = smbw_stat((char *) name, &statbuf); stat64_convert(&statbuf, st64); return ret; } - + return (* smbw_libc.__xstat64)(ver, (char *) name, st64); } int stat64(const char *name, struct stat64 *st64) { check_init("stat64"); - + if (smbw_path((char *) name)) { struct SMBW_stat statbuf; int ret = smbw_stat((char *) name, &statbuf); stat64_convert(&statbuf, st64); return ret; } - + return (* smbw_libc.stat64)((char *) name, st64); } int __fxstat64(int ver, int fd, struct stat64 *st64) { check_init("__fxstat64"); - + if (smbw_fd(fd)) { struct SMBW_stat statbuf; int ret = smbw_fstat(fd, &statbuf); stat64_convert(&statbuf, st64); return ret; } - + return (* smbw_libc.__fxstat64)(ver, fd, st64); } int fstat64(int fd, struct stat64 *st64) { check_init("fstat64"); - + if (smbw_fd(fd)) { struct SMBW_stat statbuf; int ret = smbw_fstat(fd, &statbuf); stat64_convert(&statbuf, st64); return ret; } - + return (* smbw_libc.fstat64)(fd, st64); } int __lxstat64(int ver, const char *name, struct stat64 *st64) { check_init("__lxstat64"); - + if (smbw_path((char *) name)) { struct SMBW_stat statbuf; int ret = smbw_stat(name, &statbuf); stat64_convert(&statbuf, st64); return ret; } - + return (* smbw_libc.__lxstat64)(ver, (char *) name, st64); } int lstat64(const char *name, struct stat64 *st64) { check_init("lstat64"); - + if (smbw_path((char *) name)) { struct SMBW_stat statbuf; int ret = smbw_stat((char *) name, &statbuf); stat64_convert(&statbuf, st64); return ret; } - + return (* smbw_libc.lstat64)((char *) name, st64); } int _llseek(unsigned int fd, unsigned long offset_high, unsigned long offset_low, loff_t *result, unsigned int whence) { check_init("_llseek"); - + if (smbw_fd(fd)) { *result = lseek(fd, offset_low, whence); return (*result < 0 ? -1 : 0); } - + return (* smbw_libc._llseek)(fd, offset_high, offset_low, result, whence); } struct dirent64 *readdir64(DIR *dir) { check_init("readdir64"); - + if (smbw_dirp(dir)) { static struct dirent64 external; struct SMBW_dirent * internal = (void *)smbw_readdir(dir); @@ -1383,14 +1381,14 @@ struct dirent64 *readdir64(DIR *dir) } return NULL; } - + return (* smbw_libc.readdir64)(dir); } int readdir_r(DIR *dir, struct dirent *external, struct dirent **result) { check_init("readdir_r"); - + if (smbw_dirp(dir)) { struct SMBW_dirent internal; int ret = smbw_readdir_r(dir, &internal, NULL); @@ -1400,14 +1398,14 @@ int readdir_r(DIR *dir, struct dirent *external, struct dirent **result) } return ret; } - + return (* smbw_libc.readdir_r)(dir, external, result); } int readdir64_r(DIR *dir, struct dirent64 *external, struct dirent64 **result) { check_init("readdir64_r"); - + if (smbw_dirp(dir)) { struct SMBW_dirent internal; int ret = smbw_readdir_r(dir, &internal, NULL); @@ -1417,7 +1415,7 @@ int readdir64_r(DIR *dir, struct dirent64 *external, struct dirent64 **result) } return ret; } - + return (* smbw_libc.readdir64_r)(dir, external, result); } @@ -1436,7 +1434,7 @@ int setxattr(const char *fname, if (smbw_path(fname)) { return smbw_setxattr(fname, name, value, size, flags); } - + return (* smbw_libc.setxattr)(fname, name, value, size, flags); } @@ -1449,7 +1447,7 @@ int lsetxattr(const char *fname, if (smbw_path(fname)) { return smbw_lsetxattr(fname, name, value, size, flags); } - + return (* smbw_libc.lsetxattr)(fname, name, value, size, flags); } @@ -1462,7 +1460,7 @@ int fsetxattr(int fd, if (smbw_fd(fd)) { return smbw_fsetxattr(fd, name, value, size, flags); } - + return (* smbw_libc.fsetxattr)(fd, name, value, size, flags); } @@ -1474,7 +1472,7 @@ int getxattr(const char *fname, if (smbw_path(fname)) { return smbw_getxattr(fname, name, value, size); } - + return (* smbw_libc.getxattr)(fname, name, value, size); } @@ -1486,7 +1484,7 @@ int lgetxattr(const char *fname, if (smbw_path(fname)) { return smbw_lgetxattr(fname, name, value, size); } - + return (* smbw_libc.lgetxattr)(fname, name, value, size); } @@ -1498,7 +1496,7 @@ int fgetxattr(int fd, if (smbw_fd(fd)) { return smbw_fgetxattr(fd, name, value, size); } - + return (* smbw_libc.fgetxattr)(fd, name, value, size); } @@ -1508,7 +1506,7 @@ int removexattr(const char *fname, if (smbw_path(fname)) { return smbw_removexattr(fname, name); } - + return (* smbw_libc.removexattr)(fname, name); } @@ -1518,7 +1516,7 @@ int lremovexattr(const char *fname, if (smbw_path(fname)) { return smbw_lremovexattr(fname, name); } - + return (* smbw_libc.lremovexattr)(fname, name); } @@ -1528,7 +1526,7 @@ int fremovexattr(int fd, if (smbw_fd(fd)) { return smbw_fremovexattr(fd, name); } - + return (* smbw_libc.fremovexattr)(fd, name); } @@ -1539,7 +1537,7 @@ int listxattr(const char *fname, if (smbw_path(fname)) { return smbw_listxattr(fname, list, size); } - + return (* smbw_libc.listxattr)(fname, list, size); } @@ -1550,7 +1548,7 @@ int llistxattr(const char *fname, if (smbw_path(fname)) { return smbw_llistxattr(fname, list, size); } - + return (* smbw_libc.llistxattr)(fname, list, size); } @@ -1561,7 +1559,7 @@ int flistxattr(int fd, if (smbw_fd(fd)) { return smbw_flistxattr(fd, list, size); } - + return (* smbw_libc.flistxattr)(fd, list, size); } @@ -1609,7 +1607,7 @@ void free(void *ptr) { static int in_progress = 0; void __libc_free(void *ptr); - + if (in_progress) return; in_progress = 1; __libc_free(ptr); @@ -1628,7 +1626,7 @@ smbw_sigaction_handler(int signum, { /* Our entire purpose for trapping signals is to call this! */ sys_select_signal(); - + /* Call the user's handler */ if (user_action[signum].sa_handler != SIG_IGN && user_action[signum].sa_handler != SIG_DFL && @@ -1660,14 +1658,14 @@ do_select(int n, int saved_errno; sigset_t sigset; struct sigaction new_action; - + saved_errno = errno; for (i=1; i<_NSIG; i++) { sigemptyset(&sigset); new_action.sa_mask = sigset; new_action.sa_flags = SA_SIGINFO; new_action.sa_sigaction = smbw_sigaction_handler; - + if (sigaction(i, &new_action, &user_action[i]) < 0) { if (errno != EINVAL) { return -1; @@ -1675,14 +1673,14 @@ do_select(int n, } } errno = saved_errno; - + ret = (* select_fn)(n, readfds, writefds, exceptfds, timeout); saved_errno = errno; - + for (i=0; i<_NSIG; i++) { (void) sigaction(i, &user_action[i], NULL); } - + errno = saved_errno; return ret; } @@ -1695,7 +1693,7 @@ select(int n, struct timeval *timeout) { check_init("select"); - + return do_select(n, readfds, writefds, exceptfds, timeout, smbw_libc.select); } @@ -1708,7 +1706,7 @@ _select(int n, struct timeval *timeout) { check_init("_select"); - + return do_select(n, readfds, writefds, exceptfds, timeout, smbw_libc._select); } @@ -1721,7 +1719,7 @@ __select(int n, struct timeval *timeout) { check_init("__select"); - + return do_select(n, readfds, writefds, exceptfds, timeout, smbw_libc.__select); } diff --git a/examples/libsmbclient/smbwrapper/wrapper.h b/examples/libsmbclient/smbwrapper/wrapper.h index 6d0d9f527a3..5a18b9d76cf 100644 --- a/examples/libsmbclient/smbwrapper/wrapper.h +++ b/examples/libsmbclient/smbwrapper/wrapper.h @@ -32,6 +32,10 @@ #include <signal.h> #include <stdio.h> +#ifndef __FD_SETSIZE +# define __FD_SETSIZE 256 +#endif + extern int smbw_fd_map[__FD_SETSIZE]; extern int smbw_ref_count[__FD_SETSIZE]; extern char smbw_cwd[PATH_MAX]; diff --git a/examples/libsmbclient/testbrowse.c b/examples/libsmbclient/testbrowse.c index 6fa70eab414..ca126c9510f 100644 --- a/examples/libsmbclient/testbrowse.c +++ b/examples/libsmbclient/testbrowse.c @@ -29,6 +29,8 @@ int main(int argc, char * argv[]) { int debug = 0; + int debug_stderr = 0; + int no_auth = 0; int scan = 0; int iterations = -1; int again; @@ -37,6 +39,7 @@ main(int argc, char * argv[]) char * q; char buf[1024]; poptContext pc; + SMBCCTX * context; struct poptOption long_options[] = { POPT_AUTOHELP @@ -45,6 +48,10 @@ main(int argc, char * argv[]) 0, "Set debug level", "integer" }, { + "stderr", 'e', POPT_ARG_NONE, &debug_stderr, + 0, "Debug log to stderr instead of stdout", "integer" + }, + { "scan", 's', POPT_ARG_NONE, &scan, 0, "Scan for servers and shares", "integer" }, @@ -53,6 +60,10 @@ main(int argc, char * argv[]) 0, "Iterations", "integer" }, { + "noauth", 'A', POPT_ARG_NONE, &no_auth, + 0, "Do not request authentication data", "integer" + }, + { NULL } }; @@ -69,14 +80,40 @@ main(int argc, char * argv[]) } } + /* Allocate a new context */ + context = smbc_new_context(); + if (!context) { + printf("Could not allocate new smbc context\n"); + return 1; + } + + /* If we're scanning, do no requests for authentication data */ + if (scan) { + no_auth = 1; + } + + /* Set mandatory options (is that a contradiction in terms?) */ + context->debug = debug; + context->callbacks.auth_fn = (no_auth ? no_auth_data_fn : get_auth_data_fn); + + /* If we've been asked to log to stderr instead of stdout... */ + if (debug_stderr) { + /* ... then set the option to do so */ + smbc_option_set(context, "debug_stderr"); + } + + /* Initialize the context using the previously specified options */ + if (!smbc_init_context(context)) { + smbc_free_context(context, 0); + printf("Could not initialize smbc context\n"); + return 1; + } + + /* Tell the compatibility layer to use this context */ + smbc_set_context(context); + if (scan) { - if (smbc_init(no_auth_data_fn, debug) != 0) - { - printf("Could not initialize smbc_ library\n"); - return 1; - } - for (; iterations == -1 || iterations > 0; iterations = (iterations == -1 ? iterations : --iterations)) @@ -87,12 +124,6 @@ main(int argc, char * argv[]) } else { - if (smbc_init(get_auth_data_fn, debug) != 0) - { - printf("Could not initialize smbc_ library\n"); - return 1; - } - for (; iterations == -1 || iterations > 0; iterations = (iterations == -1 ? iterations : --iterations)) diff --git a/examples/libsmbclient/teststat.c b/examples/libsmbclient/teststat.c index 29517efb6f6..86c69e4e2cd 100644 --- a/examples/libsmbclient/teststat.c +++ b/examples/libsmbclient/teststat.c @@ -48,7 +48,7 @@ int main(int argc, char * argv[]) return 1; } - printf("SAMBA\n mtime:%lu/%s ctime:%lu/%s atime:%lu/%s\n", + printf("\nSAMBA\n mtime:%lu/%s ctime:%lu/%s atime:%lu/%s\n", st.st_mtime, ctime_r(&st.st_mtime, mtime), st.st_ctime, ctime_r(&st.st_ctime, ctime), st.st_atime, ctime_r(&st.st_atime, atime)); diff --git a/examples/misc/adssearch.pl b/examples/misc/adssearch.pl index 9bfc9e8a055..f9a7f949262 100755 --- a/examples/misc/adssearch.pl +++ b/examples/misc/adssearch.pl @@ -55,6 +55,7 @@ my $realm = ""; # parse input my ( + $opt_asq, $opt_base, $opt_binddn, $opt_debug, @@ -77,10 +78,12 @@ my ( $opt_simpleauth, $opt_starttls, $opt_user, + $opt_verbose, $opt_workgroup, ); GetOptions( + 'asq=s' => \$opt_asq, 'base|b=s' => \$opt_base, 'D|DN=s' => \$opt_binddn, 'debug=i' => \$opt_debug, @@ -102,6 +105,7 @@ GetOptions( 'simpleauth|x' => \$opt_simpleauth, 'tls|Z' => \$opt_starttls, 'user|U=s' => \$opt_user, + 'verbose|v' => \$opt_verbose, 'wknguid' => \$opt_dump_wknguid, 'workgroup|k=s' => \$opt_workgroup, ); @@ -129,11 +133,12 @@ my ($sasl_hd, $async_ldap_hd, $sync_ldap_hd); my ($mesg, $usn); my (%entry_store); my $async_search; -my (%ads_atype, %ads_gtype, %ads_uf); +my (%ads_atype, %ads_gtype, %ads_grouptype, %ads_uf); # fixed values and vars my $set = "X"; my $unset = "-"; +my $tabsize = "\t\t\t"; # get defaults my $scope = $opt_scope || "sub"; @@ -219,9 +224,112 @@ my %ads_instance_type = ( ); my %ads_uacc = ( - "ACCOUNT_NEVER_EXPIRES" => 0x000000, # 0 - "ACCOUNT_OK" => 0x800000, # 8388608 - "ACCOUNT_LOCKED_OUT" => 0x800010, # 8388624 + "ACCOUNT_NEVER_EXPIRES" => 0x000000, # 0 + "ACCOUNT_OK" => 0x800000, # 8388608 + "ACCOUNT_LOCKED_OUT" => 0x800010, # 8388624 +); + +my %ads_gpoptions = ( + "GPOPTIONS_INHERIT" => 0, + "GPOPTIONS_BLOCK_INHERITANCE" => 1, +); + +my %ads_gplink_opts = ( + "GPLINK_OPT_NONE" => 0, + "GPLINK_OPT_DISABLED" => 1, + "GPLINK_OPT_ENFORCED" => 2, +); + +my %ads_gpflags = ( + "GPFLAGS_ALL_ENABLED" => 0, + "GPFLAGS_USER_SETTINGS_DISABLED" => 1, + "GPFLAGS_MACHINE_SETTINGS_DISABLED" => 2, + "GPFLAGS_ALL_DISABLED" => 3, +); + +my %ads_serverstate = ( + "SERVER_ENABLED" => 1, + "SERVER_DISABLED" => 2, +); + +my %ads_sdeffective = ( + "OWNER_SECURITY_INFORMATION" => 0x01, + "DACL_SECURITY_INFORMATION" => 0x04, + "SACL_SECURITY_INFORMATION" => 0x10, +); + +my %ads_trustattrs = ( + "TRUST_ATTRIBUTE_NON_TRANSITIVE" => 1, + "TRUST_ATTRIBUTE_TREE_PARENT" => 2, + "TRUST_ATTRIBUTE_TREE_ROOT" => 3, + "TRUST_ATTRIBUTE_UPLEVEL_ONLY" => 4, +); + +my %ads_trustdirection = ( + "TRUST_DIRECTION_INBOUND" => 1, + "TRUST_DIRECTION_OUTBOUND" => 2, + "TRUST_DIRECTION_BIDIRECTIONAL" => 3, +); + +my %ads_trusttype = ( + "TRUST_TYPE_DOWNLEVEL" => 1, + "TRUST_TYPE_UPLEVEL" => 2, + "TRUST_TYPE_KERBEROS" => 3, + "TRUST_TYPE_DCE" => 4, +); + +my %ads_pwdproperties = ( + "DOMAIN_PASSWORD_COMPLEX" => 1, + "DOMAIN_PASSWORD_NO_ANON_CHANGE" => 2, + "DOMAIN_PASSWORD_NO_CLEAR_CHANGE" => 4, + "DOMAIN_LOCKOUT_ADMINS" => 8, + "DOMAIN_PASSWORD_STORE_CLEARTEXT" => 16, + "DOMAIN_REFUSE_PASSWORD_CHANGE" => 32, +); + +my %ads_uascompat = ( + "LANMAN_USER_ACCOUNT_SYSTEM_NOLIMITS" => 0, + "LANMAN_USER_ACCOUNT_SYSTEM_COMPAT" => 1, +); + +my %ads_frstypes = ( + "REPLICA_SET_SYSVOL" => 2, # unsure + "REPLICA_SET_DFS" => 1, # unsure + "REPLICA_SET_OTHER" => 0, # unsure +); + +my %ads_gp_cse_extensions = ( +"Administrative Templates Extension" => "35378EAC-683F-11D2-A89A-00C04FBBCFA2", +"Disk Quotas" => "3610EDA5-77EF-11D2-8DC5-00C04FA31A66", +"EFS Recovery" => "B1BE8D72-6EAC-11D2-A4EA-00C04F79F83A", +"Folder Redirection" => "25537BA6-77A8-11D2-9B6C-0000F8080861", +"IP Security" => "E437BC1C-AA7D-11D2-A382-00C04F991E27", +"Internet Explorer Maintenance" => "A2E30F80-D7DE-11d2-BBDE-00C04F86AE3B", +"QoS Packet Scheduler" => "426031c0-0b47-4852-b0ca-ac3d37bfcb39", +"Scripts" => "42B5FAAE-6536-11D2-AE5A-0000F87571E3", +"Security" => "827D319E-6EAC-11D2-A4EA-00C04F79F83A", +"Software Installation" => "C6DC5466-785A-11D2-84D0-00C04FB169F7", +); + +# guess work +my %ads_gpcextensions = ( +"Administrative Templates" => "0F6B957D-509E-11D1-A7CC-0000F87571E3", +"Certificates" => "53D6AB1D-2488-11D1-A28C-00C04FB94F17", +"EFS recovery policy processing" => "B1BE8D72-6EAC-11D2-A4EA-00C04F79F83A", +"Folder Redirection policy processing" => "25537BA6-77A8-11D2-9B6C-0000F8080861", +"Folder Redirection" => "88E729D6-BDC1-11D1-BD2A-00C04FB9603F", +"Registry policy processing" => "35378EAC-683F-11D2-A89A-00C04FBBCFA2", +"Remote Installation Services" => "3060E8CE-7020-11D2-842D-00C04FA372D4", +"Security Settings" => "803E14A0-B4FB-11D0-A0D0-00A0C90F574B", +"Security policy processing" => "827D319E-6EAC-11D2-A4EA-00C04F79F83A", +"unknown" => "3060E8D0-7020-11D2-842D-00C04FA372D4", +"unknown2" => "53D6AB1B-2488-11D1-A28C-00C04FB94F17", +); + +my %ads_gpo_default_guids = ( +"Default Domain Policy" => "31B2F340-016D-11D2-945F-00C04FB984F9", +"Default Domain Controllers Policy" => "6AC1786C-016F-11D2-945F-00C04fB984F9", +"mist" => "61718096-3D3F-4398-8318-203A48976F9E", ); my %munged_dial = ( @@ -243,7 +351,6 @@ my %munged_dial = ( "CtxCallbackNumber" => \&dump_string, ); - $SIG{__WARN__} = sub { use Carp; Carp::cluck (shift); @@ -299,45 +406,67 @@ if (!$password) { } my %attr_handler = ( + "Token-Groups-No-GC-Acceptable" => \&dump_sid, #wrong name "accountExpires" => \&dump_nttime, "badPasswordTime" => \&dump_nttime, "creationTime" => \&dump_nttime, "currentTime" => \&dump_timestr, "domainControllerFunctionality" => \&dump_ds_func, "domainFunctionality" => \&dump_ds_func, - "dSCorePropagationData" => \&dump_timestr, + "fRSReplicaSetGUID" => \&dump_guid, + "fRSReplicaSetType" => \&dump_frstype, + "fRSVersionGUID" => \&dump_guid, + "flags" => \&dump_gpflags, # fixme: possibly only on gpos! "forceLogoff" => \&dump_nttime_abs, "forestFunctionality" => \&dump_ds_func, +# "gPCMachineExtensionNames" => \&dump_gpcextensions, +# "gPCUserExtensionNames" => \&dump_gpcextensions, + "gPLink" => \&dump_gplink, + "gPOptions" => \&dump_gpoptions, "groupType" => \&dump_gtype, "instanceType" => \&dump_instance_type, "lastLogon" => \&dump_nttime, "lastLogonTimestamp" => \&dump_nttime, - "lockoutTime" => \&dump_nttime, - "lockoutDuration" => \&dump_nttime_abs, "lockOutObservationWindow" => \&dump_nttime_abs, -# "logonHours" => \&dump_not_yet, + "lockoutDuration" => \&dump_nttime_abs, + "lockoutTime" => \&dump_nttime, +# "logonHours" => \&dump_logonhours, "maxPwdAge" => \&dump_nttime_abs, "minPwdAge" => \&dump_nttime_abs, "modifyTimeStamp" => \&dump_timestr, + "msDS-Behavior-Version" => \&dump_ds_func, #unsure + "msDS-User-Account-Control-Computed" => \&dump_uacc, # "msRADIUSFramedIPAddress" => \&dump_ipaddr, # "msRASSavedFramedIPAddress" => \&dump_ipaddr, - "ntMixedDomain" => \&dump_mixed_domain, + "nTMixedDomain" => \&dump_mixed_domain, "nTSecurityDescriptor" => \&dump_secdesc, "objectGUID" => \&dump_guid, "objectSid" => \&dump_sid, + "pKT" => \&dump_pkt, + "pKTGuid" => \&dump_guid, "pwdLastSet" => \&dump_nttime, + "pwdProperties" => \&dump_pwdproperties, "sAMAccountType" => \&dump_atype, - "systemFlags" => \&dump_systemflags, - "supportedControl", => \&dump_controls, + "sDRightsEffective" => \&dump_sdeffective, + "securityIdentifier" => \&dump_sid, + "serverState" => \&dump_serverstate, "supportedCapabilities", => \&dump_capabilities, + "supportedControl", => \&dump_controls, "supportedExtension", => \&dump_extension, + "systemFlags" => \&dump_systemflags, "tokenGroups", => \&dump_sid, + "tokenGroupsGlobalAndUniversal" => \&dump_sid, + "trustAttributes" => \&dump_trustattr, + "trustDirection" => \&dump_trustdirection, + "trustType" => \&dump_trusttype, + "uASCompat" => \&dump_uascompat, "userAccountControl" => \&dump_uac, - "msDS-User-Account-Control-Computed" => \&dump_uacc, + "userCertificate" => \&dump_cert, "userFlags" => \&dump_uf, "userParameters" => \&dump_munged_dial, "whenChanged" => \&dump_timestr, "whenCreated" => \&dump_timestr, +# "dSCorePropagationData" => \&dump_timestr, ); @@ -347,7 +476,8 @@ my %attr_handler = ( ################ sub usage { - print "usage: $0 [--base|-b base] [--debug level] [--debug level] [--DN|-D binddn] [--extendeddn|-e] [--help] [--host|-h host] [--machine|-P] [--metadata|-m] [--nodiffs] [--notify|-n] [--password|-w password] [--port port] [--rawdisplay] [--realm|-R realm] [--rootdse] [--saslmech|-Y saslmech] [--schema|-c] [--scope|-s scope] [--simpleauth|-x] [--starttls|-Z] [--user|-U user] [--wknguid] [--workgroup|-k workgroup] filter [attrs]\n"; + print "usage: $0 [--asq] [--base|-b base] [--debug level] [--debug level] [--DN|-D binddn] [--extendeddn|-e] [--help] [--host|-h host] [--machine|-P] [--metadata|-m] [--nodiffs] [--notify|-n] [--password|-w password] [--port port] [--rawdisplay] [--realm|-R realm] [--rootdse] [--saslmech|-Y saslmech] [--schema|-c] [--scope|-s scope] [--simpleauth|-x] [--starttls|-Z] [--user|-U user] [--wknguid] [--workgroup|-k workgroup] filter [attrs]\n"; + print "\t--asq [attribute]\n\t\tAttribute to use for a attribute scoped query (LDAP_SERVER_ASQ_OID)\n"; print "\t--base|-b [base]\n\t\tUse base [base]\n"; print "\t--debug [level]\n\t\tUse debuglevel (for Net::LDAP)\n"; print "\t--DN|-D [binddn]\n\t\tUse binddn or principal\n"; @@ -547,6 +677,8 @@ sub prompt_user { } sub check_ticket { + return 0; + # works only for heimdal return system("$klist -t"); } @@ -740,18 +872,32 @@ sub parse_ads_h { chomp($line); if ($line =~ /#define.UF.*0x/) { my ($tmp, $name, $val) = split(/\s+/,$line); - next if ($name =~ /UNUSED/); + next if ($name =~ /UNUSED/); +# $ads_uf{$name} = sprintf("%d", hex $val); $ads_uf{$name} = hex $val; } - if ($line =~ /#define.GTYPE.*0x/) { + if ($line =~ /#define.GROUP_TYPE.*0x/) { my ($tmp, $name, $val) = split(/\s+/,$line); - $ads_gtype{$name} = hex $val; + $ads_grouptype{$name} = hex $val; } if ($line =~ /#define.ATYPE.*0x/) { my ($tmp, $name, $val) = split(/\s+/,$line); $ads_atype{$name} = (exists $ads_atype{$val}) ? $ads_atype{$val} : hex $val; } + if ($line =~ /#define.GTYPE.*0x/) { + my ($val, $i); + my ($tmp, $name, @val) = split(/\s+/,$line); + foreach my $tempval (@val) { + if ($tempval =~ /^0x/) { + $val = $tempval; + last; + } + } + next if (!$val); + $ads_gtype{$name} = sprintf("%d", hex $val); + } + } close(ADSH); } @@ -825,52 +971,12 @@ sub display_result_diff ($) { sub sid2string ($) { + # Fix from Michael James <michael@james.st> my $binary_sid = shift; - my $inbuf2; - my $sid_rev; # [1] - my $num_auths; # [1] - my @id_auth; # [6] - my @sub_auths; - my $subauth; # [16] - my $sid_strout; - my $ia; - - my $tmp_sid = unpack 'H*', $binary_sid; - - # split the binary string - ($sid_rev, $num_auths, - $id_auth[0], $id_auth[1], $id_auth[2], $id_auth[3], $id_auth[4], $id_auth[5], - $sub_auths[0], $sub_auths[1], $sub_auths[2], $sub_auths[3], $sub_auths[4], $inbuf2) - = unpack 'H2 H2 H2 H2 H2 H2 H2 H2 h8 h8 h8 h8 h8 h*',"$binary_sid"; - - # don't ask... - for ( my $i = 0; $i < $num_auths; $i++ ) { - $sub_auths[$i] = reverse $sub_auths[$i]; - } - - # build the identifier authority - if ( ($id_auth[0] != 0) || ($id_auth[1] != 0) ) { - $ia = $id_auth[0]. - $id_auth[1]. - $id_auth[2]. - $id_auth[3]. - $id_auth[4]. - $id_auth[5]; - } else { - $ia = ($id_auth[5]) + - ($id_auth[4] << 8) + - ($id_auth[3] << 16) + - ($id_auth[2] << 24); - } - - # build the sid - $sid_strout = sprintf("S-%lu-%lu",hex($sid_rev),hex($ia)); - - for (my $i = 0; $i < $num_auths; $i++ ) { - $sid_strout .= sprintf( "-%lu", hex($sub_auths[$i]) ); - } - - return $sid_strout; + my($sid_rev, $num_auths, $id1, $id2, @ids) = unpack("H2 H2 n N V*", $binary_sid); + my $sid_string = join("-", "S", hex($sid_rev), ($id1<<32)+$id2, @ids); + return $sid_string; + } sub string_to_guid { @@ -959,9 +1065,10 @@ sub gen_bitmask_string_format($%) { foreach my $key (sort keys %tmp) { push(@list, sprintf("%s %s", $tmp{$key}, $key)); } - return join("\n$mod\t\t\t",@list); + return join("\n$mod$tabsize",@list); } + sub nt_to_unixtime ($) { # the number of 100 nanosecond intervals since jan. 1. 1601 (utc) my $t64 = shift; @@ -994,7 +1101,7 @@ sub dump_bitmask { my (%header) = @_; my %tmp; $tmp{""} = $val; - foreach my $key (sort keys %header) { + foreach my $key (sort keys %header) { # sort by val ! if ($op eq "&") { $tmp{$key} = ( $val & $header{$key} ) ? $set:$unset; } elsif ($op eq "==") { @@ -1019,6 +1126,18 @@ sub dump_uac { return dump_bitmask_and(@_,%ads_uf); # ads_uf ? } +sub dump_uascompat { + return dump_bitmask_equal(@_,%ads_uascompat); +} + +sub dump_gpoptions { + return dump_bitmask_equal(@_,%ads_gpoptions); +} + +sub dump_gpflags { + return dump_bitmask_equal(@_,%ads_gpflags); +} + sub dump_uacc { return dump_bitmask_equal(@_,%ads_uacc); } @@ -1028,7 +1147,10 @@ sub dump_uf { } sub dump_gtype { - return dump_bitmask_and(@_,%ads_gtype); + my $ret = dump_bitmask_and(@_,%ads_grouptype); + $ret .= "\n$tabsize\t"; + $ret .= dump_bitmask_equal(@_,%ads_gtype); + return $ret; } sub dump_atype { @@ -1059,6 +1181,34 @@ sub dump_ds_func { return dump_bitmask_equal(@_,%ads_ds_func); } +sub dump_serverstate { + return dump_bitmask_equal(@_,%ads_serverstate); +} + +sub dump_sdeffective { + return dump_bitmask_and(@_,%ads_sdeffective); +} + +sub dump_trustattr { + return dump_bitmask_equal(@_,%ads_trustattrs); +} + +sub dump_trusttype { + return dump_bitmask_equal(@_,%ads_trusttype); +} + +sub dump_trustdirection { + return dump_bitmask_equal(@_,%ads_trustdirection); +} + +sub dump_pwdproperties { + return dump_bitmask_and(@_,%ads_pwdproperties); +} + +sub dump_frstype { + return dump_bitmask_equal(@_,%ads_frstypes) +} + sub dump_mixed_domain { return dump_bitmask_equal(@_,%ads_mixed_domain); } @@ -1100,6 +1250,9 @@ sub dump_nttime_abs { sub dump_timestr { my $time = shift; + if ($time eq "16010101000010.0Z") { + return sprintf("%s (%s)", "never", $time); + } my ($year,$mon,$mday,$hour,$min,$sec,$zone) = unpack('a4 a2 a2 a2 a2 a2 a4', $time); $mon -= 1; @@ -1120,6 +1273,37 @@ sub dump_munged_dial { return "FIXME! decode this"; } +sub dump_cert { + + my $cert = shift; + open(OPENSSL, "| /usr/bin/openssl x509 -text -inform der"); + print OPENSSL $cert; + close(OPENSSL); + return ""; +} + +sub dump_pkt { + my $pkt = shift; + return "not yet"; + printf("%s: ", $pkt); + printf("%02X", $pkt); + +} + +sub dump_gplink { + + my $gplink = shift; + my $gplink_mod = $gplink; + my @links = split("\\]\\[", $gplink_mod); + foreach my $link (@links) { + $link =~ s/^\[|\]$//g; + my ($ldap_link, $opt) = split(";", $link); + my @array = ( "$opt", "\t" ); + printf("%slink: %s, opt: %s\n", $tabsize, $ldap_link, dump_bitmask_and(@array, %ads_gplink_opts)); + } + return $gplink; +} + sub construct_filter { my $tmp = shift; @@ -1154,10 +1338,12 @@ sub construct_attrs { push(@attrs,"replPropertyMetaData"); } - push(@attrs,"nTSecurityDescriptor"); - push(@attrs,"msDS-KeyVersionNumber"); - push(@attrs,"msDS-User-Account-Control-Computed"); - push(@attrs,"modifyTimeStamp"); + if ($opt_verbose) { + push(@attrs,"nTSecurityDescriptor"); + push(@attrs,"msDS-KeyVersionNumber"); + push(@attrs,"msDS-User-Account-Control-Computed"); + push(@attrs,"modifyTimeStamp"); + } return sort @attrs; } @@ -1183,29 +1369,50 @@ sub print_header { sub gen_controls { - my $asn = Convert::ASN1->new; - $asn->prepare( + # setup attribute-scoped query control + my $asq_asn = Convert::ASN1->new; + $asq_asn->prepare( + q< asq ::= SEQUENCE { + sourceAttribute OCTET_STRING + } + > + ); + my $ctl_asq_val = $asq_asn->encode( sourceAttribute => $opt_asq); + my $ctl_asq = Net::LDAP::Control->new( + type => $ads_controls{'LDAP_SERVER_ASQ_OID'}, + critical => 'true', + value => $ctl_asq_val); + + + # setup extended dn control + my $asn_extended_dn = Convert::ASN1->new; + $asn_extended_dn->prepare( q< ExtendedDn ::= SEQUENCE { mode INTEGER } > ); - my $ctl_extended_dn_val = $asn->encode( mode => '1'); + my $ctl_extended_dn_val = $asn_extended_dn->encode( mode => '1'); my $ctl_extended_dn =Net::LDAP::Control->new( type => $ads_controls{'LDAP_SERVER_EXTENDED_DN_OID'}, critical => 'true', value => $ctl_extended_dn_val); + + # setup notify control my $ctl_notification = Net::LDAP::Control->new( type => $ads_controls{'LDAP_SERVER_NOTIFICATION_OID'}, critical => 'true'); + + # setup paging control $ctl_paged = Net::LDAP::Control->new( type => $ads_controls{'LDAP_PAGED_RESULT_OID_STRING'}, critical => 'true', size => $page_size); + if ($paging) { push(@ctrls, $ctl_paged); push(@ctrls_s, "LDAP_PAGED_RESULT_OID_STRING" ); @@ -1220,6 +1427,11 @@ sub gen_controls { push(@ctrls_s, "LDAP_SERVER_NOTIFICATION_OID"); } + if ($opt_asq) { + push(@ctrls, $ctl_asq); + push(@ctrls_s, "LDAP_SERVER_ASQ_OID"); + } + return @ctrls; } @@ -1244,7 +1456,7 @@ sub display_attr_generic ($$$) { my $ref = $entry->get_value($attr, asref => 1); my @values = @$ref; - foreach my $value (@values) { + foreach my $value ( sort @values) { display_value_generic($mod,$attr,$value); } } @@ -1254,14 +1466,14 @@ sub display_entry_generic ($) { my $entry = shift; return if (!$entry); - foreach my $attr ( $entry->attributes) { + foreach my $attr ( sort $entry->attributes) { display_attr_generic("\t",$entry,$attr); } } sub display_ldap_err ($) { - my $msg = shift; + my $msg = shift; print_header(); my ($package, $filename, $line, $subroutine) = caller(0); @@ -1342,6 +1554,11 @@ sub notify_callback { while (1) { my $async_entry = $async_search->pop_entry; + + if (!$async_entry->dn) { + print "very weird. entry has no dn\n"; + next; + } printf("\ngot changenotify for dn: [%s]\n%s\n", $async_entry->dn, ("-" x 80)); @@ -1450,7 +1667,7 @@ sub main () { if ($opt_notify) { - print "[$base] is registered now for change-notify\n"; + print "Base [$base] is registered now for change-notify\n"; print "\nWaiting for change-notify...\n"; my $sync_ldap_hd = get_ldap_hd($server,0); diff --git a/packaging/Solaris/makepkg.sh b/packaging/Solaris/makepkg.sh index 2d599fca9b7..18e9f00f84a 100644 --- a/packaging/Solaris/makepkg.sh +++ b/packaging/Solaris/makepkg.sh @@ -128,15 +128,16 @@ echo "Install directory: $INSTALL_BASE" cd $DISTR_BASE/source -if [ "x$1" != "xnobuild" ]; then +if test "x$1" = "xbuild" ]; then ./configure --prefix=$INSTALL_BASE \ - --with-acl-support \ - --with-included-popt \ --localstatedir=/var/lib/samba \ --with-piddir=/var/run \ --with-logfilebase=/var/log/samba \ --with-privatedir=/etc/samba/private \ --with-configdir=/etc/samba \ + --with-lockdir=/var/lib/samba \ + --with-pam --with-acl-support \ + --with-quotas --with-included-popt \ && make if [ $? -ne 0 ]; then diff --git a/source/VERSION b/source/VERSION index a1d1b1090d2..36aca8bb1f3 100644 --- a/source/VERSION +++ b/source/VERSION @@ -1,6 +1,12 @@ ######################################################## # SAMBA Version # # # +# Samba versions are as follows # +# 3.0.x New production series # +# 3.0.x{pre,rc}y Preview/Testing & RC # +# 3.0.x[a-z] Patch releases # +# 3.0.x[a-z]-VENDOR-z Vendor patch releases # +# # # script/mkversion.sh # # will use this file to create # # include/version.h # @@ -31,7 +37,7 @@ SAMBA_VERSION_RELEASE=21 # e.g. SAMBA_VERSION_REVISION=a # # -> "2.2.8a" # ######################################################## -SAMBA_VERSION_REVISION=a +SAMBA_VERSION_REVISION=b ######################################################## # For 'pre' releases the version will be # @@ -91,3 +97,4 @@ SAMBA_VERSION_IS_SVN_SNAPSHOT= # -> "CVS 3.0.0rc2-VendorVersion" # ######################################################## SAMBA_VERSION_VENDOR_SUFFIX= +SAMBA_VENDOR_PATCH= diff --git a/source/client/clitar.c b/source/client/clitar.c index ad3387ffdda..5afe154cbbe 100644 --- a/source/client/clitar.c +++ b/source/client/clitar.c @@ -1097,6 +1097,8 @@ static void do_tarput(void) char *longfilename = NULL, linkflag; int skip = False; + ZERO_STRUCT(finfo); + GetTimeOfDay(&tp_start); DEBUG(5, ("RJS do_tarput called ...\n")); diff --git a/source/client/smbmount.c b/source/client/smbmount.c index 4438964b838..d8254ef23a7 100644 --- a/source/client/smbmount.c +++ b/source/client/smbmount.c @@ -386,6 +386,9 @@ static void send_fs_socket(char *the_service, char *mount_point, struct cli_stat c = NULL; if (!closed) { + /* close the name cache so that close_our_files() doesn't steal its FD */ + namecache_shutdown(); + /* redirect stdout & stderr since we can't know that the library functions we use are using DEBUG. */ if ( (fd = open("/dev/null", O_WRONLY)) < 0) diff --git a/source/include/includes.h b/source/include/includes.h index cde199eed8b..6342925877c 100644 --- a/source/include/includes.h +++ b/source/include/includes.h @@ -514,7 +514,7 @@ #include <langinfo.h> #endif -#ifdef HAVE_AIO_H +#if defined(HAVE_AIO_H) && defined(WITH_AIO) #include <aio.h> #endif @@ -565,6 +565,7 @@ typedef int VOLATILE SIG_ATOMIC_T; #endif #ifndef HAVE_SOCKLEN_T_TYPE +#define HAVE_SOCKLEN_T_TYPE typedef int socklen_t; #endif @@ -656,6 +657,20 @@ typedef int socklen_t; # endif #endif +#ifndef LARGE_SMB_DEV_T +# if (defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_DEV64_T)) || (defined(SIZEOF_DEV_T) && (SIZEOF_DEV_T == 8)) +# define LARGE_SMB_DEV_T 1 +# endif +#endif + +#ifdef LARGE_SMB_DEV_T +#define SDEV_T_VAL(p, ofs, v) (SIVAL((p),(ofs),(v)&0xFFFFFFFF), SIVAL((p),(ofs)+4,(v)>>32)) +#define DEV_T_VAL(p, ofs) ((SMB_DEV_T)(((SMB_BIG_UINT)(IVAL((p),(ofs))))| (((SMB_BIG_UINT)(IVAL((p),(ofs)+4))) << 32))) +#else +#define SDEV_T_VAL(p, ofs, v) (SIVAL((p),(ofs),v),SIVAL((p),(ofs)+4,0)) +#define DEV_T_VAL(p, ofs) ((SMB_DEV_T)(IVAL((p),(ofs)))) +#endif + /* * Setup the correctly sized inode type. */ @@ -675,9 +690,11 @@ typedef int socklen_t; #endif #ifdef LARGE_SMB_INO_T -#define SINO_T(p, ofs, v) (SIVAL(p,ofs,(v)&0xFFFFFFFF), SIVAL(p,(ofs)+4,(v)>>32)) +#define SINO_T_VAL(p, ofs, v) (SIVAL((p),(ofs),(v)&0xFFFFFFFF), SIVAL((p),(ofs)+4,(v)>>32)) +#define INO_T_VAL(p, ofs) ((SMB_INO_T)(((SMB_BIG_UINT)(IVAL(p,ofs)))| (((SMB_BIG_UINT)(IVAL(p,(ofs)+4))) << 32))) #else -#define SINO_T(p, ofs, v) (SIVAL(p,ofs,v),SIVAL(p,(ofs)+4,0)) +#define SINO_T_VAL(p, ofs, v) (SIVAL(p,ofs,v),SIVAL(p,(ofs)+4,0)) +#define INO_T_VAL(p, ofs) ((SMB_INO_T)(IVAL((p),(ofs)))) #endif #ifndef SMB_OFF_T diff --git a/source/include/ntdomain.h b/source/include/ntdomain.h index fd36006c0b7..a30b7243727 100644 --- a/source/include/ntdomain.h +++ b/source/include/ntdomain.h @@ -284,7 +284,7 @@ typedef struct pipes_struct { output_data out_data; - /* This context is used for PUD data and is freed between each pdu. + /* This context is used for PDU data and is freed between each pdu. Don't use for pipe state storage. */ TALLOC_CTX *mem_ctx; diff --git a/source/include/rpc_client.h b/source/include/rpc_client.h index 8a83c0f8ae8..0524f037e2c 100644 --- a/source/include/rpc_client.h +++ b/source/include/rpc_client.h @@ -23,8 +23,8 @@ /* macro to expand cookie-cutter code in cli_xxx() using rpc_api_pipe_req() */ -#define CLI_DO_RPC( pcli, ctx, p_idx, opnum, q_in, r_out, \ - q_ps, r_ps, q_io_fn, r_io_fn, default_error ) \ +#define CLI_DO_RPC_INTERNAL( pcli, ctx, p_idx, opnum, q_in, r_out, \ + q_ps, r_ps, q_io_fn, r_io_fn, default_error, copy_sess_key ) \ {\ SMB_ASSERT(pcli->pipe_idx == p_idx); \ if (!prs_init( &q_ps, RPC_MAX_PDU_FRAG_LEN, ctx, MARSHALL )) { \ @@ -34,6 +34,7 @@ prs_mem_free( &q_ps );\ return NT_STATUS_NO_MEMORY;\ }\ + if ( copy_sess_key) prs_set_session_key(&q_ps, (const char *)pcli->dc->sess_key);\ if ( q_io_fn("", &q_in, &q_ps, 0) ) {\ NTSTATUS _smb_pipe_stat_ = rpc_api_pipe_req(pcli, opnum, &q_ps, &r_ps); \ if (!NT_STATUS_IS_OK(_smb_pipe_stat_)) {\ @@ -41,6 +42,7 @@ prs_mem_free( &r_ps );\ return _smb_pipe_stat_;\ }\ + if ( copy_sess_key ) prs_set_session_key(&r_ps, (const char *)pcli->dc->sess_key);\ if (!r_io_fn("", &r_out, &r_ps, 0)) {\ prs_mem_free( &q_ps );\ prs_mem_free( &r_ps );\ @@ -55,6 +57,21 @@ prs_mem_free( &r_ps );\ } +#define CLI_DO_RPC_COPY_SESS_KEY( pcli, ctx, p_idx, opnum, q_in, r_out, \ + q_ps, r_ps, q_io_fn, r_io_fn, default_error ) \ +{\ + CLI_DO_RPC_INTERNAL( pcli, ctx, p_idx, opnum, q_in, r_out, \ + q_ps, r_ps, q_io_fn, r_io_fn, default_error, True ); \ +} + +#define CLI_DO_RPC( pcli, ctx, p_idx, opnum, q_in, r_out, \ + q_ps, r_ps, q_io_fn, r_io_fn, default_error ) \ +{\ + CLI_DO_RPC_INTERNAL( pcli, ctx, p_idx, opnum, q_in, r_out, \ + q_ps, r_ps, q_io_fn, r_io_fn, default_error, False ); \ +} + + /* Arrrgg. Same but with WERRORS. Needed for registry code. */ #define CLI_DO_RPC_WERR( pcli, ctx, p_idx, opnum, q_in, r_out, \ diff --git a/source/include/rpc_samr.h b/source/include/rpc_samr.h index 5555aaef0e4..342db37ea57 100644 --- a/source/include/rpc_samr.h +++ b/source/include/rpc_samr.h @@ -408,6 +408,7 @@ typedef struct sam_user_info_16 } SAM_USER_INFO_16; + /* SAM_USER_INFO_7 */ typedef struct sam_user_info_7 { @@ -417,6 +418,13 @@ typedef struct sam_user_info_7 } SAM_USER_INFO_7; +/* SAM_USER_INFO_9 */ +typedef struct sam_user_info_9 +{ + uint32 rid_group; /* Primary Group RID */ +} SAM_USER_INFO_9; + + /* SAMR_Q_CLOSE_HND - probably a policy handle close */ typedef struct q_samr_close_hnd_info { @@ -1255,6 +1263,7 @@ typedef struct sam_userinfo_ctr_info union { SAM_USER_INFO_7 *id7; + SAM_USER_INFO_9 *id9; SAM_USER_INFO_16 *id16; SAM_USER_INFO_17 *id17; SAM_USER_INFO_18 *id18; diff --git a/source/include/rpc_svcctl.h b/source/include/rpc_svcctl.h index 4a058999a38..8ca5e1772b8 100644 --- a/source/include/rpc_svcctl.h +++ b/source/include/rpc_svcctl.h @@ -27,8 +27,8 @@ #define SVCCTL_CLOSE_SERVICE 0x00 #define SVCCTL_CONTROL_SERVICE 0x01 #define SVCCTL_LOCK_SERVICE_DB 0x03 -#define SVCCTL_QUERY_SERVICE_SEC 0x04 /* not impmenented */ -#define SVCCTL_SET_SEVICE_SEC 0x05 /* not implemented */ +#define SVCCTL_QUERY_SERVICE_SEC 0x04 +#define SVCCTL_SET_SERVICE_SEC 0x05 #define SVCCTL_QUERY_STATUS 0x06 #define SVCCTL_UNLOCK_SERVICE_DB 0x08 #define SVCCTL_ENUM_DEPENDENT_SERVICES_W 0x0d @@ -385,5 +385,34 @@ typedef struct { WERROR status; } SVCCTL_R_UNLOCK_SERVICE_DB; + +/**************************/ + +typedef struct { + POLICY_HND handle; + uint32 security_flags; + uint32 buffer_size; +} SVCCTL_Q_QUERY_SERVICE_SEC; + +typedef struct { + RPC_BUFFER buffer; + uint32 needed; + WERROR status; +} SVCCTL_R_QUERY_SERVICE_SEC; + +/**************************/ + +typedef struct { + POLICY_HND handle; + uint32 security_flags; + RPC_BUFFER buffer; + uint32 buffer_size; +} SVCCTL_Q_SET_SERVICE_SEC; + +typedef struct { + WERROR status; +} SVCCTL_R_SET_SERVICE_SEC; + + #endif /* _RPC_SVCCTL_H */ diff --git a/source/include/smb.h b/source/include/smb.h index 6511f10365f..b6f471c1a6f 100644 --- a/source/include/smb.h +++ b/source/include/smb.h @@ -28,7 +28,7 @@ #define _SMB_H /* logged when starting the various Samba daemons */ -#define COPYRIGHT_STARTUP_MESSAGE "Copyright Andrew Tridgell and the Samba Team 1992-2005" +#define COPYRIGHT_STARTUP_MESSAGE "Copyright Andrew Tridgell and the Samba Team 1992-2006" #if defined(LARGE_SMB_OFF_T) @@ -655,9 +655,9 @@ struct share_mode_entry { struct process_id pid; uint16 op_mid; uint16 op_type; - uint32 access_mask; /* NTCreateX access bits (FILE_READ_DATA etc.) */ - uint32 share_access; /* NTCreateX share constants (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE). */ - uint32 private_options; /* NT Create options, but we only look at + uint32_t access_mask; /* NTCreateX access bits (FILE_READ_DATA etc.) */ + uint32_t share_access; /* NTCreateX share constants (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE). */ + uint32_t private_options; /* NT Create options, but we only look at * NTCREATEX_OPTIONS_PRIVATE_DENY_DOS and * NTCREATEX_OPTIONS_PRIVATE_DENY_FCB for * smbstatus and swat */ @@ -667,6 +667,25 @@ struct share_mode_entry { unsigned long share_file_id; }; +/* oplock break message definition - linearization of share_mode_entry. + +Offset Data length. +0 struct process_id pid 4 +4 uint16 op_mid 2 +6 uint16 op_type 2 +8 uint32 access_mask 4 +12 uint32 share_access 4 +16 uint32 private_options 4 +20 uint32 time sec 4 +24 uint32 time usec 4 +28 SMB_DEV_T dev 8 bytes. +36 SMB_INO_T inode 8 bytes +44 unsigned long file_id 4 bytes +48 + +*/ +#define MSG_SMB_SHARE_MODE_ENTRY_SIZE 48 + struct share_mode_lock { const char *filename; SMB_DEV_T dev; @@ -1491,12 +1510,41 @@ struct inform_level2_message { unsigned long source_file_id; }; +/* kernel_oplock_message definition. + struct kernel_oplock_message { SMB_DEV_T dev; SMB_INO_T inode; unsigned long file_id; }; +Offset Data length. +0 SMB_DEV_T dev 8 bytes. +8 SMB_INO_T inode 8 bytes +16 unsigned long file_id 4 bytes +20 + +*/ +#define MSG_SMB_KERNEL_BREAK_SIZE 20 + +/* file_renamed_message definition. + +struct file_renamed_message { + SMB_DEV_T dev; + SMB_INO_T inode; + char names[1]; A variable area containing sharepath and filename. +}; + +Offset Data length. +0 SMB_DEV_T dev 8 bytes. +8 SMB_INO_T inode 8 bytes +16 char [] name zero terminated namelen bytes +minimum length == 18. + +*/ + +#define MSG_FILE_RENAMED_MIN_SIZE 16 + /* * On the wire return values for oplock types. */ @@ -1569,8 +1617,7 @@ struct node_status_extra { /* There really is more here ... */ }; -struct pwd_info -{ +struct pwd_info { BOOL null_pwd; BOOL cleartext; diff --git a/source/include/smb_macros.h b/source/include/smb_macros.h index 41eac7e9942..e1bed76f5be 100644 --- a/source/include/smb_macros.h +++ b/source/include/smb_macros.h @@ -24,6 +24,12 @@ #ifndef _SMB_MACROS_H #define _SMB_MACROS_H +/* no ops to help reduce the diff between the current 3.0 and release branch */ + +#define toupper_ascii(x) toupper(x) +#define tolower_ascii(x) tolower(x) + + /* Misc bit macros */ #define BOOLSTR(b) ((b) ? "Yes" : "No") #define BITSETW(ptr,bit) ((SVAL(ptr,0) & (1<<(bit)))!=0) diff --git a/source/lib/crc32.c b/source/lib/crc32.c index 7522ab7c811..a4ae90c4693 100644 --- a/source/lib/crc32.c +++ b/source/lib/crc32.c @@ -93,7 +93,7 @@ uint32 crc32_calc_buffer(const char *buf, size_t size) const unsigned char *p; uint32 crc; - p = buf; + p = (const unsigned char *)buf; crc = ~0U; while (size--) diff --git a/source/lib/gencache.c b/source/lib/gencache.c index 85599c92d33..fd44616270c 100644 --- a/source/lib/gencache.c +++ b/source/lib/gencache.c @@ -83,10 +83,13 @@ BOOL gencache_init(void) BOOL gencache_shutdown(void) { + int ret; /* tdb_close routine returns -1 on error */ if (!cache) return False; DEBUG(5, ("Closing cache file\n")); - return tdb_close(cache) != -1; + ret = tdb_close(cache); + cache = NULL; + return ret != -1; } diff --git a/source/lib/substitute.c b/source/lib/substitute.c index 4d22518230f..344f6e06fdf 100644 --- a/source/lib/substitute.c +++ b/source/lib/substitute.c @@ -448,6 +448,9 @@ void standard_sub_basic(const char *smb_name, char *str,size_t len) case 'v' : string_sub(p,"%v", SAMBA_VERSION_STRING,l); break; + case 'w' : + string_sub(p,"%w", lp_winbind_separator(),l); + break; case '$' : p += expand_env_var(p,l); break; /* Expand environment variables */ @@ -615,6 +618,9 @@ char *alloc_sub_basic(const char *smb_name, const char *str) case 'v' : t = realloc_string_sub(t, "%v", SAMBA_VERSION_STRING); break; + case 'w' : + t = realloc_string_sub(t, "%w", lp_winbind_separator()); + break; case '$' : t = realloc_expand_env_var(t, p); /* Expand environment variables */ break; diff --git a/source/lib/username.c b/source/lib/username.c index 1973a8c7c60..4dd5b5f7ce7 100644 --- a/source/lib/username.c +++ b/source/lib/username.c @@ -266,7 +266,8 @@ static struct passwd *Get_Pwnam_internals(const char *user, char *user2) /* Try as given, if username wasn't originally lowercase */ if(strcmp(user, user2) != 0) { - DEBUG(5,("Trying _Get_Pwnam(), username as given is %s\n", user)); + DEBUG(5,("Trying _Get_Pwnam(), username as given is %s\n", + user)); ret = getpwnam_alloc(user); if(ret) goto done; @@ -275,7 +276,8 @@ static struct passwd *Get_Pwnam_internals(const char *user, char *user2) /* Try as uppercase, if username wasn't originally uppercase */ strupper_m(user2); if(strcmp(user, user2) != 0) { - DEBUG(5,("Trying _Get_Pwnam(), username as uppercase is %s\n", user2)); + DEBUG(5,("Trying _Get_Pwnam(), username as uppercase is %s\n", + user2)); ret = getpwnam_alloc(user2); if(ret) goto done; @@ -283,11 +285,14 @@ static struct passwd *Get_Pwnam_internals(const char *user, char *user2) /* Try all combinations up to usernamelevel */ strlower_m(user2); - DEBUG(5,("Checking combinations of %d uppercase letters in %s\n", lp_usernamelevel(), user2)); - ret = uname_string_combinations(user2, getpwnam_alloc, lp_usernamelevel()); + DEBUG(5,("Checking combinations of %d uppercase letters in %s\n", + lp_usernamelevel(), user2)); + ret = uname_string_combinations(user2, getpwnam_alloc, + lp_usernamelevel()); done: - DEBUG(5,("Get_Pwnam_internals %s find user [%s]!\n",ret ? "did":"didn't", user)); + DEBUG(5,("Get_Pwnam_internals %s find user [%s]!\n",ret ? + "did":"didn't", user)); return ret; } @@ -402,7 +407,8 @@ static BOOL user_in_netgroup_list(const char *user, const char *ngname) Check if a user is in a winbind group. ****************************************************************************/ -static BOOL user_in_winbind_group_list(const char *user, const char *gname, BOOL *winbind_answered) +static BOOL user_in_winbind_group_list(const char *user, const char *gname, + BOOL *winbind_answered) { int i; gid_t gid, gid_low, gid_high; @@ -414,13 +420,14 @@ static BOOL user_in_winbind_group_list(const char *user, const char *gname, BOOL *winbind_answered = False; if ((gid = nametogid(gname)) == (gid_t)-1) { - DEBUG(0,("user_in_winbind_group_list: nametogid for group %s failed.\n", - gname )); + DEBUG(0,("user_in_winbind_group_list: nametogid for group %s " + "failed.\n", gname )); goto err; } if (!lp_idmap_gid(&gid_low, &gid_high)) { - DEBUG(4, ("winbind gid range not configured, therefore %s cannot be a winbind group\n", gname)); + DEBUG(4, ("winbind gid range not configured, therefore %s " + "cannot be a winbind group\n", gname)); goto err; } @@ -460,7 +467,8 @@ static BOOL user_in_winbind_group_list(const char *user, const char *gname, BOOL } else - DEBUG(10,("user_in_winbind_group_list: using cached user groups for [%s]\n", user)); + DEBUG(10,("user_in_winbind_group_list: using cached user " + "groups for [%s]\n", user)); if ( DEBUGLEVEL >= 10 ) { DEBUG(10,("user_in_winbind_group_list: using groups -- ")); @@ -470,8 +478,9 @@ static BOOL user_in_winbind_group_list(const char *user, const char *gname, BOOL } /* - * Now we have the gid list for this user - convert the gname - * to a gid_t via either winbind or the local UNIX lookup and do the comparison. + * Now we have the gid list for this user - convert the gname to a + * gid_t via either winbind or the local UNIX lookup and do the + * comparison. */ for (i = 0; i < num_groups; i++) { @@ -502,7 +511,8 @@ BOOL user_in_unix_group_list(const char *user,const char *gname) struct sys_userlist *user_list; struct sys_userlist *member; - DEBUG(10,("user_in_unix_group_list: checking user %s in group %s\n", user, gname)); + DEBUG(10,("user_in_unix_group_list: checking user %s in group %s\n", + user, gname)); /* * We need to check the users primary group as this @@ -511,20 +521,22 @@ BOOL user_in_unix_group_list(const char *user,const char *gname) if (pass) { if (strequal(gname,gidtoname(pass->pw_gid))) { - DEBUG(10,("user_in_unix_group_list: group %s is primary group.\n", gname )); + DEBUG(10,("user_in_unix_group_list: group %s is " + "primary group.\n", gname )); return True; } } user_list = get_users_in_group(gname); if (user_list == NULL) { - DEBUG(10,("user_in_unix_group_list: no such group %s\n", gname )); + DEBUG(10,("user_in_unix_group_list: no such group %s\n", + gname )); return False; } for (member = user_list; member; member = member->next) { - DEBUG(10,("user_in_unix_group_list: checking user %s against member %s\n", - user, member->unix_name )); + DEBUG(10,("user_in_unix_group_list: checking user %s against " + "member %s\n", user, member->unix_name )); if (strequal(member->unix_name,user)) { free_userlist(user_list); return(True); @@ -539,7 +551,8 @@ BOOL user_in_unix_group_list(const char *user,const char *gname) Check if a user is in a group list. Ask winbind first, then use UNIX. ****************************************************************************/ -BOOL user_in_group_list(const char *user, const char *gname, gid_t *groups, size_t n_groups) +BOOL user_in_group_list(const char *user, const char *gname, gid_t *groups, + size_t n_groups) { BOOL winbind_answered = False; BOOL ret; @@ -566,7 +579,8 @@ BOOL user_in_group_list(const char *user, const char *gname, gid_t *groups, size ret = user_in_unix_group_list(user, gname); if (ret) - DEBUG(10,("user_in_group_list: user |%s| is in group |%s|\n", user, gname)); + DEBUG(10,("user_in_group_list: user |%s| is in group |%s|\n", + user, gname)); return ret; } @@ -575,7 +589,8 @@ BOOL user_in_group_list(const char *user, const char *gname, gid_t *groups, size and netgroup lists. ****************************************************************************/ -BOOL user_in_list(const char *user,const char **list, gid_t *groups, size_t n_groups) +BOOL user_in_list(const char *user,const char **list, gid_t *groups, + size_t n_groups) { if (!list || !*list) return False; @@ -584,7 +599,8 @@ BOOL user_in_list(const char *user,const char **list, gid_t *groups, size_t n_gr while (*list) { - DEBUG(10,("user_in_list: checking user |%s| against |%s|\n", user, *list)); + DEBUG(10,("user_in_list: checking user |%s| against |%s|\n", + user, *list)); /* * Check raw username. @@ -604,7 +620,8 @@ BOOL user_in_list(const char *user,const char **list, gid_t *groups, size_t n_gr */ if(user_in_netgroup_list(user, *list +1)) return True; - if(user_in_group_list(user, *list +1, groups, n_groups)) + if(user_in_group_list(user, *list +1, groups, + n_groups)) return True; } else if (**list == '+') { @@ -612,7 +629,8 @@ BOOL user_in_list(const char *user,const char **list, gid_t *groups, size_t n_gr /* * Search UNIX list followed by netgroup. */ - if(user_in_group_list(user, *list +2, groups, n_groups)) + if(user_in_group_list(user, *list +2, groups, + n_groups)) return True; if(user_in_netgroup_list(user, *list +2)) return True; @@ -623,7 +641,8 @@ BOOL user_in_list(const char *user,const char **list, gid_t *groups, size_t n_gr * Just search UNIX list. */ - if(user_in_group_list(user, *list +1, groups, n_groups)) + if(user_in_group_list(user, *list +1, groups, + n_groups)) return True; } @@ -635,7 +654,8 @@ BOOL user_in_list(const char *user,const char **list, gid_t *groups, size_t n_gr */ if(user_in_netgroup_list(user, *list +2)) return True; - if(user_in_group_list(user, *list +2, groups, n_groups)) + if(user_in_group_list(user, *list +2, groups, + n_groups)) return True; } else { /* @@ -646,8 +666,8 @@ BOOL user_in_list(const char *user,const char **list, gid_t *groups, size_t n_gr } } else if (!name_is_local(*list)) { /* - * If user name did not match and token is not - * a unix group and the token has a winbind separator in the + * If user name did not match and token is not a unix + * group and the token has a winbind separator in the * name then see if it is a Windows group. */ @@ -657,31 +677,42 @@ BOOL user_in_list(const char *user,const char **list, gid_t *groups, size_t n_gr BOOL ret; fstring groupname, domain; - /* Parse a string of the form DOMAIN/user into a domain and a user */ + /* Parse a string of the form DOMAIN/user into a + * domain and a user */ char *p = strchr(*list,*lp_winbind_separator()); - DEBUG(10,("user_in_list: checking if user |%s| is in winbind group |%s|\n", user, *list)); + DEBUG(10,("user_in_list: checking if user |%s| is in " + "winbind group |%s|\n", user, *list)); if (p) { fstrcpy(groupname, p+1); fstrcpy(domain, *list); domain[PTR_DIFF(p, *list)] = 0; - /* Check to see if name is a Windows group; Win2k native mode DCs - will return domain local groups; while NT4 or mixed mode 2k DCs - will not */ + /* Check to see if name is a Windows group; + Win2k native mode DCs will return domain + local groups; while NT4 or mixed mode 2k + DCs will not */ - if ( winbind_lookup_name(domain, groupname, &g_sid, &name_type) + if ( winbind_lookup_name(domain, groupname, + &g_sid, &name_type) && ( name_type==SID_NAME_DOM_GRP || - (strequal(lp_workgroup(), domain) && name_type==SID_NAME_ALIAS) ) ) + (strequal(lp_workgroup(), domain) && + name_type==SID_NAME_ALIAS) ) ) { - /* Check if user name is in the Windows group */ - ret = user_in_winbind_group_list(user, *list, &winbind_answered); + /* Check if user name is in the + * Windows group */ + ret = user_in_winbind_group_list( + user, *list, + &winbind_answered); if (winbind_answered && ret == True) { - DEBUG(10,("user_in_list: user |%s| is in winbind group |%s|\n", user, *list)); + DEBUG(10,("user_in_list: user " + "|%s| is in winbind " + "group |%s|\n", + user, *list)); return ret; } } diff --git a/source/lib/util_file.c b/source/lib/util_file.c index 963d610beff..407a8b24fc9 100644 --- a/source/lib/util_file.c +++ b/source/lib/util_file.c @@ -525,7 +525,7 @@ static char **file_lines_parse(char *p, size_t size, int *numlines) char **file_lines_load(const char *fname, int *numlines) { char *p; - size_t size; + size_t size = 0; p = file_load(fname, &size); if (!p) { diff --git a/source/lib/util_sock.c b/source/lib/util_sock.c index 6562dae952b..91c3305996e 100644 --- a/source/lib/util_sock.c +++ b/source/lib/util_sock.c @@ -181,6 +181,9 @@ static const smb_socket_option socket_options[] = { #ifdef SO_RCVTIMEO {"SO_RCVTIMEO", SOL_SOCKET, SO_RCVTIMEO, 0, OPT_INT}, #endif +#ifdef TCP_FASTACK + {"TCP_FASTACK", IPPROTO_TCP, TCP_FASTACK, 0, OPT_INT}, +#endif {NULL,0,0,0,0}}; /**************************************************************************** diff --git a/source/libads/ads_ldap.c b/source/libads/ads_ldap.c index ae86ef0b764..fea4cd0fd09 100644 --- a/source/libads/ads_ldap.c +++ b/source/libads/ads_ldap.c @@ -56,7 +56,7 @@ ADS_STATUS ads_sid_to_dn(ADS_STRUCT *ads, goto done; } - rc = ads_search_retry(ads, (void **)&msg, ldap_exp, attr); + rc = ads_search_retry(ads, (void **)(void *)&msg, ldap_exp, attr); if (!ADS_ERR_OK(rc)) { DEBUG(1,("ads_sid_to_dn ads_search: %s\n", ads_errstr(rc))); diff --git a/source/libads/ldap.c b/source/libads/ldap.c index 2123d5b55c5..dc93bd556c7 100644 --- a/source/libads/ldap.c +++ b/source/libads/ldap.c @@ -1165,7 +1165,7 @@ uint32 ads_get_kvno(ADS_STRUCT *ads, const char *machine_name) if (asprintf(&filter, "(samAccountName=%s$)", machine_name) == -1) { return kvno; } - ret = ads_search(ads, (void**) &res, filter, attrs); + ret = ads_search(ads, (void**)(void *)&res, filter, attrs); SAFE_FREE(filter); if (!ADS_ERR_OK(ret) && ads_count_replies(ads, res)) { DEBUG(1,("ads_get_kvno: Computer Account For %s not found.\n", machine_name)); @@ -1219,7 +1219,7 @@ ADS_STATUS ads_clear_service_principal_names(ADS_STRUCT *ads, const char *machin ADS_STATUS ret = ADS_ERROR(LDAP_SUCCESS); char *dn_string = NULL; - ret = ads_find_machine_acct(ads, (void **)&res, machine_name); + ret = ads_find_machine_acct(ads, (void **)(void *)&res, machine_name); if (!ADS_ERR_OK(ret) || ads_count_replies(ads, res) != 1) { DEBUG(5,("ads_clear_service_principal_names: WARNING: Host Account for %s not found... skipping operation.\n", machine_name)); DEBUG(5,("ads_clear_service_principal_names: WARNING: Service Principals for %s have NOT been cleared.\n", machine_name)); @@ -1287,7 +1287,7 @@ ADS_STATUS ads_add_service_principal_name(ADS_STRUCT *ads, const char *machine_n char *dn_string = NULL; const char *servicePrincipalName[4] = {NULL, NULL, NULL, NULL}; - ret = ads_find_machine_acct(ads, (void **)&res, machine_name); + ret = ads_find_machine_acct(ads, (void **)(void *)&res, machine_name); if (!ADS_ERR_OK(ret) || ads_count_replies(ads, res) != 1) { DEBUG(1,("ads_add_service_principal_name: WARNING: Host Account for %s not found... skipping operation.\n", machine_name)); @@ -1401,7 +1401,7 @@ static ADS_STATUS ads_add_machine_acct(ADS_STRUCT *ads, const char *machine_name name_to_fqdn(my_fqdn, machine_name); - status = ads_find_machine_acct(ads, (void **)&res, machine_name); + status = ads_find_machine_acct(ads, (void **)(void *)&res, machine_name); if (ADS_ERR_OK(status) && ads_count_replies(ads, res) == 1) { char *dn_string = ads_get_dn(ads, res); if (!dn_string) { @@ -1774,7 +1774,7 @@ ADS_STATUS ads_join_realm(ADS_STRUCT *ads, const char *machine_name, return status; } - status = ads_find_machine_acct(ads, (void **)&res, machine); + status = ads_find_machine_acct(ads, (void **)(void *)&res, machine); if (!ADS_ERR_OK(status)) { DEBUG(0, ("ads_join_realm: Host account test failed for machine %s\n", machine)); SAFE_FREE(machine); @@ -1800,8 +1800,9 @@ ADS_STATUS ads_leave_realm(ADS_STRUCT *ads, const char *hostname) char *hostnameDN, *host; int rc; LDAPControl ldap_control; - LDAPControl * pldap_control[] = {&ldap_control, 0}; + LDAPControl * pldap_control[2] = {NULL, NULL}; + pldap_control[0] = &ldap_control; memset(&ldap_control, 0, sizeof(LDAPControl)); ldap_control.ldctl_oid = (char *)LDAP_SERVER_TREE_DELETE_OID; diff --git a/source/libads/ldap_user.c b/source/libads/ldap_user.c index 56a0d8013b2..3ff6acc9e83 100644 --- a/source/libads/ldap_user.c +++ b/source/libads/ldap_user.c @@ -65,7 +65,7 @@ ADS_STATUS ads_add_user_acct(ADS_STRUCT *ads, const char *user, if (!(new_dn = talloc_asprintf(ctx, "cn=%s,%s,%s", name, container, ads->config.bind_path))) goto done; - if (!(controlstr = talloc_asprintf(ctx, "%u", UF_NORMAL_ACCOUNT))) + if (!(controlstr = talloc_asprintf(ctx, "%u", (UF_NORMAL_ACCOUNT | UF_ACCOUNTDISABLE)))) goto done; if (!(mods = ads_init_mods(ctx))) goto done; diff --git a/source/libsmb/clikrb5.c b/source/libsmb/clikrb5.c index 67e9f539adf..e0dcefeb1d7 100644 --- a/source/libsmb/clikrb5.c +++ b/source/libsmb/clikrb5.c @@ -456,6 +456,7 @@ static krb5_error_code ads_krb5_mk_req(krb5_context context, krb5_creds creds; krb5_data in_data; BOOL creds_ready = False; + int i = 0, maxtries = 3; retval = krb5_parse_name(context, principal, &server); if (retval) { @@ -479,7 +480,7 @@ static krb5_error_code ads_krb5_mk_req(krb5_context context, goto cleanup_creds; } - while(!creds_ready) { + while (!creds_ready && (i < maxtries)) { if ((retval = krb5_get_credentials(context, 0, ccache, &creds, &credsp))) { DEBUG(1,("ads_krb5_mk_req: krb5_get_credentials failed for %s (%s)\n", @@ -497,6 +498,8 @@ static krb5_error_code ads_krb5_mk_req(krb5_context context, if (!ads_cleanup_expired_creds(context, ccache, credsp)) creds_ready = True; + + i++; } DEBUG(10,("ads_krb5_mk_req: Ticket (%s) in ccache (%s) is valid until: (%s - %u)\n", @@ -767,7 +770,6 @@ static krb5_enctype get_enctype_from_ap_req(krb5_ap_req *ap_req) static krb5_error_code get_key_from_keytab(krb5_context context, - krb5_keytab keytab, krb5_const_principal server, krb5_enctype enctype, krb5_kvno kvno, @@ -775,13 +777,18 @@ get_key_from_keytab(krb5_context context, { krb5_keytab_entry entry; krb5_error_code ret; - krb5_keytab real_keytab; + krb5_keytab keytab; char *name = NULL; - if (keytab == NULL) { - krb5_kt_default(context, &real_keytab); - } else { - real_keytab = keytab; + /* We have to open a new keytab handle here, as MIT does + an implicit open/getnext/close on krb5_kt_get_entry. We + may be in the middle of a keytab enumeration when this is + called. JRA. */ + + ret = krb5_kt_default(context, &keytab); + if (ret) { + DEBUG(0,("get_key_from_keytab: failed to open keytab: %s\n", error_message(ret))); + return ret; } if ( DEBUGLEVEL >= 10 ) { @@ -792,7 +799,7 @@ get_key_from_keytab(krb5_context context, } ret = krb5_kt_get_entry(context, - real_keytab, + keytab, server, kvno, enctype, @@ -819,10 +826,7 @@ get_key_from_keytab(krb5_context context, smb_krb5_kt_free_entry(context, &entry); out: - if (keytab == NULL) { - krb5_kt_close(context, real_keytab); - } - + krb5_kt_close(context, keytab); return ret; } @@ -913,7 +917,6 @@ krb5_error_code decode_krb5_ap_req(const krb5_data *code, krb5_ap_req **rep); } ret = get_key_from_keytab(context, - keytab, server, enctype, kvno, diff --git a/source/libsmb/clispnego.c b/source/libsmb/clispnego.c index 6340a9bdcd4..cc481a066ab 100644 --- a/source/libsmb/clispnego.c +++ b/source/libsmb/clispnego.c @@ -260,7 +260,7 @@ BOOL parse_negTokenTarg(DATA_BLOB blob, char *OIDs[ASN1_MAX_OIDS], DATA_BLOB *se /* generate a krb5 GSS-API wrapper packet given a ticket */ -DATA_BLOB spnego_gen_krb5_wrap(DATA_BLOB ticket, const uint8 tok_id[2]) +DATA_BLOB spnego_gen_krb5_wrap(const DATA_BLOB ticket, const uint8 tok_id[2]) { ASN1_DATA data; DATA_BLOB ret; diff --git a/source/libsmb/nmblib.c b/source/libsmb/nmblib.c index 164f85be7bf..4d84d7bc499 100644 --- a/source/libsmb/nmblib.c +++ b/source/libsmb/nmblib.c @@ -331,7 +331,7 @@ static int put_nmb_name(char *buf,int offset,struct nmb_name *name) Useful for debugging messages. ******************************************************************/ -char *nmb_namestr(struct nmb_name *n) +char *nmb_namestr(const struct nmb_name *n) { static int i=0; static fstring ret[4]; diff --git a/source/libsmb/ntlmssp.c b/source/libsmb/ntlmssp.c index 0becc7fdee3..c891ede9bb7 100644 --- a/source/libsmb/ntlmssp.c +++ b/source/libsmb/ntlmssp.c @@ -384,6 +384,11 @@ static void ntlmssp_handle_neg_flags(struct ntlmssp_state *ntlmssp_state, void ntlmssp_weaken_keys(NTLMSSP_STATE *ntlmssp_state) { + /* Nothing to weaken. We certainly don't want to 'extend' the length... */ + if (ntlmssp_state->session_key.length < 8) { + return; + } + /* Key weakening not performed on the master key for NTLM2 and does not occour for NTLM1. Therefore we only need to do this for the LM_KEY. diff --git a/source/libsmb/ntlmssp_sign.c b/source/libsmb/ntlmssp_sign.c index e41cd6437c2..cc6323718b3 100644 --- a/source/libsmb/ntlmssp_sign.c +++ b/source/libsmb/ntlmssp_sign.c @@ -139,7 +139,7 @@ NTSTATUS ntlmssp_sign_packet(NTLMSSP_STATE *ntlmssp_state, { NTSTATUS nt_status; - if (!ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_SIGN) { + if (!(ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_SIGN)) { DEBUG(3, ("NTLMSSP Signing not negotiated - cannot sign packet!\n")); return NT_STATUS_INVALID_PARAMETER; } @@ -238,7 +238,7 @@ NTSTATUS ntlmssp_seal_packet(NTLMSSP_STATE *ntlmssp_state, { NTSTATUS nt_status; - if (!ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_SEAL) { + if (!(ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_SEAL)) { DEBUG(3, ("NTLMSSP Sealing not negotiated - cannot seal packet!\n")); return NT_STATUS_INVALID_PARAMETER; } diff --git a/source/libsmb/samlogon_cache.c b/source/libsmb/samlogon_cache.c index d0469a1a481..ef60055cf47 100644 --- a/source/libsmb/samlogon_cache.c +++ b/source/libsmb/samlogon_cache.c @@ -150,8 +150,12 @@ BOOL netsamlogon_cache_store( const char *username, NET_USER_INFO_3 *user ) prs_init( &ps, RPC_MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); - if ( !prs_uint32( "timestamp", &ps, 0, (uint32*)&t ) ) - return False; + { + uint32 ts; + if ( !prs_uint32( "timestamp", &ps, 0, &ts ) ) + return False; + t = (time_t)ts; + } if ( net_io_user_info3("", user, &ps, 0, 3, 0) ) { diff --git a/source/libsmb/smbencrypt.c b/source/libsmb/smbencrypt.c index f99e48a0b9c..99f99f23f8c 100644 --- a/source/libsmb/smbencrypt.c +++ b/source/libsmb/smbencrypt.c @@ -542,7 +542,7 @@ void sess_crypt_blob(DATA_BLOB *out, const DATA_BLOB *in, const DATA_BLOB *sessi for (i=0,k=0; i<in->length; i += 8, k += 7) { - uint8_t bin[8], bout[8], key[7]; + uint8 bin[8], bout[8], key[7]; memset(bin, 0, 8); memcpy(bin, &in->data[i], MIN(8, in->length-i)); diff --git a/source/modules/vfs_full_audit.c b/source/modules/vfs_full_audit.c index d9d898dc0ea..52e245a1763 100644 --- a/source/modules/vfs_full_audit.c +++ b/source/modules/vfs_full_audit.c @@ -35,6 +35,9 @@ * full_audit:success = open opendir * full_audit:failure = all * + * vfs op can be "all" which means log all operations. + * vfs op can be "none" which means no logging. + * * This leads to syslog entries of the form: * smbd_audit: nobody|192.168.234.1|opendir|ok|. * smbd_audit: nobody|192.168.234.1|open|fail (File not found)|r|x.txt @@ -61,6 +64,11 @@ extern struct current_user current_user; static int vfs_full_audit_debug_level = DBGC_VFS; +struct vfs_full_audit_private_data { + struct bitmap *success_ops; + struct bitmap *failure_ops; +}; + #undef DBGC_CLASS #define DBGC_CLASS vfs_full_audit_debug_level @@ -662,24 +670,33 @@ static char *audit_prefix(connection_struct *conn) return prefix; } -static struct bitmap *success_ops = NULL; - -static BOOL log_success(vfs_op_type op) +static BOOL log_success(vfs_handle_struct *handle, vfs_op_type op) { - if (success_ops == NULL) + struct vfs_full_audit_private_data *pd = NULL; + + SMB_VFS_HANDLE_GET_DATA(handle, pd, + struct vfs_full_audit_private_data, + return True); + + if (pd->success_ops == NULL) { return True; + } - return bitmap_query(success_ops, op); + return bitmap_query(pd->success_ops, op); } -static struct bitmap *failure_ops = NULL; - -static BOOL log_failure(vfs_op_type op) +static BOOL log_failure(vfs_handle_struct *handle, vfs_op_type op) { - if (failure_ops == NULL) + struct vfs_full_audit_private_data *pd = NULL; + + SMB_VFS_HANDLE_GET_DATA(handle, pd, + struct vfs_full_audit_private_data, + return True); + + if (pd->failure_ops == NULL) return True; - return bitmap_query(failure_ops, op); + return bitmap_query(pd->failure_ops, op); } static void init_bitmap(struct bitmap **bm, const char **ops) @@ -706,6 +723,10 @@ static void init_bitmap(struct bitmap **bm, const char **ops) break; } + if (strequal(*ops, "none")) { + break; + } + for (i=0; i<SMB_VFS_OP_LAST; i++) { if (vfs_op_names[i].name == NULL) { smb_panic("vfs_full_audit.c: name table not " @@ -747,10 +768,10 @@ static void do_log(vfs_op_type op, BOOL success, vfs_handle_struct *handle, pstring op_msg; va_list ap; - if (success && (!log_success(op))) + if (success && (!log_success(handle, op))) return; - if (!success && (!log_failure(op))) + if (!success && (!log_failure(handle, op))) return; if (success) @@ -768,6 +789,22 @@ static void do_log(vfs_op_type op, BOOL success, vfs_handle_struct *handle, return; } +/* Free function for the private data. */ + +static void free_private_data(void **p_data) +{ + struct vfs_full_audit_private_data *pd = *(struct vfs_full_audit_private_data **)p_data; + + if (pd->success_ops) { + bitmap_free(pd->success_ops); + } + if (pd->failure_ops) { + bitmap_free(pd->failure_ops); + } + SAFE_FREE(pd); + *p_data = NULL; +} + /* Implementation of vfs_ops. Pass everything on to the default operation but log event first. */ @@ -775,18 +812,29 @@ static int smb_full_audit_connect(vfs_handle_struct *handle, connection_struct * const char *svc, const char *user) { int result; + struct vfs_full_audit_private_data *pd = NULL; const char *none[] = { NULL }; const char *all [] = { "all" }; + pd = SMB_MALLOC_P(struct vfs_full_audit_private_data); + if (!pd) { + return -1; + } + ZERO_STRUCTP(pd); + openlog("smbd_audit", 0, audit_syslog_facility(handle)); - init_bitmap(&success_ops, + init_bitmap(&pd->success_ops, lp_parm_string_list(SNUM(conn), "full_audit", "success", none)); - init_bitmap(&failure_ops, + init_bitmap(&pd->failure_ops, lp_parm_string_list(SNUM(conn), "full_audit", "failure", all)); + /* Store the private data. */ + SMB_VFS_HANDLE_SET_DATA(handle, pd, free_private_data, + struct vfs_full_audit_private_data, return -1); + result = SMB_VFS_NEXT_CONNECT(handle, conn, svc, user); do_log(SMB_VFS_OP_CONNECT, True, handle, @@ -803,11 +851,8 @@ static void smb_full_audit_disconnect(vfs_handle_struct *handle, do_log(SMB_VFS_OP_DISCONNECT, True, handle, "%s", lp_servicename(SNUM(conn))); - bitmap_free(success_ops); - success_ops = NULL; - - bitmap_free(failure_ops); - failure_ops = NULL; + /* The bitmaps will be disconnected when the private + data is deleted. */ return; } @@ -2003,4 +2048,3 @@ NTSTATUS vfs_full_audit_init(void) return ret; } - diff --git a/source/nmbd/nmbd.c b/source/nmbd/nmbd.c index 01fdb8e74cf..e9d7f8d1851 100644 --- a/source/nmbd/nmbd.c +++ b/source/nmbd/nmbd.c @@ -657,13 +657,14 @@ static BOOL open_sockets(BOOL isdaemon, int port) pstring logfile; static BOOL opt_interactive; poptContext pc; + static char *p_lmhosts = dyn_LMHOSTSFILE; struct poptOption long_options[] = { POPT_AUTOHELP {"daemon", 'D', POPT_ARG_VAL, &is_daemon, True, "Become a daemon(default)" }, {"interactive", 'i', POPT_ARG_VAL, &opt_interactive, True, "Run interactive (not a daemon)" }, {"foreground", 'F', POPT_ARG_VAL, &Fork, False, "Run daemon in foreground (for daemontools & etc)" }, {"log-stdout", 'S', POPT_ARG_VAL, &log_stdout, True, "Log to stdout" }, - {"hosts", 'H', POPT_ARG_STRING, dyn_LMHOSTSFILE, 'H', "Load a netbios hosts file"}, + {"hosts", 'H', POPT_ARG_STRING, &p_lmhosts, 'H', "Load a netbios hosts file"}, {"port", 'p', POPT_ARG_INT, &global_nmb_port, NMB_PORT, "Listen on the specified port" }, POPT_COMMON_SAMBA { NULL } @@ -773,7 +774,10 @@ static BOOL open_sockets(BOOL isdaemon, int port) pidfile_create("nmbd"); message_init(); message_register(MSG_FORCE_ELECTION, nmbd_message_election); +#if 0 + /* Until winsrepl is done. */ message_register(MSG_WINS_NEW_ENTRY, nmbd_wins_new_entry); +#endif message_register(MSG_SHUTDOWN, nmbd_terminate); message_register(MSG_SMB_CONF_UPDATED, msg_reload_nmbd_services); message_register(MSG_SEND_PACKET, msg_nmbd_send_packet); @@ -798,8 +802,8 @@ static BOOL open_sockets(BOOL isdaemon, int port) } /* Load in any static local names. */ - load_lmhosts_file(dyn_LMHOSTSFILE); - DEBUG(3,("Loaded hosts file %s\n", dyn_LMHOSTSFILE)); + load_lmhosts_file(p_lmhosts); + DEBUG(3,("Loaded hosts file %s\n", p_lmhosts)); /* If we are acting as a WINS server, initialise data structures. */ if( !initialise_wins() ) { diff --git a/source/nsswitch/wbinfo.c b/source/nsswitch/wbinfo.c index aae76e44238..f3819b6f519 100644 --- a/source/nsswitch/wbinfo.c +++ b/source/nsswitch/wbinfo.c @@ -45,7 +45,7 @@ static char winbind_separator_int(BOOL strict) if (winbindd_request_response(WINBINDD_INFO, NULL, &response) != NSS_STATUS_SUCCESS) { - d_printf("could not obtain winbind separator!\n"); + d_fprintf(stderr, "could not obtain winbind separator!\n"); if (strict) { return -1; } @@ -57,7 +57,7 @@ static char winbind_separator_int(BOOL strict) got_sep = True; if (!sep) { - d_printf("winbind separator was NULL!\n"); + d_fprintf(stderr, "winbind separator was NULL!\n"); if (strict) { return -1; } @@ -84,7 +84,7 @@ static const char *get_winbind_domain(void) if (winbindd_request_response(WINBINDD_DOMAIN_NAME, NULL, &response) != NSS_STATUS_SUCCESS) { - d_printf("could not obtain winbind domain name!\n"); + d_fprintf(stderr, "could not obtain winbind domain name!\n"); /* HACK: (this module should not call lp_ funtions) */ return lp_workgroup(); @@ -199,7 +199,7 @@ static BOOL wbinfo_get_userdomgroups(const char *user_sid) return False; if (response.data.num_entries != 0) - printf("%s", (char *)response.extra_data); + d_printf("%s", (char *)response.extra_data); SAFE_FREE(response.extra_data); @@ -227,7 +227,7 @@ static BOOL wbinfo_wins_byname(char *name) /* Display response */ - printf("%s\n", response.data.winsresp); + d_printf("%s\n", response.data.winsresp); return True; } @@ -253,7 +253,7 @@ static BOOL wbinfo_wins_byip(char *ip) /* Display response */ - printf("%s\n", response.data.winsresp); + d_printf("%s\n", response.data.winsresp); return True; } @@ -282,7 +282,7 @@ static BOOL wbinfo_list_domains(void) while(next_token(&extra_data, name, "\n", sizeof(fstring))) { p = strchr(name, '\\'); if (p == 0) { - d_printf("Got invalid response: %s\n", + d_fprintf(stderr, "Got invalid response: %s\n", extra_data); return False; } @@ -379,7 +379,7 @@ static BOOL wbinfo_getdcname(const char *domain_name) if (winbindd_request_response(WINBINDD_GETDCNAME, &request, &response) != NSS_STATUS_SUCCESS) { - d_printf("Could not get dc name for %s\n", domain_name); + d_fprintf(stderr, "Could not get dc name for %s\n", domain_name); return False; } @@ -405,7 +405,7 @@ static BOOL wbinfo_check_secret(void) (result == NSS_STATUS_SUCCESS) ? "succeeded" : "failed"); if (result != NSS_STATUS_SUCCESS) - d_printf("error code was %s (0x%x)\n", + d_fprintf(stderr, "error code was %s (0x%x)\n", response.data.auth.nt_status_string, response.data.auth.nt_status); @@ -607,7 +607,7 @@ static BOOL wbinfo_auth(char *username) (result == NSS_STATUS_SUCCESS) ? "succeeded" : "failed"); if (response.data.auth.nt_status) - d_printf("error code was %s (0x%x)\nerror messsage was: %s\n", + d_fprintf(stderr, "error code was %s (0x%x)\nerror messsage was: %s\n", response.data.auth.nt_status_string, response.data.auth.nt_status, response.data.auth.error_string); @@ -707,7 +707,7 @@ static BOOL wbinfo_auth_crap(char *username) (result == NSS_STATUS_SUCCESS) ? "succeeded" : "failed"); if (response.data.auth.nt_status) - d_printf("error code was %s (0x%x)\nerror messsage was: %s\n", + d_fprintf(stderr, "error code was %s (0x%x)\nerror messsage was: %s\n", response.data.auth.nt_status_string, response.data.auth.nt_status, response.data.auth.error_string); @@ -751,7 +751,7 @@ static BOOL wbinfo_klog(char *username) (result == NSS_STATUS_SUCCESS) ? "succeeded" : "failed"); if (response.data.auth.nt_status) - d_printf("error code was %s (0x%x)\nerror messsage was: %s\n", + d_fprintf(stderr, "error code was %s (0x%x)\nerror messsage was: %s\n", response.data.auth.nt_status_string, response.data.auth.nt_status, response.data.auth.error_string); @@ -760,12 +760,12 @@ static BOOL wbinfo_klog(char *username) return False; if (response.extra_data == NULL) { - d_printf("Did not get token data\n"); + d_fprintf(stderr, "Did not get token data\n"); return False; } if (!afs_settoken_str((char *)response.extra_data)) { - d_printf("Could not set token\n"); + d_fprintf(stderr, "Could not set token\n"); return False; } @@ -1022,6 +1022,7 @@ int main(int argc, char **argv) }; /* Samba client initialisation */ + load_case_tables(); if (!lp_load(dyn_CONFIGFILE, True, False, False)) { d_fprintf(stderr, "wbinfo: error opening config file %s. Error was %s\n", @@ -1058,114 +1059,114 @@ int main(int argc, char **argv) switch (opt) { case 'u': if (!print_domain_users(opt_domain_name)) { - d_printf("Error looking up domain users\n"); + d_fprintf(stderr, "Error looking up domain users\n"); goto done; } break; case 'g': if (!print_domain_groups(opt_domain_name)) { - d_printf("Error looking up domain groups\n"); + d_fprintf(stderr, "Error looking up domain groups\n"); goto done; } break; case 's': if (!wbinfo_lookupsid(string_arg)) { - d_printf("Could not lookup sid %s\n", string_arg); + d_fprintf(stderr, "Could not lookup sid %s\n", string_arg); goto done; } break; case 'n': if (!wbinfo_lookupname(string_arg)) { - d_printf("Could not lookup name %s\n", string_arg); + d_fprintf(stderr, "Could not lookup name %s\n", string_arg); goto done; } break; case 'N': if (!wbinfo_wins_byname(string_arg)) { - d_printf("Could not lookup WINS by name %s\n", string_arg); + d_fprintf(stderr, "Could not lookup WINS by name %s\n", string_arg); goto done; } break; case 'I': if (!wbinfo_wins_byip(string_arg)) { - d_printf("Could not lookup WINS by IP %s\n", string_arg); + d_fprintf(stderr, "Could not lookup WINS by IP %s\n", string_arg); goto done; } break; case 'U': if (!wbinfo_uid_to_sid(int_arg)) { - d_printf("Could not convert uid %d to sid\n", int_arg); + d_fprintf(stderr, "Could not convert uid %d to sid\n", int_arg); goto done; } break; case 'G': if (!wbinfo_gid_to_sid(int_arg)) { - d_printf("Could not convert gid %d to sid\n", + d_fprintf(stderr, "Could not convert gid %d to sid\n", int_arg); goto done; } break; case 'S': if (!wbinfo_sid_to_uid(string_arg)) { - d_printf("Could not convert sid %s to uid\n", + d_fprintf(stderr, "Could not convert sid %s to uid\n", string_arg); goto done; } break; case 'Y': if (!wbinfo_sid_to_gid(string_arg)) { - d_printf("Could not convert sid %s to gid\n", + d_fprintf(stderr, "Could not convert sid %s to gid\n", string_arg); goto done; } break; case 'A': if (!wbinfo_allocate_rid()) { - d_printf("Could not allocate a RID\n"); + d_fprintf(stderr, "Could not allocate a RID\n"); goto done; } break; case 't': if (!wbinfo_check_secret()) { - d_printf("Could not check secret\n"); + d_fprintf(stderr, "Could not check secret\n"); goto done; } break; case 'm': if (!wbinfo_list_domains()) { - d_printf("Could not list trusted domains\n"); + d_fprintf(stderr, "Could not list trusted domains\n"); goto done; } break; case OPT_SEQUENCE: if (!wbinfo_show_sequence(opt_domain_name)) { - d_printf("Could not show sequence numbers\n"); + d_fprintf(stderr, "Could not show sequence numbers\n"); goto done; } break; case 'D': if (!wbinfo_domain_info(string_arg)) { - d_printf("Could not get domain info\n"); + d_fprintf(stderr, "Could not get domain info\n"); goto done; } break; case 'r': if (!wbinfo_get_usergroups(string_arg)) { - d_printf("Could not get groups for user %s\n", + d_fprintf(stderr, "Could not get groups for user %s\n", string_arg); goto done; } break; case OPT_USERSIDS: if (!wbinfo_get_usersids(string_arg)) { - d_printf("Could not get group SIDs for user SID %s\n", + d_fprintf(stderr, "Could not get group SIDs for user SID %s\n", string_arg); goto done; } break; case OPT_USERDOMGROUPS: if (!wbinfo_get_userdomgroups(string_arg)) { - d_printf("Could not get user's domain groups " + d_fprintf(stderr, "Could not get user's domain groups " "for user SID %s\n", string_arg); goto done; } @@ -1174,13 +1175,13 @@ int main(int argc, char **argv) BOOL got_error = False; if (!wbinfo_auth(string_arg)) { - d_printf("Could not authenticate user %s with " + d_fprintf(stderr, "Could not authenticate user %s with " "plaintext password\n", string_arg); got_error = True; } if (!wbinfo_auth_crap(string_arg)) { - d_printf("Could not authenticate user %s with " + d_fprintf(stderr, "Could not authenticate user %s with " "challenge/response\n", string_arg); got_error = True; } @@ -1191,29 +1192,37 @@ int main(int argc, char **argv) } case 'k': if (!wbinfo_klog(string_arg)) { - d_printf("Could not klog user\n"); + d_fprintf(stderr, "Could not klog user\n"); goto done; } break; case 'p': if (!wbinfo_ping()) { - d_printf("could not ping winbindd!\n"); + d_fprintf(stderr, "Could not ping winbindd!\n"); goto done; } break; case OPT_SET_AUTH_USER: - wbinfo_set_auth_user(string_arg); + if (!wbinfo_set_auth_user(string_arg)) { + goto done; + } break; case OPT_GET_AUTH_USER: wbinfo_get_auth_user(); break; case OPT_GETDCNAME: - wbinfo_getdcname(string_arg); + if (!wbinfo_getdcname(string_arg)) { + goto done; + } break; - case OPT_SEPARATOR: - d_printf("%c\n", winbind_separator_int(True)); + case OPT_SEPARATOR: { + const char sep = winbind_separator_int(True); + if (sep == -1) { + goto done; + } + d_printf("%c\n", sep); break; - + } /* generic configuration options */ case OPT_DOMAIN_NAME: break; diff --git a/source/nsswitch/winbind_nss_config.h b/source/nsswitch/winbind_nss_config.h index 77d1dbe26e0..a3243b99e30 100644 --- a/source/nsswitch/winbind_nss_config.h +++ b/source/nsswitch/winbind_nss_config.h @@ -139,4 +139,8 @@ typedef int BOOL; #define S_ISSOCK(mode) ((mode & S_IFSOCK) == S_IFSOCK) #endif +#ifndef HAVE_SOCKLEN_T_TYPE +typedef int socklen_t; +#endif + #endif diff --git a/source/nsswitch/winbind_nss_solaris.c b/source/nsswitch/winbind_nss_solaris.c index 8076c043e04..b94b444fb4c 100644 --- a/source/nsswitch/winbind_nss_solaris.c +++ b/source/nsswitch/winbind_nss_solaris.c @@ -25,6 +25,8 @@ Boston, MA 02111-1307, USA. */ +#undef DEVELOPER + #include <stdlib.h> #include <sys/types.h> #include <sys/param.h> diff --git a/source/nsswitch/winbindd_pam.c b/source/nsswitch/winbindd_pam.c index e683f397b66..5f1d37751df 100644 --- a/source/nsswitch/winbindd_pam.c +++ b/source/nsswitch/winbindd_pam.c @@ -634,7 +634,8 @@ enum winbindd_result winbindd_dual_pam_auth_crap(struct winbindd_domain *domain, contact_domain->dcname, name_user, name_domain, - global_myname(), + /* Bug #3248 - found by Stefan Burkei. */ + workstation, /* We carefully set this above so use it... */ state->request.data.auth_crap.chal, lm_resp, nt_resp, diff --git a/source/param/loadparm.c b/source/param/loadparm.c index cdef0340618..526bce9b60e 100644 --- a/source/param/loadparm.c +++ b/source/param/loadparm.c @@ -2532,7 +2532,7 @@ BOOL lp_add_home(const char *pszHomename, int iDefaultService, string_set(&ServicePtrs[i]->comment, comment); } - /* set the browseable flag from the gloabl default */ + /* set the browseable flag from the global default */ ServicePtrs[i]->bBrowseable = sDefault.bBrowseable; @@ -4098,6 +4098,28 @@ static void lp_save_defaults(void) Set the server type we will announce as via nmbd. ********************************************************************/ +static const struct srv_role_tab { + uint32 role; + const char *role_str; +} srv_role_tab [] = { + { ROLE_STANDALONE, "ROLE_STANDALONE" }, + { ROLE_DOMAIN_MEMBER, "ROLE_DOMAIN_MEMBER" }, + { ROLE_DOMAIN_BDC, "ROLE_DOMAIN_BDC" }, + { ROLE_DOMAIN_PDC, "ROLE_DOMAIN_PDC" }, + { 0, NULL } +}; + +const char* server_role_str(uint32 role) +{ + int i = 0; + for (i=0; srv_role_tab[i].role_str; i++) { + if (role == srv_role_tab[i].role) { + return srv_role_tab[i].role_str; + } + } + return NULL; +} + static void set_server_role(void) { server_role = ROLE_STANDALONE; @@ -4141,22 +4163,7 @@ static void set_server_role(void) break; } - DEBUG(10, ("set_server_role: role = ")); - - switch(server_role) { - case ROLE_STANDALONE: - DEBUGADD(10, ("ROLE_STANDALONE\n")); - break; - case ROLE_DOMAIN_MEMBER: - DEBUGADD(10, ("ROLE_DOMAIN_MEMBER\n")); - break; - case ROLE_DOMAIN_BDC: - DEBUGADD(10, ("ROLE_DOMAIN_BDC\n")); - break; - case ROLE_DOMAIN_PDC: - DEBUGADD(10, ("ROLE_DOMAIN_PDC\n")); - break; - } + DEBUG(10, ("set_server_role: role = %s\n", server_role_str(server_role))); } /*********************************************************** diff --git a/source/passdb/passdb.c b/source/passdb/passdb.c index e073db3499c..20aa4e04f2f 100644 --- a/source/passdb/passdb.c +++ b/source/passdb/passdb.c @@ -2383,13 +2383,16 @@ BOOL pdb_increment_bad_password_count(SAM_ACCOUNT *sampass) { uint32 account_policy_lockout; BOOL autolock_updated = False, badpw_updated = False; + BOOL ret; if (!sampass) return False; /* Retrieve the account lockout policy */ - if (!pdb_get_account_policy(AP_BAD_ATTEMPT_LOCKOUT, - &account_policy_lockout)) { + become_root(); + ret = pdb_get_account_policy(AP_BAD_ATTEMPT_LOCKOUT, &account_policy_lockout); + unbecome_root(); + if ( !ret ) { DEBUG(0, ("pdb_increment_bad_password_count: pdb_get_account_policy failed.\n")); return False; } diff --git a/source/passdb/pdb_sql.c b/source/passdb/pdb_sql.c index f52888bfa91..f4f6e0112ae 100644 --- a/source/passdb/pdb_sql.c +++ b/source/passdb/pdb_sql.c @@ -536,13 +536,12 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const if (query->update) { query->part1[strlen(query->part1) - 1] = '\0'; - query->part1 = - talloc_asprintf_append(query->part1, - " WHERE %s = '%s'", - config_value_read(location, - "user sid column", - CONFIG_USER_SID_DEFAULT), - sid_to_string(sid_str, pdb_get_user_sid (newpwd))); + query->part1 = talloc_asprintf( + mem_ctx, "%s WHERE %s = '%s'", query->part1, + config_value_read(location, + "user sid column", + CONFIG_USER_SID_DEFAULT), + sid_to_string(sid_str, pdb_get_user_sid (newpwd))); } else { query->part2[strlen(query->part2) - 1] = ')'; query->part1[strlen(query->part1) - 1] = ')'; diff --git a/source/passdb/secrets.c b/source/passdb/secrets.c index 35ccb2c725b..c173a5ea868 100644 --- a/source/passdb/secrets.c +++ b/source/passdb/secrets.c @@ -138,7 +138,7 @@ BOOL secrets_fetch_domain_sid(const char *domain, DOM_SID *sid) { DOM_SID *dyn_sid; fstring key; - size_t size; + size_t size = 0; slprintf(key, sizeof(key)-1, "%s/%s", SECRETS_DOMAIN_SID, domain); strupper_m(key); @@ -147,8 +147,7 @@ BOOL secrets_fetch_domain_sid(const char *domain, DOM_SID *sid) if (dyn_sid == NULL) return False; - if (size != sizeof(DOM_SID)) - { + if (size != sizeof(DOM_SID)) { SAFE_FREE(dyn_sid); return False; } @@ -171,7 +170,7 @@ BOOL secrets_fetch_domain_guid(const char *domain, struct uuid *guid) { struct uuid *dyn_guid; fstring key; - size_t size; + size_t size = 0; struct uuid new_guid; slprintf(key, sizeof(key)-1, "%s/%s", SECRETS_DOMAIN_GUID, domain); @@ -187,8 +186,7 @@ BOOL secrets_fetch_domain_guid(const char *domain, struct uuid *guid) return False; } - if (size != sizeof(struct uuid)) - { + if (size != sizeof(struct uuid)) { DEBUG(1,("UUID size %d is wrong!\n", (int)size)); SAFE_FREE(dyn_guid); return False; @@ -276,7 +274,7 @@ BOOL secrets_fetch_trust_account_password(const char *domain, uint8 ret_pwd[16], { struct machine_acct_pass *pass; char *plaintext; - size_t size; + size_t size = 0; plaintext = secrets_fetch_machine_password(domain, pass_last_set_time, channel); @@ -326,7 +324,7 @@ BOOL secrets_fetch_trusted_domain_password(const char *domain, char** pwd, DOM_SID *sid, time_t *pass_last_set_time) { struct trusted_dom_pass pass; - size_t size; + size_t size = 0; /* unpacking structures */ char* pass_buf; @@ -361,7 +359,7 @@ BOOL secrets_fetch_trusted_domain_password(const char *domain, char** pwd, if (pass_last_set_time) *pass_last_set_time = pass.mod_time; /* domain sid */ - sid_copy(sid, &pass.domain_sid); + if (sid != NULL) sid_copy(sid, &pass.domain_sid); return True; } @@ -599,7 +597,7 @@ BOOL secrets_store_ldap_pw(const char* dn, char* pw) BOOL fetch_ldap_pw(char **dn, char** pw) { char *key = NULL; - size_t size; + size_t size = 0; *dn = smb_xstrdup(lp_ldap_admin_dn()); @@ -682,7 +680,7 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, unsigned in char *pattern; unsigned int start_idx; uint32 idx = 0; - size_t size, packed_size = 0; + size_t size = 0, packed_size = 0; fstring dom_name; char *packed_pass; struct trusted_dom_pass *pass = TALLOC_ZERO_P(ctx, struct trusted_dom_pass); @@ -877,7 +875,7 @@ BOOL secrets_fetch_afs_key(const char *cell, struct afs_key *result) { fstring key; struct afs_keyfile *keyfile; - size_t size; + size_t size = 0; uint32 i; slprintf(key, sizeof(key)-1, "%s/%s", SECRETS_AFS_KEYFILE, cell); diff --git a/source/printing/nt_printing.c b/source/printing/nt_printing.c index 09775e60c8c..3649da1ac05 100644 --- a/source/printing/nt_printing.c +++ b/source/printing/nt_printing.c @@ -3279,6 +3279,8 @@ WERROR delete_all_printer_data( NT_PRINTER_INFO_LEVEL_2 *p2, const char *key ) TALLOC_FREE( data ); + p2->data = NULL; + DEBUG(8,("delete_all_printer_data: Removed all Printer Data from printer [%s]\n", p2->printername )); diff --git a/source/profile/profile.c b/source/profile/profile.c index 0cf8c8e15bf..838383b1afe 100644 --- a/source/profile/profile.c +++ b/source/profile/profile.c @@ -44,7 +44,7 @@ struct timeval profile_endtime_nested; /**************************************************************************** receive a set profile level message ****************************************************************************/ -void profile_message(int msg_type, pid_t src, void *buf, size_t len) +void profile_message(int msg_type, struct process_id src, void *buf, size_t len) { int level; @@ -54,21 +54,25 @@ void profile_message(int msg_type, pid_t src, void *buf, size_t len) case 0: /* turn off profiling */ do_profile_flag = False; do_profile_times = False; - DEBUG(1,("INFO: Profiling turned OFF from pid %d\n", (int)src)); + DEBUG(1,("INFO: Profiling turned OFF from pid %d\n", + (int)procid_to_pid(&src))); break; case 1: /* turn on counter profiling only */ do_profile_flag = True; do_profile_times = False; - DEBUG(1,("INFO: Profiling counts turned ON from pid %d\n", (int)src)); + DEBUG(1,("INFO: Profiling counts turned ON from pid %d\n", + (int)procid_to_pid(&src))); break; case 2: /* turn on complete profiling */ do_profile_flag = True; do_profile_times = True; - DEBUG(1,("INFO: Full profiling turned ON from pid %d\n", (int)src)); + DEBUG(1,("INFO: Full profiling turned ON from pid %d\n", + (int)procid_to_pid(&src))); break; case 3: /* reset profile values */ memset((char *)profile_p, 0, sizeof(*profile_p)); - DEBUG(1,("INFO: Profiling values cleared from pid %d\n", (int)src)); + DEBUG(1,("INFO: Profiling values cleared from pid %d\n", + (int)procid_to_pid(&src))); break; } #else /* WITH_PROFILE */ diff --git a/source/python/setup.py b/source/python/setup.py index 18f1f2648ab..ffdafd70877 100755 --- a/source/python/setup.py +++ b/source/python/setup.py @@ -63,8 +63,10 @@ for lib in string.split(samba_libs): next_is_flag = 0; elif lib == "-Wl,-rpath": next_is_path = 1; - elif lib[0:2] in ("-l","-pthread"): + elif lib[0:2] in ("-l"): libraries.append(lib[2:]) + elif lib[0:8] in ("-pthread"): + pass # Skip linker flags elif lib[0:2] == "-L": library_dirs.append(lib[2:]) elif lib[0:2] in ("-W","-s"): diff --git a/source/rpc_client/cli_netlogon.c b/source/rpc_client/cli_netlogon.c index e3cc97cdc6b..b5addf33751 100644 --- a/source/rpc_client/cli_netlogon.c +++ b/source/rpc_client/cli_netlogon.c @@ -604,15 +604,12 @@ NTSTATUS rpccli_netlogon_sam_sync(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c creds_client_step(cli->dc, &clnt_creds); - prs_set_session_key(&qbuf, (const char *)cli->dc->sess_key); - prs_set_session_key(&rbuf, (const char *)cli->dc->sess_key); - init_net_q_sam_sync(&q, cli->dc->remote_machine, global_myname(), &clnt_creds, &ret_creds, database_id, next_rid); /* Marshall data and send request */ - CLI_DO_RPC(cli, mem_ctx, PI_NETLOGON, NET_SAM_SYNC, + CLI_DO_RPC_COPY_SESS_KEY(cli, mem_ctx, PI_NETLOGON, NET_SAM_SYNC, q, r, qbuf, rbuf, net_io_q_sam_sync, diff --git a/source/rpc_parse/parse_net.c b/source/rpc_parse/parse_net.c index ce2a085f478..3bd6977dbb1 100644 --- a/source/rpc_parse/parse_net.c +++ b/source/rpc_parse/parse_net.c @@ -3317,7 +3317,7 @@ BOOL net_io_r_dsr_getdcname(const char *desc, NET_R_DSR_GETDCNAME *r_t, if (!prs_uint32("ptr_dc_address", ps, depth, &r_t->ptr_dc_address)) return False; - if (!prs_uint32("dc_address_type", ps, depth, &r_t->dc_address_type)) + if (!prs_int32("dc_address_type", ps, depth, &r_t->dc_address_type)) return False; if (!smb_io_uuid("domain_guid", &r_t->domain_guid, ps, depth)) diff --git a/source/rpc_parse/parse_prs.c b/source/rpc_parse/parse_prs.c index 77f0e6d5c88..7c84ee800b9 100644 --- a/source/rpc_parse/parse_prs.c +++ b/source/rpc_parse/parse_prs.c @@ -708,6 +708,35 @@ BOOL prs_uint32(const char *name, prs_struct *ps, int depth, uint32 *data32) } /******************************************************************* + Stream an int32. + ********************************************************************/ + +BOOL prs_int32(const char *name, prs_struct *ps, int depth, int32 *data32) +{ + char *q = prs_mem_get(ps, sizeof(int32)); + if (q == NULL) + return False; + + if (UNMARSHALLING(ps)) { + if (ps->bigendian_data) + *data32 = RIVALS(q,0); + else + *data32 = IVALS(q,0); + } else { + if (ps->bigendian_data) + RSIVALS(q,0,*data32); + else + SIVALS(q,0,*data32); + } + + DEBUG(5,("%s%04x %s: %08x\n", tab_depth(depth), ps->data_offset, name, *data32)); + + ps->data_offset += sizeof(int32); + + return True; +} + +/******************************************************************* Stream a NTSTATUS ********************************************************************/ diff --git a/source/rpc_parse/parse_samr.c b/source/rpc_parse/parse_samr.c index 0a055ff826a..6c2b4f4ea71 100644 --- a/source/rpc_parse/parse_samr.c +++ b/source/rpc_parse/parse_samr.c @@ -5183,6 +5183,39 @@ static BOOL sam_io_user_info7(const char *desc, SAM_USER_INFO_7 * usr, } /******************************************************************* +inits a SAM_USER_INFO_9 structure. +********************************************************************/ + +void init_sam_user_info9(SAM_USER_INFO_9 * usr, uint32 rid_group) +{ + DEBUG(5, ("init_sam_user_info9\n")); + + usr->rid_group = rid_group; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +static BOOL sam_io_user_info9(const char *desc, SAM_USER_INFO_9 * usr, + prs_struct *ps, int depth) +{ + if (usr == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_r_user_info9"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("rid_group", ps, depth, &usr->rid_group)) + return False; + + return True; +} + +/******************************************************************* inits a SAM_USER_INFO_16 structure. ********************************************************************/ @@ -6354,6 +6387,15 @@ static BOOL samr_io_userinfo_ctr(const char *desc, SAM_USERINFO_CTR **ppctr, } ret = sam_io_user_info7("", ctr->info.id7, ps, depth); break; + case 9: + if (UNMARSHALLING(ps)) + ctr->info.id9 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_9,1); + if (ctr->info.id9 == NULL) { + DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n")); + return False; + } + ret = sam_io_user_info9("", ctr->info.id9, ps, depth); + break; case 16: if (UNMARSHALLING(ps)) ctr->info.id16 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_16,1); diff --git a/source/rpc_parse/parse_svcctl.c b/source/rpc_parse/parse_svcctl.c index dd0c68bd797..2cb44c63195 100644 --- a/source/rpc_parse/parse_svcctl.c +++ b/source/rpc_parse/parse_svcctl.c @@ -1029,6 +1029,109 @@ BOOL svcctl_io_r_unlock_service_db(const char *desc, SVCCTL_R_UNLOCK_SERVICE_DB return True; } +/******************************************************************* +********************************************************************/ + +BOOL svcctl_io_q_query_service_sec(const char *desc, SVCCTL_Q_QUERY_SERVICE_SEC *q_u, prs_struct *ps, int depth) +{ + if (q_u == NULL) + return False; + + prs_debug(ps, depth, desc, "svcctl_io_q_query_service_sec"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!smb_io_pol_hnd("handle", &q_u->handle, ps, depth)) + return False; + if(!prs_uint32("security_flags", ps, depth, &q_u->security_flags)) + return False; + if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size)) + return False; + + return True; + +} + +/******************************************************************* +********************************************************************/ + +BOOL svcctl_io_r_query_service_sec(const char *desc, SVCCTL_R_QUERY_SERVICE_SEC *r_u, prs_struct *ps, int depth) +{ + if ( !r_u ) + return False; + + prs_debug(ps, depth, desc, "svcctl_io_r_query_service_sec"); + depth++; + + if(!prs_align(ps)) + return False; + + if (!prs_rpcbuffer("buffer", ps, depth, &r_u->buffer)) + return False; + + if(!prs_uint32("needed", ps, depth, &r_u->needed)) + return False; + + if(!prs_werror("status", ps, depth, &r_u->status)) + return False; + + return True; +} + +/******************************************************************* +********************************************************************/ + +BOOL svcctl_io_q_set_service_sec(const char *desc, SVCCTL_Q_SET_SERVICE_SEC *q_u, prs_struct *ps, int depth) +{ + if (q_u == NULL) + return False; + + prs_debug(ps, depth, desc, "svcctl_io_q_set_service_sec"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!smb_io_pol_hnd("handle", &q_u->handle, ps, depth)) + return False; + if(!prs_uint32("security_flags", ps, depth, &q_u->security_flags)) + return False; + + if (!prs_rpcbuffer("buffer", ps, depth, &q_u->buffer)) + return False; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size)) + return False; + + return True; + +} + +/******************************************************************* +********************************************************************/ + +BOOL svcctl_io_r_set_service_sec(const char *desc, SVCCTL_R_SET_SERVICE_SEC *r_u, prs_struct *ps, int depth) +{ + if ( !r_u ) + return False; + + prs_debug(ps, depth, desc, "svcctl_io_r_set_service_sec"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_werror("status", ps, depth, &r_u->status)) + return False; + + return True; +} + diff --git a/source/rpc_server/srv_eventlog_nt.c b/source/rpc_server/srv_eventlog_nt.c index 658928b9270..a8b9c66717e 100644 --- a/source/rpc_server/srv_eventlog_nt.c +++ b/source/rpc_server/srv_eventlog_nt.c @@ -56,7 +56,7 @@ static EVENTLOG_INFO *find_eventlog_info_by_hnd( pipes_struct * p, { EVENTLOG_INFO *info; - if ( !find_policy_by_hnd( p, handle, ( void ** ) &info ) ) { + if ( !find_policy_by_hnd( p, handle, (void **)(void *)&info ) ) { DEBUG( 2, ( "find_eventlog_info_by_hnd: eventlog not found.\n" ) ); return NULL; diff --git a/source/rpc_server/srv_reg_nt.c b/source/rpc_server/srv_reg_nt.c index 35a060c38e3..33711d0fac9 100644 --- a/source/rpc_server/srv_reg_nt.c +++ b/source/rpc_server/srv_reg_nt.c @@ -54,7 +54,7 @@ static REGISTRY_KEY *find_regkey_index_by_hnd(pipes_struct *p, POLICY_HND *hnd) { REGISTRY_KEY *regkey = NULL; - if(!find_policy_by_hnd(p,hnd,(void **)®key)) { + if(!find_policy_by_hnd(p,hnd,(void **)(void *)®key)) { DEBUG(2,("find_regkey_index_by_hnd: Registry Key not found: ")); return NULL; } diff --git a/source/rpc_server/srv_spoolss_nt.c b/source/rpc_server/srv_spoolss_nt.c index f0ba863b4d7..334158bbbd2 100644 --- a/source/rpc_server/srv_spoolss_nt.c +++ b/source/rpc_server/srv_spoolss_nt.c @@ -267,7 +267,7 @@ static Printer_entry *find_printer_index_by_hnd(pipes_struct *p, POLICY_HND *hnd { Printer_entry *find_printer = NULL; - if(!find_policy_by_hnd(p,hnd,(void **)&find_printer)) { + if(!find_policy_by_hnd(p,hnd,(void **)(void *)&find_printer)) { DEBUG(2,("find_printer_index_by_hnd: Printer handle not found: ")); return NULL; } diff --git a/source/rpc_server/srv_srvsvc_nt.c b/source/rpc_server/srv_srvsvc_nt.c index 090aa4c9ff2..65e0504e678 100644 --- a/source/rpc_server/srv_srvsvc_nt.c +++ b/source/rpc_server/srv_srvsvc_nt.c @@ -1,9 +1,9 @@ - /* - * Unix SMB/CIFS implementation. +/* + * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, - * Copyright (C) Jeremy Allison 2001. - * Copyright (C) Nigel Williams 2001. + * Copyright (C) Jeremy Allison 2001. + * Copyright (C) Nigel Williams 2001. * * 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 @@ -109,6 +109,8 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int sn pstring remark; pstring path; pstring passwd; + int max_connections = lp_max_connections(snum); + uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff; char *net_name = lp_servicename(snum); pstrcpy(remark, lp_comment(snum)); @@ -125,7 +127,7 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int sn pstrcpy(passwd, ""); - init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd); + init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), remark, 0, max_uses, 1, path, passwd); init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd); } @@ -1539,6 +1541,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op = False; + int max_connections = 0; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -1583,6 +1586,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname)); type = q_u->info.share.info2.info_2.type; + max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; psd = NULL; break; #if 0 @@ -1651,15 +1655,16 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /* Only call modify function if something changed. */ - if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) + if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) + || (lp_max_connections(snum) != max_connections) ) { if (!lp_change_share_cmd() || !*lp_change_share_cmd()) { DEBUG(10,("_srv_net_share_set_info: No change share command\n")); return WERR_ACCESS_DENIED; } - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections ); DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); @@ -1706,7 +1711,8 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S } /******************************************************************* - Net share add. Call 'add_share_command "sharename" "pathname" "comment" "read only = xxx"' + Net share add. Call 'add_share_command "sharename" "pathname" + "comment" "max connections = " ********************************************************************/ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) @@ -1723,6 +1729,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; + int max_connections = 0; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1751,6 +1758,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S unistr2_to_ascii(share_name, &q_u->info.share.info2.info_2_str.uni_netname, sizeof(share_name)); unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name)); unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name)); + max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; type = q_u->info.share.info2.info_2.type; break; case 501: @@ -1787,9 +1795,8 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return WERR_INVALID_NAME; } - if ( strequal(share_name,"IPC$") - || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) - || strequal(share_name,"global") ) + if ( strequal(share_name,"IPC$") || strequal(share_name,"global") + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) ) { return WERR_ACCESS_DENIED; } @@ -1813,8 +1820,13 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S string_replace(path, '"', ' '); string_replace(comment, '"', ' '); - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_add_share_cmd(), dyn_CONFIGFILE, share_name, path, comment); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_add_share_cmd(), + dyn_CONFIGFILE, + share_name, + path, + comment, + max_connections); DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); @@ -1951,16 +1963,17 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET TIME_OF_DAY_INFO *tod; struct tm *t; time_t unixdate = time(NULL); + /* We do this call first as if we do it *after* the gmtime call it overwrites the pointed-to values. JRA */ + uint32 zone = get_time_zone(unixdate)/60; - tod = TALLOC_P(p->mem_ctx, TIME_OF_DAY_INFO); - if (!tod) + DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); + + if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) ) return WERR_NOMEM; - ZERO_STRUCTP(tod); - r_u->tod = tod; r_u->ptr_srv_tod = 0x1; r_u->status = WERR_OK; @@ -2312,11 +2325,7 @@ WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV switch ( q_u->type ) { case 0x9: - /* Run the name through alpha_strcpy() to remove any unsafe - shell characters. Compare the copied string with the original - and fail if the strings don't match */ - - unistr2_to_ascii(sharename, &q_u->uni_name, sizeof(sharename)); + rpcstr_pull(sharename, q_u->uni_name.buffer, sizeof(sharename), q_u->uni_name.uni_str_len*2, 0); if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) { DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename)); return WERR_INVALID_NAME; diff --git a/source/rpc_server/srv_svcctl.c b/source/rpc_server/srv_svcctl.c index 31d8bbe9b3d..74ae3aaa16f 100644 --- a/source/rpc_server/srv_svcctl.c +++ b/source/rpc_server/srv_svcctl.c @@ -358,6 +358,54 @@ static BOOL api_svcctl_unlock_service_db(pipes_struct *p) return True; } +/******************************************************************* + ********************************************************************/ + +static BOOL api_svcctl_query_security_sec(pipes_struct *p) +{ + SVCCTL_Q_QUERY_SERVICE_SEC q_u; + SVCCTL_R_QUERY_SERVICE_SEC r_u; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; + + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + if(!svcctl_io_q_query_service_sec("", &q_u, data, 0)) + return False; + + r_u.status = _svcctl_query_service_sec(p, &q_u, &r_u); + + if(!svcctl_io_r_query_service_sec("", &r_u, rdata, 0)) + return False; + + return True; +} + +/******************************************************************* + ********************************************************************/ + +static BOOL api_svcctl_set_security_sec(pipes_struct *p) +{ + SVCCTL_Q_SET_SERVICE_SEC q_u; + SVCCTL_R_SET_SERVICE_SEC r_u; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; + + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + if(!svcctl_io_q_set_service_sec("", &q_u, data, 0)) + return False; + + r_u.status = _svcctl_set_service_sec(p, &q_u, &r_u); + + if(!svcctl_io_r_set_service_sec("", &r_u, rdata, 0)) + return False; + + return True; +} + /******************************************************************* \PIPE\svcctl commands @@ -378,7 +426,9 @@ static struct api_struct api_svcctl_cmds[] = { "SVCCTL_CONTROL_SERVICE" , SVCCTL_CONTROL_SERVICE , api_svcctl_control_service }, { "SVCCTL_QUERY_SERVICE_STATUSEX_W" , SVCCTL_QUERY_SERVICE_STATUSEX_W , api_svcctl_query_service_status_ex }, { "SVCCTL_LOCK_SERVICE_DB" , SVCCTL_LOCK_SERVICE_DB , api_svcctl_lock_service_db }, - { "SVCCTL_UNLOCK_SERVICE_DB" , SVCCTL_UNLOCK_SERVICE_DB , api_svcctl_unlock_service_db } + { "SVCCTL_UNLOCK_SERVICE_DB" , SVCCTL_UNLOCK_SERVICE_DB , api_svcctl_unlock_service_db }, + { "SVCCTL_QUERY_SERVICE_SEC" , SVCCTL_QUERY_SERVICE_SEC , api_svcctl_query_security_sec }, + { "SVCCTL_SET_SERVICE_SEC" , SVCCTL_SET_SERVICE_SEC , api_svcctl_set_security_sec } }; diff --git a/source/rpc_server/srv_svcctl_nt.c b/source/rpc_server/srv_svcctl_nt.c index 9212fe6136a..049bdf60756 100644 --- a/source/rpc_server/srv_svcctl_nt.c +++ b/source/rpc_server/srv_svcctl_nt.c @@ -186,7 +186,7 @@ static SERVICE_INFO *find_service_info_by_hnd(pipes_struct *p, POLICY_HND *hnd) { SERVICE_INFO *service_info = NULL; - if( !find_policy_by_hnd( p, hnd, (void **)&service_info) ) { + if( !find_policy_by_hnd( p, hnd, (void **)(void *)&service_info) ) { DEBUG(2,("find_service_info_by_hnd: handle not found")); return NULL; } @@ -771,3 +771,100 @@ WERROR _svcctl_unlock_service_db( pipes_struct *p, SVCCTL_Q_UNLOCK_SERVICE_DB *q return close_policy_hnd( p, &q_u->h_lock) ? WERR_OK : WERR_BADFID; } + +/******************************************************************** +********************************************************************/ + +WERROR _svcctl_query_service_sec( pipes_struct *p, SVCCTL_Q_QUERY_SERVICE_SEC *q_u, SVCCTL_R_QUERY_SERVICE_SEC *r_u ) +{ + SERVICE_INFO *info = find_service_info_by_hnd( p, &q_u->handle ); + SEC_DESC *sec_desc; + + + /* only support the SCM and individual services */ + + if ( !info || !(info->type & (SVC_HANDLE_IS_SERVICE|SVC_HANDLE_IS_SCM)) ) + return WERR_BADFID; + + /* check access reights (according to MSDN) */ + + if ( !(info->access_granted & STD_RIGHT_READ_CONTROL_ACCESS) ) + return WERR_ACCESS_DENIED; + + /* TODO: handle something besides DACL_SECURITY_INFORMATION */ + + if ( (q_u->security_flags & DACL_SECURITY_INFORMATION) != DACL_SECURITY_INFORMATION ) + return WERR_INVALID_PARAM; + + /* lookup the security descriptor and marshall it up for a reply */ + + if ( !(sec_desc = svcctl_get_secdesc( p->mem_ctx, info->name, get_root_nt_token() )) ) + return WERR_NOMEM; + + r_u->needed = sec_desc_size( sec_desc ); + + if ( r_u->needed > q_u->buffer_size ) { + ZERO_STRUCTP( &r_u->buffer ); + return WERR_INSUFFICIENT_BUFFER; + } + + rpcbuf_init( &r_u->buffer, q_u->buffer_size, p->mem_ctx ); + + if ( !sec_io_desc("", &sec_desc, &r_u->buffer.prs, 0 ) ) + return WERR_NOMEM; + + return WERR_OK; +} + +/******************************************************************** +********************************************************************/ + +WERROR _svcctl_set_service_sec( pipes_struct *p, SVCCTL_Q_SET_SERVICE_SEC *q_u, SVCCTL_R_SET_SERVICE_SEC *r_u ) +{ + SERVICE_INFO *info = find_service_info_by_hnd( p, &q_u->handle ); + SEC_DESC *sec_desc = NULL; + uint32 required_access; + + if ( !info || !(info->type & (SVC_HANDLE_IS_SERVICE|SVC_HANDLE_IS_SCM)) ) + return WERR_BADFID; + + /* can't set the security de4scriptor on the ServiceControlManager */ + + if ( info->type == SVC_HANDLE_IS_SCM ) + return WERR_ACCESS_DENIED; + + /* check the access on the open handle */ + + switch ( q_u->security_flags ) { + case DACL_SECURITY_INFORMATION: + required_access = STD_RIGHT_WRITE_DAC_ACCESS; + break; + + case OWNER_SECURITY_INFORMATION: + case GROUP_SECURITY_INFORMATION: + required_access = STD_RIGHT_WRITE_OWNER_ACCESS; + break; + + case SACL_SECURITY_INFORMATION: + return WERR_INVALID_PARAM; + default: + return WERR_INVALID_PARAM; + } + + if ( !(info->access_granted & required_access) ) + return WERR_ACCESS_DENIED; + + /* read the security descfriptor */ + + if ( !sec_io_desc("", &sec_desc, &q_u->buffer.prs, 0 ) ) + return WERR_NOMEM; + + /* store the new SD */ + + if ( !svcctl_set_secdesc( p->mem_ctx, info->name, sec_desc, p->pipe_user.nt_user_token ) ) + return WERR_ACCESS_DENIED; + + return WERR_OK; +} + + diff --git a/source/rpcclient/cmd_lsarpc.c b/source/rpcclient/cmd_lsarpc.c index c79508de8d0..5adaf469818 100644 --- a/source/rpcclient/cmd_lsarpc.c +++ b/source/rpcclient/cmd_lsarpc.c @@ -130,8 +130,8 @@ static NTSTATUS cmd_lsa_query_info_policy(struct rpc_pipe_client *cli, printf("forest name is %s\n", forest_name); if (info_class == 12) { - printf("domain GUID is "); - smb_uuid_string_static(*dom_guid); + printf("domain GUID is %s\n", + smb_uuid_string_static(*dom_guid)); } rpccli_lsa_close(cli, mem_ctx, &pol); diff --git a/source/rpcclient/cmd_samr.c b/source/rpcclient/cmd_samr.c index 2050f2a7796..991b55a13c8 100644 --- a/source/rpcclient/cmd_samr.c +++ b/source/rpcclient/cmd_samr.c @@ -39,6 +39,14 @@ static void display_sam_user_info_7(SAM_USER_INFO_7 *usr) } /**************************************************************************** + display sam_user_info_9 structure + ****************************************************************************/ +static void display_sam_user_info_9(SAM_USER_INFO_9 *usr) +{ + printf("\tPrimary group RID :\tox%x\n", usr->rid_group); +} + +/**************************************************************************** display sam_user_info_21 structure ****************************************************************************/ static void display_sam_user_info_21(SAM_USER_INFO_21 *usr) @@ -141,27 +149,6 @@ static const char *display_time(NTTIME nttime) return (string); } -static const char* server_role_str(uint32 server_role) -{ - switch(server_role) { - case ROLE_STANDALONE: - return SMB_STRDUP("ROLE_STANDALONE"); - break; - case ROLE_DOMAIN_MEMBER: - return SMB_STRDUP("ROLE_DOMAIN_MEMBER"); - break; - case ROLE_DOMAIN_BDC: - return SMB_STRDUP("ROLE_DOMAIN_BDC"); - break; - case ROLE_DOMAIN_PDC: - return SMB_STRDUP("ROLE_DOMAIN_PDC"); - break; - default: - return SMB_STRDUP("Unknown -- internal error?"); - break; - } -} - static void display_sam_unk_info_1(SAM_UNK_INFO_1 *info1) { @@ -419,6 +406,9 @@ static NTSTATUS cmd_samr_query_user(struct rpc_pipe_client *cli, case 7: display_sam_user_info_7(user_ctr->info.id7); break; + case 9: + display_sam_user_info_9(user_ctr->info.id9); + break; default: printf("Unsupported infolevel: %d\n", info_level); break; diff --git a/source/rpcclient/cmd_srvsvc.c b/source/rpcclient/cmd_srvsvc.c index da81a82c8d5..53ee7300da3 100644 --- a/source/rpcclient/cmd_srvsvc.c +++ b/source/rpcclient/cmd_srvsvc.c @@ -433,7 +433,7 @@ static WERROR cmd_srvsvc_net_file_enum(struct rpc_pipe_client *cli, SRV_FILE_INFO_CTR ctr; WERROR result; ENUM_HND hnd; - uint32 preferred_len = 0; + uint32 preferred_len = 0xffff; if (argc > 2) { printf("Usage: %s [infolevel]\n", argv[0]); diff --git a/source/rpcclient/rpcclient.c b/source/rpcclient/rpcclient.c index 46f2df29d33..5bca67d7a63 100644 --- a/source/rpcclient/rpcclient.c +++ b/source/rpcclient/rpcclient.c @@ -704,6 +704,8 @@ out_free: POPT_TABLEEND }; + load_case_tables(); + ZERO_STRUCT(server_ip); setlinebuf(stdout); diff --git a/source/sam/idmap.c b/source/sam/idmap.c index ec3ccb29859..9fc1a573a92 100644 --- a/source/sam/idmap.c +++ b/source/sam/idmap.c @@ -120,6 +120,7 @@ BOOL idmap_init(const char **remote_backend) char *rem_backend = smb_xstrdup(*remote_backend); fstring params = ""; char *pparams; + BOOL idmap_prefix_workaround = False; /* get any mode parameters passed in */ @@ -128,6 +129,13 @@ BOOL idmap_init(const char **remote_backend) pparams++; fstrcpy( params, pparams ); } + + /* strip any leading idmap_ prefix of */ + if ( strncmp( rem_backend, "idmap_", 6) == 0 ) { + rem_backend += 6; + idmap_prefix_workaround = True; + DEBUG(0, ("idmap_init: idmap backend uses deprecated 'idmap_' prefix. Please replace 'idmap_%s' by '%s' in %s\n", rem_backend, rem_backend, dyn_CONFIGFILE)); + } DEBUG(3, ("idmap_init: using '%s' as remote backend\n", rem_backend)); @@ -140,9 +148,13 @@ BOOL idmap_init(const char **remote_backend) } } else { DEBUG(0, ("idmap_init: could not load remote backend '%s'\n", rem_backend)); + if (idmap_prefix_workaround) + rem_backend -= 6; SAFE_FREE(rem_backend); return False; } + if (idmap_prefix_workaround) + rem_backend -= 6; SAFE_FREE(rem_backend); } diff --git a/source/sam/idmap_rid.c b/source/sam/idmap_rid.c index 4a1ae141b10..eced549a557 100644 --- a/source/sam/idmap_rid.c +++ b/source/sam/idmap_rid.c @@ -555,7 +555,6 @@ static struct idmap_methods rid_methods = { NTSTATUS init_module(void) { - return smb_register_idmap(SMB_IDMAP_INTERFACE_VERSION, "idmap_rid", &rid_methods); return smb_register_idmap(SMB_IDMAP_INTERFACE_VERSION, "rid", &rid_methods); } diff --git a/source/script/mkversion.sh b/source/script/mkversion.sh index 9d919cfe34b..1ba7cd63699 100755 --- a/source/script/mkversion.sh +++ b/source/script/mkversion.sh @@ -1,5 +1,4 @@ #!/bin/sh -# VERSION_FILE=$1 OUTPUT_FILE=$2 @@ -17,16 +16,12 @@ SOURCE_DIR=$3 SAMBA_VERSION_MAJOR=`sed -n 's/^SAMBA_VERSION_MAJOR=//p' $SOURCE_DIR$VERSION_FILE` SAMBA_VERSION_MINOR=`sed -n 's/^SAMBA_VERSION_MINOR=//p' $SOURCE_DIR$VERSION_FILE` SAMBA_VERSION_RELEASE=`sed -n 's/^SAMBA_VERSION_RELEASE=//p' $SOURCE_DIR$VERSION_FILE` - SAMBA_VERSION_REVISION=`sed -n 's/^SAMBA_VERSION_REVISION=//p' $SOURCE_DIR$VERSION_FILE` - SAMBA_VERSION_PRE_RELEASE=`sed -n 's/^SAMBA_VERSION_PRE_RELEASE=//p' $SOURCE_DIR$VERSION_FILE` - SAMBA_VERSION_RC_RELEASE=`sed -n 's/^SAMBA_VERSION_RC_RELEASE=//p' $SOURCE_DIR$VERSION_FILE` - SAMBA_VERSION_IS_SVN_SNAPSHOT=`sed -n 's/^SAMBA_VERSION_IS_SVN_SNAPSHOT=//p' $SOURCE_DIR$VERSION_FILE` - SAMBA_VERSION_VENDOR_SUFFIX=`sed -n 's/^SAMBA_VERSION_VENDOR_SUFFIX=//p' $SOURCE_DIR$VERSION_FILE` +SAMBA_VENDOR_PATCH=`sed -n 's/^SAMBA_VENDOR_PATCH=//p' $SOURCE_DIR$VERSION_FILE` echo "/* Autogenerated by script/mkversion.sh */" > $OUTPUT_FILE @@ -35,13 +30,21 @@ echo "#define SAMBA_VERSION_MINOR ${SAMBA_VERSION_MINOR}" >> $OUTPUT_FILE echo "#define SAMBA_VERSION_RELEASE ${SAMBA_VERSION_RELEASE}" >> $OUTPUT_FILE +## +## start with "3.0.22" +## SAMBA_VERSION_STRING="${SAMBA_VERSION_MAJOR}.${SAMBA_VERSION_MINOR}.${SAMBA_VERSION_RELEASE}" +## +## maybe add "3.0.22a" or "3.0.22pre1" or "3.0.22rc1" +## We do not do pre or rc version on patch/letter releases +## if test -n "${SAMBA_VERSION_REVISION}";then SAMBA_VERSION_STRING="${SAMBA_VERSION_STRING}${SAMBA_VERSION_REVISION}" echo "#define SAMBA_VERSION_REVISION \"${SAMBA_VERSION_REVISION}\"" >> $OUTPUT_FILE elif test -n "${SAMBA_VERSION_PRE_RELEASE}";then + ## maybe add "3.0.22pre2" SAMBA_VERSION_STRING="${SAMBA_VERSION_STRING}pre${SAMBA_VERSION_PRE_RELEASE}" echo "#define SAMBA_VERSION_PRE_RELEASE ${SAMBA_VERSION_PRE_RELEASE}" >> $OUTPUT_FILE elif test -n "${SAMBA_VERSION_RC_RELEASE}";then @@ -49,7 +52,21 @@ elif test -n "${SAMBA_VERSION_RC_RELEASE}";then echo "#define SAMBA_VERSION_RC_RELEASE ${SAMBA_VERSION_RC_RELEASE}" >> $OUTPUT_FILE fi +## +## Add the vendor string if present +## +if test -n "${SAMBA_VERSION_VENDOR_SUFFIX}";then + echo "#define SAMBA_VERSION_VENDOR_SUFFIX ${SAMBA_VERSION_VENDOR_SUFFIX}" >> $OUTPUT_FILE + if test -n "${SAMBA_VENDOR_PATCH}";then + echo "#define SAMBA_VENDOR_PATCH ${SAMBA_VENDOR_PATCH}" >> $OUTPUT_FILE + fi +fi + + +## +## SVN revision number? +## if test x"${SAMBA_VERSION_IS_SVN_SNAPSHOT}" = x"yes";then _SAVE_LANG=${LANG} LANG="" @@ -78,10 +95,6 @@ if test x"${SAMBA_VERSION_IS_SVN_SNAPSHOT}" = x"yes";then LANG=${_SAVE_LANG} fi -if test -n "${SAMBA_VERSION_VENDOR_SUFFIX}";then - echo "#define SAMBA_VERSION_VENDOR_SUFFIX ${SAMBA_VERSION_VENDOR_SUFFIX}" >> $OUTPUT_FILE -fi - echo "#define SAMBA_VERSION_OFFICIAL_STRING \"${SAMBA_VERSION_STRING}\"" >> $OUTPUT_FILE echo "#define SAMBA_VERSION_STRING samba_version_string()" >> $OUTPUT_FILE diff --git a/source/script/tests/functions b/source/script/tests/functions index 40e185e153f..8cb8f0b1550 100644 --- a/source/script/tests/functions +++ b/source/script/tests/functions @@ -34,7 +34,7 @@ stop_smbd() ## check to see if smbd is already running check_smbd_running - if test $? == 0; then + if test $? = 0; then echo "Unable to stop smbd!" exit 2 fi @@ -74,7 +74,7 @@ stop_nmbd() ## check to see if smbd is already running kill -0 $nmbd_pid 2> /dev/null - if test $? == 0; then + if test $? = 0; then echo "Unable to stop nmbd!" exit 2 fi diff --git a/source/script/tests/runtests.sh b/source/script/tests/runtests.sh index a5dc3ecfb4a..ddaf94e8ac5 100644 --- a/source/script/tests/runtests.sh +++ b/source/script/tests/runtests.sh @@ -1,11 +1,11 @@ #!/bin/sh -if [ "x$1" == "x" ]; then +if [ "x$1" = "x" ]; then echo "$0 <directory>" exit 1 fi -if [ $# == 2 ]; then +if [ $# = 2 ]; then testnum=$2 fi @@ -49,7 +49,7 @@ export USERNAME PASSWORD ## verify that we were built with --enable-socket-wrapper ## -if test "x`smbd -b | grep SOCKET_WRAPPER`" == "x"; then +if test "x`smbd -b | grep SOCKET_WRAPPER`" = "x"; then echo "***" echo "*** You must include --enable-socket-wrapper when compiling Samba" echo "*** in order to execute 'make test'. Exiting...." diff --git a/source/services/services_db.c b/source/services/services_db.c index b3ba7fcc966..a16657c0edc 100644 --- a/source/services/services_db.c +++ b/source/services/services_db.c @@ -520,6 +520,53 @@ SEC_DESC* svcctl_get_secdesc( TALLOC_CTX *ctx, const char *name, NT_USER_TOKEN * } /******************************************************************** + Wrapper to make storing a Service sd easier +********************************************************************/ + +BOOL svcctl_set_secdesc( TALLOC_CTX *ctx, const char *name, SEC_DESC *sec_desc, NT_USER_TOKEN *token ) +{ + REGISTRY_KEY *key; + WERROR wresult; + pstring path; + REGVAL_CTR *values; + prs_struct ps; + BOOL ret = False; + + /* now add the security descriptor */ + + pstr_sprintf( path, "%s\\%s\\%s", KEY_SERVICES, name, "Security" ); + wresult = regkey_open_internal( &key, path, token, REG_KEY_ALL ); + if ( !W_ERROR_IS_OK(wresult) ) { + DEBUG(0,("svcctl_get_secdesc: key lookup failed! [%s] (%s)\n", + path, dos_errstr(wresult))); + return False; + } + + if ( !(values = TALLOC_ZERO_P( key, REGVAL_CTR )) ) { + DEBUG(0,("add_new_svc_name: talloc() failed!\n")); + regkey_close_internal( key ); + return False; + } + + /* stream the printer security descriptor */ + + prs_init( &ps, RPC_MAX_PDU_FRAG_LEN, key, MARSHALL); + + if ( sec_io_desc("sec_desc", &sec_desc, &ps, 0 ) ) { + uint32 offset = prs_offset( &ps ); + regval_ctr_addvalue( values, "Security", REG_BINARY, prs_data_p(&ps), offset ); + ret = store_reg_values( key, values ); + } + + /* cleanup */ + + prs_mem_free( &ps ); + regkey_close_internal( key); + + return ret; +} + +/******************************************************************** ********************************************************************/ char* svcctl_lookup_dispname( const char *name, NT_USER_TOKEN *token ) diff --git a/source/smbd/nttrans.c b/source/smbd/nttrans.c index 91dcc933227..72288e2c244 100644 --- a/source/smbd/nttrans.c +++ b/source/smbd/nttrans.c @@ -1288,7 +1288,6 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o if (!NT_STATUS_IS_OK(status) && (NT_STATUS_EQUAL(status,NT_STATUS_ACCESS_DENIED) || NT_STATUS_EQUAL(status,NT_STATUS_CANNOT_DELETE))) { restore_case_semantics(conn, file_attributes); - END_PROFILE(SMBntcreateX); return ERROR_NT(status); } } diff --git a/source/smbd/oplock.c b/source/smbd/oplock.c index 4a08b57866f..52a61c0061b 100644 --- a/source/smbd/oplock.c +++ b/source/smbd/oplock.c @@ -48,8 +48,9 @@ int32 get_number_of_exclusive_open_oplocks(void) BOOL oplock_message_waiting(fd_set *fds) { - if (koplocks && koplocks->msg_waiting(fds)) + if (koplocks && koplocks->msg_waiting(fds)) { return True; + } return False; } @@ -84,7 +85,7 @@ void process_kernel_oplocks(void) while (koplocks->msg_waiting(&fds)) { files_struct *fsp; - struct kernel_oplock_message msg; + char msg[MSG_SMB_KERNEL_BREAK_SIZE]; fsp = koplocks->receive_message(&fds); @@ -94,12 +95,17 @@ void process_kernel_oplocks(void) return; } - msg.dev = fsp->dev; - msg.inode = fsp->inode; - msg.file_id = fsp->file_id; + /* Put the kernel break info into the message. */ + SDEV_T_VAL(msg,0,fsp->dev); + SINO_T_VAL(msg,8,fsp->inode); + SIVAL(msg,16,fsp->file_id); + + /* Don't need to be root here as we're only ever + sending to ourselves. */ + message_send_pid(pid_to_procid(sys_getpid()), MSG_SMB_KERNEL_BREAK, - &msg, sizeof(msg), True); + &msg, MSG_SMB_KERNEL_BREAK_SIZE, True); } } @@ -110,15 +116,17 @@ void process_kernel_oplocks(void) BOOL set_file_oplock(files_struct *fsp, int oplock_type) { - if (koplocks && !koplocks->set_oplock(fsp, oplock_type)) + if (koplocks && !koplocks->set_oplock(fsp, oplock_type)) { return False; + } fsp->oplock_type = oplock_type; fsp->sent_oplock_break = NO_BREAK_SENT; - if (oplock_type == LEVEL_II_OPLOCK) + if (oplock_type == LEVEL_II_OPLOCK) { level_II_oplocks_open++; - else + } else { exclusive_oplocks_open++; + } DEBUG(5,("set_file_oplock: granted oplock on file %s, dev = %x, inode = %.0f, file_id = %lu, \ tv_sec = %x, tv_usec = %x\n", @@ -140,10 +148,11 @@ void release_file_oplock(files_struct *fsp) koplocks->release_oplock(fsp); } - if (fsp->oplock_type == LEVEL_II_OPLOCK) + if (fsp->oplock_type == LEVEL_II_OPLOCK) { level_II_oplocks_open--; - else if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) + } else if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) { exclusive_oplocks_open--; + } SMB_ASSERT(exclusive_oplocks_open>=0); SMB_ASSERT(level_II_oplocks_open>=0); @@ -160,8 +169,9 @@ void release_file_oplock(files_struct *fsp) static void downgrade_file_oplock(files_struct *fsp) { - if (koplocks) + if (koplocks) { koplocks->release_oplock(fsp); + } fsp->oplock_type = LEVEL_II_OPLOCK; exclusive_oplocks_open--; level_II_oplocks_open++; @@ -252,7 +262,7 @@ int setup_oplock_select_set( fd_set *fds) ****************************************************************************/ static char *new_break_smb_message(TALLOC_CTX *mem_ctx, - files_struct *fsp, uint8_t cmd) + files_struct *fsp, uint8 cmd) { char *result = TALLOC_ARRAY(mem_ctx, char, smb_size + 8*2 + 0); @@ -284,8 +294,9 @@ static void wait_before_sending_break(void) struct timeval cur_tv; long wait_left = (long)lp_oplock_break_wait_time(); - if (wait_left == 0) + if (wait_left == 0) { return; + } GetTimeOfDay(&cur_tv); @@ -307,7 +318,7 @@ static files_struct *initial_break_processing(SMB_DEV_T dev, SMB_INO_T inode, un files_struct *fsp = NULL; if( DEBUGLVL( 3 ) ) { - dbgtext( "initial_break_processing: called for dev = %x, inode = %.0f file_id = %lu\n", + dbgtext( "initial_break_processing: called for dev = 0x%x, inode = %.0f file_id = %lu\n", (unsigned int)dev, (double)inode, file_id); dbgtext( "Current oplocks_open (exclusive = %d, levelII = %d)\n", exclusive_oplocks_open, level_II_oplocks_open ); @@ -325,7 +336,7 @@ static files_struct *initial_break_processing(SMB_DEV_T dev, SMB_INO_T inode, un /* The file could have been closed in the meantime - return success. */ if( DEBUGLVL( 3 ) ) { dbgtext( "initial_break_processing: cannot find open file with " ); - dbgtext( "dev = %x, inode = %.0f file_id = %lu", (unsigned int)dev, + dbgtext( "dev = 0x%x, inode = %.0f file_id = %lu", (unsigned int)dev, (double)inode, file_id); dbgtext( "allowing break to succeed.\n" ); } @@ -370,7 +381,7 @@ static void oplock_timeout_handler(struct timed_event *te, static void process_oplock_break_message(int msg_type, struct process_id src, void *buf, size_t len) { - struct share_mode_entry *msg = buf; + struct share_mode_entry msg; files_struct *fsp; char *break_msg; BOOL break_to_level2 = False; @@ -381,17 +392,20 @@ static void process_oplock_break_message(int msg_type, struct process_id src, return; } - if (len != sizeof(*msg)) { + if (len != MSG_SMB_SHARE_MODE_ENTRY_SIZE) { DEBUG(0, ("Got invalid msg len %d\n", (int)len)); return; } - DEBUG(10, ("Got oplock break message from pid %d: %d/%d/%d\n", - (int)procid_to_pid(&src), (int)msg->dev, (int)msg->inode, - (int)msg->share_file_id)); + /* De-linearize incoming message. */ + message_to_share_mode_entry(&msg, buf); - fsp = initial_break_processing(msg->dev, msg->inode, - msg->share_file_id); + DEBUG(10, ("Got oplock break message from pid %d: 0x%x/%.0f/%d\n", + (int)procid_to_pid(&src), (unsigned int)msg.dev, (double)msg.inode, + (int)msg.share_file_id)); + + fsp = initial_break_processing(msg.dev, msg.inode, + msg.share_file_id); if (fsp == NULL) { /* We hit race here. Break messages are sent, and before we @@ -399,8 +413,11 @@ static void process_oplock_break_message(int msg_type, struct process_id src, * with 'ok, oplock broken' */ DEBUG(3, ("Did not find fsp\n")); become_root(); + + /* We just send the same message back. */ message_send_pid(src, MSG_SMB_BREAK_RESPONSE, - msg, sizeof(*msg), True); + buf, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True); + unbecome_root(); return; } @@ -408,21 +425,24 @@ static void process_oplock_break_message(int msg_type, struct process_id src, if (fsp->sent_oplock_break != NO_BREAK_SENT) { /* Remember we have to inform the requesting PID when the * client replies */ - msg->pid = src; - ADD_TO_ARRAY(NULL, struct share_mode_entry, *msg, + msg.pid = src; + ADD_TO_ARRAY(NULL, struct share_mode_entry, msg, &fsp->pending_break_messages, &fsp->num_pending_break_messages); return; } - if (EXCLUSIVE_OPLOCK_TYPE(msg->op_type) && + if (EXCLUSIVE_OPLOCK_TYPE(msg.op_type) && !EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) { - DEBUG(3, ("Already downgraded oplock on %.0f/%.0f: %s\n", - (double)fsp->dev, (double)fsp->inode, + DEBUG(3, ("Already downgraded oplock on 0x%x/%.0f: %s\n", + (unsigned int)fsp->dev, (double)fsp->inode, fsp->fsp_name)); become_root(); + + /* We just send the same message back. */ message_send_pid(src, MSG_SMB_BREAK_RESPONSE, - msg, sizeof(*msg), True); + buf, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True); + unbecome_root(); return; } @@ -466,8 +486,8 @@ static void process_oplock_break_message(int msg_type, struct process_id src, /* Async level2 request, don't send a reply */ fsp->sent_oplock_break = ASYNC_LEVEL_II_BREAK_SENT; } - msg->pid = src; - ADD_TO_ARRAY(NULL, struct share_mode_entry, *msg, + msg.pid = src; + ADD_TO_ARRAY(NULL, struct share_mode_entry, msg, &fsp->pending_break_messages, &fsp->num_pending_break_messages); @@ -490,7 +510,9 @@ static void process_oplock_break_message(int msg_type, struct process_id src, static void process_kernel_oplock_break(int msg_type, struct process_id src, void *buf, size_t len) { - struct kernel_oplock_message *msg = buf; + SMB_DEV_T dev; + SMB_INO_T inode; + unsigned long file_id; files_struct *fsp; char *break_msg; BOOL sign_state; @@ -500,16 +522,21 @@ static void process_kernel_oplock_break(int msg_type, struct process_id src, return; } - if (len != sizeof(*msg)) { + if (len != MSG_SMB_KERNEL_BREAK_SIZE) { DEBUG(0, ("Got invalid msg len %d\n", (int)len)); return; } - DEBUG(10, ("Got kernel oplock break message from pid %d: %d/%d/%d\n", - (int)procid_to_pid(&src), (int)msg->dev, (int)msg->inode, - (int)msg->file_id)); + /* Pull the data from the message. */ + dev = DEV_T_VAL(buf, 0); + inode = INO_T_VAL(buf, 8); + file_id = (unsigned long)IVAL(buf, 16); + + DEBUG(10, ("Got kernel oplock break message from pid %d: 0x%x/%.0f/%u\n", + (int)procid_to_pid(&src), (unsigned int)dev, (double)inode, + (unsigned int)file_id)); - fsp = initial_break_processing(msg->dev, msg->inode, msg->file_id); + fsp = initial_break_processing(dev, inode, file_id); if (fsp == NULL) { DEBUG(3, ("Got a kernel oplock break message for a file " @@ -551,9 +578,13 @@ void reply_to_oplock_break_requests(files_struct *fsp) become_root(); for (i=0; i<fsp->num_pending_break_messages; i++) { - struct share_mode_entry *msg = &fsp->pending_break_messages[i]; - message_send_pid(msg->pid, MSG_SMB_BREAK_RESPONSE, - msg, sizeof(*msg), True); + struct share_mode_entry *e = &fsp->pending_break_messages[i]; + char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE]; + + share_mode_entry_to_message(msg, e); + + message_send_pid(e->pid, MSG_SMB_BREAK_RESPONSE, + msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True); } unbecome_root(); @@ -569,46 +600,52 @@ void reply_to_oplock_break_requests(files_struct *fsp) static void process_oplock_break_response(int msg_type, struct process_id src, void *buf, size_t len) { - struct share_mode_entry *msg = buf; + struct share_mode_entry msg; if (buf == NULL) { DEBUG(0, ("Got NULL buffer\n")); return; } - if (len != sizeof(*msg)) { - DEBUG(0, ("Got invalid msg len %d\n", (int)len)); + if (len != MSG_SMB_SHARE_MODE_ENTRY_SIZE) { + DEBUG(0, ("Got invalid msg len %u\n", (unsigned int)len)); return; } - DEBUG(10, ("Got oplock break response from pid %d: %d/%d/%d mid %d\n", - (int)procid_to_pid(&src), (int)msg->dev, (int)msg->inode, - (int)msg->share_file_id, (int)msg->op_mid)); + /* De-linearize incoming message. */ + message_to_share_mode_entry(&msg, buf); + + DEBUG(10, ("Got oplock break response from pid %d: 0x%x/%.0f/%u mid %u\n", + (int)procid_to_pid(&src), (unsigned int)msg.dev, (double)msg.inode, + (unsigned int)msg.share_file_id, (unsigned int)msg.op_mid)); /* Here's the hack from open.c, store the mid in the 'port' field */ - schedule_deferred_open_smb_message(msg->op_mid); + schedule_deferred_open_smb_message(msg.op_mid); } static void process_open_retry_message(int msg_type, struct process_id src, void *buf, size_t len) { - struct share_mode_entry *msg = buf; + struct share_mode_entry msg; if (buf == NULL) { DEBUG(0, ("Got NULL buffer\n")); return; } - if (len != sizeof(*msg)) { + if (len != MSG_SMB_SHARE_MODE_ENTRY_SIZE) { DEBUG(0, ("Got invalid msg len %d\n", (int)len)); return; } - DEBUG(10, ("Got open retry msg from pid %d: %d/%d mid %d\n", - (int)procid_to_pid(&src), (int)msg->dev, (int)msg->inode, - (int)msg->op_mid)); + /* De-linearize incoming message. */ + message_to_share_mode_entry(&msg, buf); - schedule_deferred_open_smb_message(msg->op_mid); + DEBUG(10, ("Got open retry msg from pid %d: 0x%x/%.0f mid %u\n", + (int)procid_to_pid(&src), (unsigned int)msg.dev, (double)msg.inode, + (unsigned int)msg.op_mid)); + + schedule_deferred_open_smb_message(msg.op_mid); } /**************************************************************************** @@ -662,6 +699,7 @@ void release_level_2_oplocks_on_change(files_struct *fsp) for(i = 0; i < lck->num_share_modes; i++) { struct share_mode_entry *share_entry = &lck->share_modes[i]; + char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE]; /* * As there could have been multiple writes waiting at the @@ -692,9 +730,11 @@ void release_level_2_oplocks_on_change(files_struct *fsp) abort(); } + share_mode_entry_to_message(msg, share_entry); + become_root(); message_send_pid(share_entry->pid, MSG_SMB_ASYNC_LEVEL2_BREAK, - share_entry, sizeof(*share_entry), True); + msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True); unbecome_root(); } @@ -703,6 +743,44 @@ void release_level_2_oplocks_on_change(files_struct *fsp) } /**************************************************************************** + Linearize a share mode entry struct to an internal oplock break message. +****************************************************************************/ + +void share_mode_entry_to_message(char *msg, struct share_mode_entry *e) +{ + SIVAL(msg,0,(uint32)e->pid.pid); + SSVAL(msg,4,e->op_mid); + SSVAL(msg,6,e->op_type); + SIVAL(msg,8,e->access_mask); + SIVAL(msg,12,e->share_access); + SIVAL(msg,16,e->private_options); + SIVAL(msg,20,(uint32)e->time.tv_sec); + SIVAL(msg,24,(uint32)e->time.tv_usec); + SDEV_T_VAL(msg,28,e->dev); + SINO_T_VAL(msg,36,e->inode); + SIVAL(msg,44,e->share_file_id); +} + +/**************************************************************************** + De-linearize an internal oplock break message to a share mode entry struct. +****************************************************************************/ + +void message_to_share_mode_entry(struct share_mode_entry *e, char *msg) +{ + e->pid.pid = (pid_t)IVAL(msg,0); + e->op_mid = SVAL(msg,4); + e->op_type = SVAL(msg,6); + e->access_mask = IVAL(msg,8); + e->share_access = IVAL(msg,12); + e->private_options = IVAL(msg,16); + e->time.tv_sec = (time_t)IVAL(msg,20); + e->time.tv_usec = (int)IVAL(msg,24); + e->dev = DEV_T_VAL(msg,28); + e->inode = INO_T_VAL(msg,36); + e->share_file_id = (unsigned long)IVAL(msg,44); +} + +/**************************************************************************** Setup oplocks for this process. ****************************************************************************/ diff --git a/source/smbd/password.c b/source/smbd/password.c index 9ee721089c9..764fbe8a2e9 100644 --- a/source/smbd/password.c +++ b/source/smbd/password.c @@ -381,9 +381,14 @@ BOOL user_ok(const char *user,int snum, gid_t *groups, size_t n_groups) if (lp_invalid_users(snum)) { str_list_copy(&invalid, lp_invalid_users(snum)); - if (invalid && str_list_substitute(invalid, "%S", lp_servicename(snum))) { - if ( invalid && str_list_sub_basic(invalid, current_user_info.smb_name) ) { - ret = !user_in_list(user, (const char **)invalid, groups, n_groups); + if (invalid && + str_list_substitute(invalid, "%S", lp_servicename(snum))) { + if ( invalid && + str_list_sub_basic(invalid, + current_user_info.smb_name) ) { + ret = !user_in_list(user, + (const char **)invalid, + groups, n_groups); } } } @@ -392,9 +397,13 @@ BOOL user_ok(const char *user,int snum, gid_t *groups, size_t n_groups) if (ret && lp_valid_users(snum)) { str_list_copy(&valid, lp_valid_users(snum)); - if ( valid && str_list_substitute(valid, "%S", lp_servicename(snum)) ) { - if ( valid && str_list_sub_basic(valid, current_user_info.smb_name) ) { - ret = user_in_list(user, (const char **)valid, groups, n_groups); + if ( valid && + str_list_substitute(valid, "%S", lp_servicename(snum)) ) { + if ( valid && + str_list_sub_basic(valid, + current_user_info.smb_name) ) { + ret = user_in_list(user, (const char **)valid, + groups, n_groups); } } } @@ -403,8 +412,11 @@ BOOL user_ok(const char *user,int snum, gid_t *groups, size_t n_groups) if (ret && lp_onlyuser(snum)) { char **user_list = str_list_make (lp_username(snum), NULL); - if (user_list && str_list_substitute(user_list, "%S", lp_servicename(snum))) { - ret = user_in_list(user, (const char **)user_list, groups, n_groups); + if (user_list && + str_list_substitute(user_list, "%S", + lp_servicename(snum))) { + ret = user_in_list(user, (const char **)user_list, + groups, n_groups); } if (user_list) str_list_free (&user_list); } @@ -509,19 +521,21 @@ BOOL authorise_login(int snum, fstring user, DATA_BLOB password, BOOL ok = False; #ifdef DEBUG_PASSWORD - DEBUG(100,("authorise_login: checking authorisation on user=%s pass=%s\n", - user,password.data)); + DEBUG(100,("authorise_login: checking authorisation on " + "user=%s pass=%s\n", user,password.data)); #endif *guest = False; /* there are several possibilities: 1) login as the given user with given password - 2) login as a previously registered username with the given password + 2) login as a previously registered username with the given + password 3) login as a session list username with the given password 4) login as a previously validated user/password pair 5) login as the "user =" user with given password - 6) login as the "user =" user with no password (guest connection) + 6) login as the "user =" user with no password + (guest connection) 7) login as guest user with no password if the service is guest_only then steps 1 to 5 are skipped @@ -550,11 +564,12 @@ BOOL authorise_login(int snum, fstring user, DATA_BLOB password, if (password_ok(user2,password)) { ok = True; fstrcpy(user,user2); - DEBUG(3,("authorise_login: ACCEPTED: session list username (%s) \ -and given password ok\n", user)); + DEBUG(3,("authorise_login: ACCEPTED: session " + "list username (%s) and given " + "password ok\n", user)); } } - + SAFE_FREE(user_list); } @@ -573,17 +588,21 @@ and given password ok\n", user)); if (auser) { ok = True; fstrcpy(user,auser); - DEBUG(3,("authorise_login: ACCEPTED: group username \ -and given password ok (%s)\n", user)); + DEBUG(3,("authorise_login: ACCEPTED: " + "group username and given " + "password ok (%s)\n", user)); } } else { fstring user2; fstrcpy(user2,auser); - if (user_ok(user2,snum, NULL, 0) && password_ok(user2,password)) { + if (user_ok(user2,snum, NULL, 0) && + password_ok(user2,password)) { ok = True; fstrcpy(user,user2); - DEBUG(3,("authorise_login: ACCEPTED: user list username \ -and given password ok (%s)\n", user)); + DEBUG(3,("authorise_login: ACCEPTED: " + "user list username and " + "given password ok (%s)\n", + user)); } } } @@ -596,10 +615,11 @@ and given password ok (%s)\n", user)); if (Get_Pwnam(guestname)) { fstrcpy(user,guestname); ok = True; - DEBUG(3,("authorise_login: ACCEPTED: guest account and guest ok (%s)\n", - user)); + DEBUG(3,("authorise_login: ACCEPTED: guest account " + "and guest ok (%s)\n", user)); } else { - DEBUG(0,("authorise_login: Invalid guest account %s??\n",guestname)); + DEBUG(0,("authorise_login: Invalid guest account " + "%s??\n",guestname)); } *guest = True; } diff --git a/source/smbd/posix_acls.c b/source/smbd/posix_acls.c index 91a3f5ed481..7187f61b023 100644 --- a/source/smbd/posix_acls.c +++ b/source/smbd/posix_acls.c @@ -4149,10 +4149,14 @@ BOOL can_delete_file_in_directory(connection_struct *conn, const char *fname) if(SMB_VFS_STAT(conn, fname, &sbuf_file) != 0) { return False; } - if (current_user.uid == sbuf_file.st_uid) { - return True; + /* + * Patch from SATOH Fumiyasu <fumiyas@miraclelinux.com> + * for bug #3348. Don't assume owning sticky bit + * directory means write access allowed. + */ + if (current_user.uid != sbuf_file.st_uid) { + return False; } - return False; } #endif diff --git a/source/smbd/trans2.c b/source/smbd/trans2.c index ee6bed9afdf..fc2a7686bd1 100644 --- a/source/smbd/trans2.c +++ b/source/smbd/trans2.c @@ -1536,7 +1536,7 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn, SIVAL(p,4,0); p+= 8; - SINO_T(p,0,(SMB_INO_T)sbuf.st_ino); /* inode number */ + SINO_T_VAL(p,0,(SMB_INO_T)sbuf.st_ino); /* inode number */ p+= 8; SIVAL(p,0, unix_perms_to_wire(sbuf.st_mode)); /* Standard UNIX file permissions */ @@ -3361,7 +3361,7 @@ total_data=%u (should be %u)\n", (unsigned int)total_data, (unsigned int)IVAL(pd SIVAL(pdata,4,0); pdata += 8; - SINO_T(pdata,0,(SMB_INO_T)sbuf.st_ino); /* inode number */ + SINO_T_VAL(pdata,0,(SMB_INO_T)sbuf.st_ino); /* inode number */ pdata += 8; SIVAL(pdata,0, unix_perms_to_wire(sbuf.st_mode)); /* Standard UNIX file permissions */ diff --git a/source/tdb/tdbtool.c b/source/tdb/tdbtool.c index ce8490ea065..bcfb96adc09 100644 --- a/source/tdb/tdbtool.c +++ b/source/tdb/tdbtool.c @@ -232,6 +232,11 @@ static void insert_tdb(char *keyname, size_t keylen, char* data, size_t datalen) { TDB_DATA key, dbuf; + if ((keyname == NULL) || (keylen == 0)) { + terror("need key"); + return; + } + key.dptr = keyname; key.dsize = keylen; dbuf.dptr = data; @@ -246,6 +251,16 @@ static void store_tdb(char *keyname, size_t keylen, char* data, size_t datalen) { TDB_DATA key, dbuf; + if ((keyname == NULL) || (keylen == 0)) { + terror("need key"); + return; + } + + if ((data == NULL) || (datalen == 0)) { + terror("need data"); + return; + } + key.dptr = keyname; key.dsize = keylen; dbuf.dptr = data; @@ -263,6 +278,11 @@ static void show_tdb(char *keyname, size_t keylen) { TDB_DATA key, dbuf; + if ((keyname == NULL) || (keylen == 0)) { + terror("need key"); + return; + } + key.dptr = keyname; key.dsize = keylen; @@ -283,6 +303,11 @@ static void delete_tdb(char *keyname, size_t keylen) { TDB_DATA key; + if ((keyname == NULL) || (keylen == 0)) { + terror("need key"); + return; + } + key.dptr = keyname; key.dsize = keylen; @@ -296,6 +321,11 @@ static void move_rec(char *keyname, size_t keylen, char* tdbname) TDB_DATA key, dbuf; TDB_CONTEXT *dst_tdb; + if ((keyname == NULL) || (keylen == 0)) { + terror("need key"); + return; + } + if ( !tdbname ) { terror("need destination tdb name"); return; diff --git a/source/tdb/tdbutil.c b/source/tdb/tdbutil.c index ac9280cf8bd..53011006327 100644 --- a/source/tdb/tdbutil.c +++ b/source/tdb/tdbutil.c @@ -485,7 +485,7 @@ size_t tdb_pack(char *buf, int bufsize, const char *fmt, ...) return result; } -BOOL tdb_pack_append(TALLOC_CTX *mem_ctx, uint8_t **buf, size_t *len, +BOOL tdb_pack_append(TALLOC_CTX *mem_ctx, uint8 **buf, size_t *len, const char *fmt, ...) { va_list ap; @@ -496,10 +496,10 @@ BOOL tdb_pack_append(TALLOC_CTX *mem_ctx, uint8_t **buf, size_t *len, va_end(ap); if (mem_ctx != NULL) - *buf = TALLOC_REALLOC_ARRAY(mem_ctx, *buf, uint8_t, + *buf = TALLOC_REALLOC_ARRAY(mem_ctx, *buf, uint8, (*len) + len1); else - *buf = SMB_REALLOC_ARRAY(*buf, uint8_t, (*len) + len1); + *buf = SMB_REALLOC_ARRAY(*buf, uint8, (*len) + len1); if (*buf == NULL) return False; diff --git a/source/utils/eventlogadm.c b/source/utils/eventlogadm.c index a0fc4bcf9d4..eef7cde3771 100644 --- a/source/utils/eventlogadm.c +++ b/source/utils/eventlogadm.c @@ -166,6 +166,8 @@ int main( int argc, char *argv[] ) fstring opname; + load_case_tables(); + opt_debug = 0; /* todo set this from getopts */ lp_load( dyn_CONFIGFILE, True, False, False ); diff --git a/source/utils/net.c b/source/utils/net.c index 4d9dec4b85b..a2a9ac6a391 100644 --- a/source/utils/net.c +++ b/source/utils/net.c @@ -128,7 +128,7 @@ int net_run_function(int argc, const char **argv, struct functable *table, if (StrCaseCmp(argv[0], table[i].funcname) == 0) return table[i].fn(argc-1, argv+1); } - d_printf("No command: %s\n", argv[0]); + d_fprintf(stderr, "No command: %s\n", argv[0]); return usage_fn(argc, argv); } @@ -158,21 +158,21 @@ NTSTATUS connect_to_service(struct cli_state **c, struct in_addr *server_ip, if (NT_STATUS_IS_OK(nt_status)) { return nt_status; } else { - d_printf("Could not connect to server %s\n", server_name); + d_fprintf(stderr, "Could not connect to server %s\n", server_name); /* Display a nicer message depending on the result */ if (NT_STATUS_V(nt_status) == NT_STATUS_V(NT_STATUS_LOGON_FAILURE)) - d_printf("The username or password was not correct.\n"); + d_fprintf(stderr, "The username or password was not correct.\n"); if (NT_STATUS_V(nt_status) == NT_STATUS_V(NT_STATUS_ACCOUNT_LOCKED_OUT)) - d_printf("The account was locked out.\n"); + d_fprintf(stderr, "The account was locked out.\n"); if (NT_STATUS_V(nt_status) == NT_STATUS_V(NT_STATUS_ACCOUNT_DISABLED)) - d_printf("The account was disabled.\n"); + d_fprintf(stderr, "The account was disabled.\n"); return nt_status; } @@ -257,7 +257,7 @@ int net_use_machine_password(void) char *user_name = NULL; if (!secrets_init()) { - d_printf("ERROR: Unable to open secrets database\n"); + d_fprintf(stderr, "ERROR: Unable to open secrets database\n"); exit(1); } @@ -362,7 +362,7 @@ struct cli_state *net_make_ipc_connection(unsigned flags) NTSTATUS nt_status; if (!net_find_server(flags, &server_ip, &server_name)) { - d_printf("\nUnable to find a suitable server\n"); + d_fprintf(stderr, "\nUnable to find a suitable server\n"); return NULL; } @@ -409,7 +409,7 @@ static int net_join(int argc, const char **argv) if (net_ads_join(argc, argv) == 0) return 0; else - d_printf("ADS join did not work, falling back to RPC...\n"); + d_fprintf(stderr, "ADS join did not work, falling back to RPC...\n"); } return net_rpc_join(argc, argv); } @@ -431,7 +431,7 @@ static int net_changesecretpw(int argc, const char **argv) trust_pw = getpass("Enter machine password: "); if (!secrets_store_machine_password(trust_pw, lp_workgroup(), sec_channel_type)) { - d_printf("Unable to write the machine account password in the secrets database"); + d_fprintf(stderr, "Unable to write the machine account password in the secrets database"); return 1; } else { @@ -486,7 +486,7 @@ static int net_getlocalsid(int argc, const char **argv) panic when we can't. */ if (!secrets_init()) { - d_printf("Unable to open secrets.tdb. Can't fetch domain SID for name: %s\n", name); + d_fprintf(stderr, "Unable to open secrets.tdb. Can't fetch domain SID for name: %s\n", name); return 1; } @@ -536,14 +536,14 @@ static int net_getdomainsid(int argc, const char **argv) get_global_sam_sid(); if (!secrets_fetch_domain_sid(global_myname(), &domain_sid)) { - d_printf("Could not fetch local SID\n"); + d_fprintf(stderr, "Could not fetch local SID\n"); return 1; } sid_to_string(sid_str, &domain_sid); d_printf("SID for domain %s is: %s\n", global_myname(), sid_str); if (!secrets_fetch_domain_sid(opt_workgroup, &domain_sid)) { - d_printf("Could not fetch domain SID\n"); + d_fprintf(stderr, "Could not fetch domain SID\n"); return 1; } @@ -575,22 +575,22 @@ static int net_afs_key(int argc, const char **argv) } if (!secrets_init()) { - d_printf("Could not open secrets.tdb\n"); + d_fprintf(stderr, "Could not open secrets.tdb\n"); return -1; } if ((fd = open(argv[0], O_RDONLY, 0)) < 0) { - d_printf("Could not open %s\n", argv[0]); + d_fprintf(stderr, "Could not open %s\n", argv[0]); return -1; } if (read(fd, &keyfile, sizeof(keyfile)) != sizeof(keyfile)) { - d_printf("Could not read keyfile\n"); + d_fprintf(stderr, "Could not read keyfile\n"); return -1; } if (!secrets_store_afs_keyfile(argv[1], &keyfile)) { - d_printf("Could not write keyfile to secrets.tdb\n"); + d_fprintf(stderr, "Could not write keyfile to secrets.tdb\n"); return -1; } @@ -642,7 +642,7 @@ static BOOL search_maxrid(struct pdb_search *search, const char *type, uint32 i, num_entries; if (search == NULL) { - d_printf("get_maxrid: Could not search %s\n", type); + d_fprintf(stderr, "get_maxrid: Could not search %s\n", type); return False; } @@ -781,6 +781,8 @@ static struct functable net_func[] = { zero_ip(&opt_dest_ip); + load_case_tables(); + /* set default debug level to 0 regardless of what smb.conf sets */ DEBUGLEVEL_CLASS[DBGC_ALL] = 0; dbf = x_stderr; @@ -797,7 +799,7 @@ static struct functable net_func[] = { case 'I': opt_dest_ip = *interpret_addr2(poptGetOptArg(pc)); if (is_zero_ip(opt_dest_ip)) - d_printf("\nInvalid ip address specified\n"); + d_fprintf(stderr, "\nInvalid ip address specified\n"); else opt_have_ip = True; break; @@ -811,7 +813,7 @@ static struct functable net_func[] = { } break; default: - d_printf("\nInvalid option %s: %s\n", + d_fprintf(stderr, "\nInvalid option %s: %s\n", poptBadOption(pc, 0), poptStrerror(opt)); net_help(argc, argv); exit(1); diff --git a/source/utils/net_ads.c b/source/utils/net_ads.c index 49a7f1cc2dd..f54896b3a82 100644 --- a/source/utils/net_ads.c +++ b/source/utils/net_ads.c @@ -78,7 +78,7 @@ static int net_ads_lookup(int argc, const char **argv) ads_connect(ads); if (!ads) { - d_printf("Didn't find the cldap server!\n"); + d_fprintf(stderr, "Didn't find the cldap server!\n"); return -1; } if (!ads->config.realm) { ads->config.realm = CONST_DISCARD(char *, opt_target_workgroup); @@ -108,7 +108,7 @@ static int net_ads_info(int argc, const char **argv) ads_connect(ads); if (!ads || !ads->config.realm) { - d_printf("Didn't find the ldap server!\n"); + d_fprintf(stderr, "Didn't find the ldap server!\n"); return -1; } @@ -229,7 +229,7 @@ static int net_ads_workgroup(int argc, const char **argv) } if (!ADS_ERR_OK(ads_workgroup_name(ads, ctx, &workgroup))) { - d_printf("Failed to find workgroup for realm '%s'\n", + d_fprintf(stderr, "Failed to find workgroup for realm '%s'\n", ads->config.realm); talloc_destroy(ctx); ads_destroy(&ads); @@ -295,12 +295,12 @@ static int ads_user_add(int argc, const char **argv) status = ads_find_user_acct(ads, &res, argv[0]); if (!ADS_ERR_OK(status)) { - d_printf("ads_user_add: %s\n", ads_errstr(status)); + d_fprintf(stderr, "ads_user_add: %s\n", ads_errstr(status)); goto done; } if (ads_count_replies(ads, res)) { - d_printf("ads_user_add: User %s already exists\n", argv[0]); + d_fprintf(stderr, "ads_user_add: User %s already exists\n", argv[0]); goto done; } @@ -311,7 +311,7 @@ static int ads_user_add(int argc, const char **argv) status = ads_add_user_acct(ads, argv[0], opt_container, opt_comment); if (!ADS_ERR_OK(status)) { - d_printf("Could not add user %s: %s\n", argv[0], + d_fprintf(stderr, "Could not add user %s: %s\n", argv[0], ads_errstr(status)); goto done; } @@ -335,7 +335,7 @@ static int ads_user_add(int argc, const char **argv) } /* password didn't set, delete account */ - d_printf("Could not add user %s. Error setting password %s\n", + d_fprintf(stderr, "Could not add user %s. Error setting password %s\n", argv[0], ads_errstr(status)); ads_msgfree(ads, res); status=ads_find_user_acct(ads, &res, argv[0]); @@ -373,7 +373,7 @@ static int ads_user_info(int argc, const char **argv) } if (!escaped_user) { - d_printf("ads_user_info: failed to escape user %s\n", argv[0]); + d_fprintf(stderr, "ads_user_info: failed to escape user %s\n", argv[0]); ads_destroy(&ads); return -1; } @@ -383,7 +383,7 @@ static int ads_user_info(int argc, const char **argv) safe_free(searchstring); if (!ADS_ERR_OK(rc)) { - d_printf("ads_search: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_search: %s\n", ads_errstr(rc)); ads_destroy(&ads); return -1; } @@ -436,7 +436,7 @@ static int ads_user_delete(int argc, const char **argv) ads_destroy(&ads); return 0; } - d_printf("Error deleting user %s: %s\n", argv[0], + d_fprintf(stderr, "Error deleting user %s: %s\n", argv[0], ads_errstr(rc)); ads_destroy(&ads); return -1; @@ -501,12 +501,12 @@ static int ads_group_add(int argc, const char **argv) status = ads_find_user_acct(ads, &res, argv[0]); if (!ADS_ERR_OK(status)) { - d_printf("ads_group_add: %s\n", ads_errstr(status)); + d_fprintf(stderr, "ads_group_add: %s\n", ads_errstr(status)); goto done; } if (ads_count_replies(ads, res)) { - d_printf("ads_group_add: Group %s already exists\n", argv[0]); + d_fprintf(stderr, "ads_group_add: Group %s already exists\n", argv[0]); ads_msgfree(ads, res); goto done; } @@ -521,7 +521,7 @@ static int ads_group_add(int argc, const char **argv) d_printf("Group %s added\n", argv[0]); rc = 0; } else { - d_printf("Could not add group %s: %s\n", argv[0], + d_fprintf(stderr, "Could not add group %s: %s\n", argv[0], ads_errstr(status)); } @@ -562,7 +562,7 @@ static int ads_group_delete(int argc, const char **argv) ads_destroy(&ads); return 0; } - d_printf("Error deleting group %s: %s\n", argv[0], + d_fprintf(stderr, "Error deleting group %s: %s\n", argv[0], ads_errstr(rc)); ads_destroy(&ads); return -1; @@ -614,13 +614,13 @@ static int net_ads_status(int argc, const char **argv) rc = ads_find_machine_acct(ads, &res, global_myname()); if (!ADS_ERR_OK(rc)) { - d_printf("ads_find_machine_acct: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_find_machine_acct: %s\n", ads_errstr(rc)); ads_destroy(&ads); return -1; } if (ads_count_replies(ads, res) == 0) { - d_printf("No machine account for '%s' found\n", global_myname()); + d_fprintf(stderr, "No machine account for '%s' found\n", global_myname()); ads_destroy(&ads); return -1; } @@ -650,7 +650,7 @@ static int net_ads_leave(int argc, const char **argv) rc = ads_leave_realm(ads, global_myname()); if (!ADS_ERR_OK(rc)) { - d_printf("Failed to delete host '%s' from the '%s' realm.\n", + d_fprintf(stderr, "Failed to delete host '%s' from the '%s' realm.\n", global_myname(), ads->config.realm); ads_destroy(&ads); return -1; @@ -734,13 +734,13 @@ int net_ads_join(int argc, const char **argv) } if (!*lp_realm()) { - d_printf("realm must be set in in smb.conf for ADS join to succeed.\n"); + d_fprintf(stderr, "realm must be set in in smb.conf for ADS join to succeed.\n"); ads_destroy(&ads); return -1; } if (strcmp(ads->config.realm, lp_realm()) != 0) { - d_printf("realm of remote server (%s) and realm in smb.conf (%s) DO NOT match. Aborting join\n", ads->config.realm, lp_realm()); + d_fprintf(stderr, "realm of remote server (%s) and realm in smb.conf (%s) DO NOT match. Aborting join\n", ads->config.realm, lp_realm()); ads_destroy(&ads); return -1; } @@ -753,7 +753,7 @@ int net_ads_join(int argc, const char **argv) ads_msgfree(ads, res); if (rc.error_type == ENUM_ADS_ERROR_LDAP && rc.err.rc == LDAP_NO_SUCH_OBJECT) { - d_printf("ads_join_realm: organizational unit %s does not exist (dn:%s)\n", + d_fprintf(stderr, "ads_join_realm: organizational unit %s does not exist (dn:%s)\n", org_unit, dn); ads_destroy(&ads); return -1; @@ -761,34 +761,34 @@ int net_ads_join(int argc, const char **argv) free(dn); if (!ADS_ERR_OK(rc)) { - d_printf("ads_join_realm: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_join_realm: %s\n", ads_errstr(rc)); ads_destroy(&ads); return -1; } rc = ads_join_realm(ads, global_myname(), account_type, org_unit); if (!ADS_ERR_OK(rc)) { - d_printf("ads_join_realm: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_join_realm: %s\n", ads_errstr(rc)); ads_destroy(&ads); return -1; } rc = ads_domain_sid(ads, &dom_sid); if (!ADS_ERR_OK(rc)) { - d_printf("ads_domain_sid: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_domain_sid: %s\n", ads_errstr(rc)); ads_destroy(&ads); return -1; } if (asprintf(&machine_account, "%s$", global_myname()) == -1) { - d_printf("asprintf failed\n"); + d_fprintf(stderr, "asprintf failed\n"); ads_destroy(&ads); return -1; } rc = ads_set_machine_password(ads, machine_account, password); if (!ADS_ERR_OK(rc)) { - d_printf("ads_set_machine_password: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_set_machine_password: %s\n", ads_errstr(rc)); ads_destroy(&ads); return -1; } @@ -796,7 +796,7 @@ int net_ads_join(int argc, const char **argv) /* make sure we get the right workgroup */ if ( !(ctx = talloc_init("net ads join")) ) { - d_printf("talloc_init() failed!\n"); + d_fprintf(stderr, "talloc_init() failed!\n"); ads_destroy(&ads); return -1; } @@ -904,14 +904,14 @@ static int net_ads_printer_search(int argc, const char **argv) rc = ads_find_printers(ads, &res); if (!ADS_ERR_OK(rc)) { - d_printf("ads_find_printer: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_find_printer: %s\n", ads_errstr(rc)); ads_msgfree(ads, res); ads_destroy(&ads); return -1; } if (ads_count_replies(ads, res) == 0) { - d_printf("No results found\n"); + d_fprintf(stderr, "No results found\n"); ads_msgfree(ads, res); ads_destroy(&ads); return -1; @@ -949,14 +949,14 @@ static int net_ads_printer_info(int argc, const char **argv) rc = ads_find_printer_on_server(ads, &res, printername, servername); if (!ADS_ERR_OK(rc)) { - d_printf("ads_find_printer_on_server: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_find_printer_on_server: %s\n", ads_errstr(rc)); ads_msgfree(ads, res); ads_destroy(&ads); return -1; } if (ads_count_replies(ads, res) == 0) { - d_printf("Printer '%s' not found\n", printername); + d_fprintf(stderr, "Printer '%s' not found\n", printername); ads_msgfree(ads, res); ads_destroy(&ads); return -1; @@ -1018,7 +1018,7 @@ static int net_ads_printer_publish(int argc, const char **argv) Undefined, NULL); if (NT_STATUS_IS_ERR(nt_status)) { - d_printf("Unable to open a connnection to %s to obtain data " + d_fprintf(stderr, "Unable to open a connnection to %s to obtain data " "for %s\n", servername, printername); ads_destroy(&ads); return -1; @@ -1029,7 +1029,7 @@ static int net_ads_printer_publish(int argc, const char **argv) ads_find_machine_acct(ads, &res, servername); if (ads_count_replies(ads, res) == 0) { - d_printf("Could not find machine account for server %s\n", + d_fprintf(stderr, "Could not find machine account for server %s\n", servername); ads_destroy(&ads); return -1; @@ -1046,7 +1046,7 @@ static int net_ads_printer_publish(int argc, const char **argv) rc = ads_add_printer_entry(ads, prt_dn, mem_ctx, &mods); if (!ADS_ERR_OK(rc)) { - d_printf("ads_publish_printer: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_publish_printer: %s\n", ads_errstr(rc)); ads_destroy(&ads); return -1; } @@ -1082,14 +1082,14 @@ static int net_ads_printer_remove(int argc, const char **argv) rc = ads_find_printer_on_server(ads, &res, argv[0], servername); if (!ADS_ERR_OK(rc)) { - d_printf("ads_find_printer_on_server: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_find_printer_on_server: %s\n", ads_errstr(rc)); ads_msgfree(ads, res); ads_destroy(&ads); return -1; } if (ads_count_replies(ads, res) == 0) { - d_printf("Printer '%s' not found\n", argv[1]); + d_fprintf(stderr, "Printer '%s' not found\n", argv[1]); ads_msgfree(ads, res); ads_destroy(&ads); return -1; @@ -1101,7 +1101,7 @@ static int net_ads_printer_remove(int argc, const char **argv) ads_memfree(ads, prt_dn); if (!ADS_ERR_OK(rc)) { - d_printf("ads_del_dn: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "ads_del_dn: %s\n", ads_errstr(rc)); ads_destroy(&ads); return -1; } @@ -1136,12 +1136,12 @@ static int net_ads_password(int argc, const char **argv) ADS_STATUS ret; if (opt_user_name == NULL || opt_password == NULL) { - d_printf("You must supply an administrator username/password\n"); + d_fprintf(stderr, "You must supply an administrator username/password\n"); return -1; } if (argc < 1) { - d_printf("ERROR: You must say which username to change password for\n"); + d_fprintf(stderr, "ERROR: You must say which username to change password for\n"); return -1; } @@ -1170,7 +1170,7 @@ static int net_ads_password(int argc, const char **argv) ads_connect(ads); if (!ads || !ads->config.realm) { - d_printf("Didn't find the kerberos server!\n"); + d_fprintf(stderr, "Didn't find the kerberos server!\n"); return -1; } @@ -1185,7 +1185,7 @@ static int net_ads_password(int argc, const char **argv) ret = kerberos_set_password(ads->auth.kdc_server, auth_principal, auth_password, user, new_password, ads->auth.time_offset); if (!ADS_ERR_OK(ret)) { - d_printf("Password change failed :-( ...\n"); + d_fprintf(stderr, "Password change failed :-( ...\n"); ads_destroy(&ads); return -1; } @@ -1224,7 +1224,7 @@ int net_ads_changetrustpw(int argc, const char **argv) ret = ads_change_trust_account_password(ads, host_principal); if (!ADS_ERR_OK(ret)) { - d_printf("Password change failed :-( ...\n"); + d_fprintf(stderr, "Password change failed :-( ...\n"); ads_destroy(&ads); SAFE_FREE(host_principal); return -1; @@ -1288,7 +1288,7 @@ static int net_ads_search(int argc, const char **argv) LDAP_SCOPE_SUBTREE, ldap_exp, attrs, &res); if (!ADS_ERR_OK(rc)) { - d_printf("search failed: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "search failed: %s\n", ads_errstr(rc)); ads_destroy(&ads); return -1; } @@ -1348,7 +1348,7 @@ static int net_ads_dn(int argc, const char **argv) LDAP_SCOPE_BASE, "(objectclass=*)", attrs, &res); if (!ADS_ERR_OK(rc)) { - d_printf("search failed: %s\n", ads_errstr(rc)); + d_fprintf(stderr, "search failed: %s\n", ads_errstr(rc)); ads_destroy(&ads); return -1; } @@ -1495,7 +1495,7 @@ int net_ads(int argc, const char **argv) static int net_ads_noads(void) { - d_printf("ADS support not compiled in\n"); + d_fprintf(stderr, "ADS support not compiled in\n"); return -1; } diff --git a/source/utils/net_ads_cldap.c b/source/utils/net_ads_cldap.c index 9f70a5b7257..2e7a28b3222 100644 --- a/source/utils/net_ads_cldap.c +++ b/source/utils/net_ads_cldap.c @@ -93,7 +93,7 @@ static unsigned pull_netlogon_string(char *ret, const char *ptr, uint8 len = (uint8)*(ptr++); if ((pret - ret + len + 1) >= MAX_DNS_LABEL) { - d_printf("DC returning too long DNS name\n"); + d_fprintf(stderr, "DC returning too long DNS name\n"); return 0; } @@ -178,13 +178,13 @@ static int send_cldap_netlogon(int sock, const char *domain, asn1_pop_tag(&data); if (data.has_error) { - d_printf("Failed to build cldap netlogon at offset %d\n", (int)data.ofs); + d_fprintf(stderr, "Failed to build cldap netlogon at offset %d\n", (int)data.ofs); asn1_free(&data); return -1; } if (write(sock, data.data, data.length) != (ssize_t)data.length) { - d_printf("failed to send cldap query (%s)\n", strerror(errno)); + d_fprintf(stderr, "failed to send cldap query (%s)\n", strerror(errno)); } asn1_free(&data); @@ -210,7 +210,7 @@ static int recv_cldap_netlogon(int sock, struct cldap_netlogon_reply *reply) ret = read(sock, blob.data, blob.length); if (ret <= 0) { - d_printf("no reply received to cldap netlogon\n"); + d_fprintf(stderr, "no reply received to cldap netlogon\n"); return -1; } blob.length = ret; @@ -232,7 +232,7 @@ static int recv_cldap_netlogon(int sock, struct cldap_netlogon_reply *reply) asn1_end_tag(&data); if (data.has_error) { - d_printf("Failed to parse cldap reply\n"); + d_fprintf(stderr, "Failed to parse cldap reply\n"); return -1; } @@ -284,7 +284,7 @@ int ads_cldap_netlogon(ADS_STRUCT *ads) sock = open_udp_socket(target, ads->ldap_port); if (sock == -1) { - d_printf("Failed to open udp socket to %s:%u\n", + d_fprintf(stderr, "Failed to open udp socket to %s:%u\n", inet_ntoa(ads->ldap_ip), ads->ldap_port); return -1; diff --git a/source/utils/net_cache.c b/source/utils/net_cache.c index 6bbab1c8177..0c107a5f01d 100644 --- a/source/utils/net_cache.c +++ b/source/utils/net_cache.c @@ -64,7 +64,7 @@ static void delete_cache_entry(const char* keystr, const char* datastr, const time_t timeout, void* dptr) { if (!gencache_del(keystr)) - d_printf("Couldn't delete entry! key = %s\n", keystr); + d_fprintf(stderr, "Couldn't delete entry! key = %s\n", keystr); } @@ -147,7 +147,7 @@ static int net_cache_add(int argc, const char **argv) /* parse timeout given in command line */ timeout = parse_timeout(timeout_str); if (!timeout) { - d_printf("Invalid timeout argument.\n"); + d_fprintf(stderr, "Invalid timeout argument.\n"); return -1; } @@ -157,7 +157,7 @@ static int net_cache_add(int argc, const char **argv) return 0; } - d_printf("Entry couldn't be added. Perhaps there's already such a key.\n"); + d_fprintf(stderr, "Entry couldn't be added. Perhaps there's already such a key.\n"); gencache_shutdown(); return -1; } @@ -187,7 +187,7 @@ static int net_cache_set(int argc, const char **argv) /* parse timeout given in command line */ timeout = parse_timeout(timeout_str); if (!timeout) { - d_printf("Invalid timeout argument.\n"); + d_fprintf(stderr, "Invalid timeout argument.\n"); return -1; } @@ -197,7 +197,7 @@ static int net_cache_set(int argc, const char **argv) return 0; } - d_printf("Entry couldn't be set. Perhaps there's no such a key.\n"); + d_fprintf(stderr, "Entry couldn't be set. Perhaps there's no such a key.\n"); gencache_shutdown(); return -1; } @@ -223,7 +223,7 @@ static int net_cache_del(int argc, const char **argv) return 0; } - d_printf("Couldn't delete specified entry\n"); + d_fprintf(stderr, "Couldn't delete specified entry\n"); return -1; } @@ -250,7 +250,7 @@ static int net_cache_get(int argc, const char **argv) return 0; } - d_printf("Failed to find entry\n"); + d_fprintf(stderr, "Failed to find entry\n"); return -1; } diff --git a/source/utils/net_rap.c b/source/utils/net_rap.c index 8205fe3fda9..e80beb36456 100644 --- a/source/utils/net_rap.c +++ b/source/utils/net_rap.c @@ -112,7 +112,7 @@ static int rap_file_user(int argc, const char **argv) if (argc == 0) return net_rap_file_usage(argc, argv); - d_printf("net rap file user not implemented yet\n"); + d_fprintf(stderr, "net rap file user not implemented yet\n"); return -1; } diff --git a/source/utils/net_rpc.c b/source/utils/net_rpc.c index 33eac56a925..0495a7b92c2 100644 --- a/source/utils/net_rpc.c +++ b/source/utils/net_rpc.c @@ -347,7 +347,7 @@ static int net_rpc_oldjoin(int argc, const char **argv) int rc = net_rpc_perform_oldjoin(argc, argv); if (rc) { - d_printf("Failed to join domain\n"); + d_fprintf(stderr, "Failed to join domain\n"); } return rc; @@ -607,7 +607,7 @@ static NTSTATUS rpc_user_add_internals(const DOM_SID *domain_sid, done: if (!NT_STATUS_IS_OK(result)) { - d_printf("Failed to add user %s - %s\n", acct_name, + d_fprintf(stderr, "Failed to add user %s - %s\n", acct_name, nt_errstr(result)); } else { d_printf("Added user %s\n", acct_name); @@ -714,7 +714,7 @@ static NTSTATUS rpc_user_del_internals(const DOM_SID *domain_sid, /* Display results */ if (!NT_STATUS_IS_OK(result)) { - d_printf("Failed to delete user account - %s\n", nt_errstr(result)); + d_fprintf(stderr, "Failed to delete user account - %s\n", nt_errstr(result)); } else { d_printf("Deleted user account\n"); } @@ -829,7 +829,7 @@ static NTSTATUS rpc_user_rename_internals(const DOM_SID *domain_sid, done: if (!NT_STATUS_IS_OK(result)) { - d_printf("Failed to rename user from %s to %s - %s\n", old_name, new_name, + d_fprintf(stderr, "Failed to rename user from %s to %s - %s\n", old_name, new_name, nt_errstr(result)); } else { d_printf("Renamed user from %s to %s\n", old_name, new_name); @@ -1280,7 +1280,7 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, &connect_pol); if (!NT_STATUS_IS_OK(result)) { - d_printf("Request samr_connect failed\n"); + d_fprintf(stderr, "Request samr_connect failed\n"); goto done; } @@ -1289,7 +1289,7 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, domain_sid, &domain_pol); if (!NT_STATUS_IS_OK(result)) { - d_printf("Request open_domain failed\n"); + d_fprintf(stderr, "Request open_domain failed\n"); goto done; } @@ -1299,7 +1299,7 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, &name_types); if (!NT_STATUS_IS_OK(result)) { - d_printf("Lookup of '%s' failed\n",argv[0]); + d_fprintf(stderr, "Lookup of '%s' failed\n",argv[0]); goto done; } @@ -1310,7 +1310,7 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, MAXIMUM_ALLOWED_ACCESS, group_rids[0], &group_pol); if (!NT_STATUS_IS_OK(result)) { - d_printf("Request open_group failed"); + d_fprintf(stderr, "Request open_group failed"); goto done; } @@ -1321,7 +1321,7 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, &group_attrs); if (!NT_STATUS_IS_OK(result)) { - d_printf("Unable to query group members of %s",argv[0]); + d_fprintf(stderr, "Unable to query group members of %s",argv[0]); goto done; } @@ -1338,7 +1338,7 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, group_rids[i], &user_pol); if (!NT_STATUS_IS_OK(result)) { - d_printf("Unable to open group member %d\n",group_rids[i]); + d_fprintf(stderr, "Unable to open group member %d\n",group_rids[i]); goto done; } @@ -1348,7 +1348,7 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, 21, &user_ctr); if (!NT_STATUS_IS_OK(result)) { - d_printf("Unable to lookup userinfo for group member %d\n",group_rids[i]); + d_fprintf(stderr, "Unable to lookup userinfo for group member %d\n",group_rids[i]); goto done; } @@ -1364,8 +1364,8 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, } if (group_is_primary) { - d_printf("Unable to delete group because some of it's " - "members have it as primary group\n"); + d_fprintf(stderr, "Unable to delete group because some " + "of it's members have it as primary group\n"); result = NT_STATUS_MEMBERS_PRIMARY_GROUP; goto done; } @@ -1397,14 +1397,14 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, group_rids[0], &group_pol); if (!NT_STATUS_IS_OK(result)) { - d_printf("Request open_alias failed\n"); + d_fprintf(stderr, "Request open_alias failed\n"); goto done; } result = rpccli_samr_delete_dom_alias(pipe_hnd, mem_ctx, &group_pol); break; default: - d_printf("%s is of type %s. This command is only for deleting local or global groups\n", + d_fprintf(stderr, "%s is of type %s. This command is only for deleting local or global groups\n", argv[0],sid_type_lookup(name_types[0])); result = NT_STATUS_UNSUCCESSFUL; goto done; @@ -1415,7 +1415,7 @@ static NTSTATUS rpc_group_delete_internals(const DOM_SID *domain_sid, if (opt_verbose) d_printf("Deleted %s '%s'\n",sid_type_lookup(name_types[0]),argv[0]); } else { - d_printf("Deleting of %s failed: %s\n",argv[0], + d_fprintf(stderr, "Deleting of %s failed: %s\n",argv[0], get_friendly_nt_error_msg(result)); } @@ -1482,7 +1482,7 @@ static NTSTATUS rpc_group_add_internals(const DOM_SID *domain_sid, if (NT_STATUS_IS_OK(result)) DEBUG(5, ("add group succeeded\n")); else - d_printf("add group failed: %s\n", nt_errstr(result)); + d_fprintf(stderr, "add group failed: %s\n", nt_errstr(result)); return result; } @@ -1538,7 +1538,7 @@ static NTSTATUS rpc_alias_add_internals(const DOM_SID *domain_sid, if (NT_STATUS_IS_OK(result)) DEBUG(5, ("add alias succeeded\n")); else - d_printf("add alias failed: %s\n", nt_errstr(result)); + d_fprintf(stderr, "add alias failed: %s\n", nt_errstr(result)); return result; } @@ -1652,7 +1652,7 @@ static NTSTATUS rpc_add_groupmem(struct rpc_pipe_client *pipe_hnd, &num_rids, &rids, &rid_types); if (!NT_STATUS_IS_OK(result)) { - d_printf("Could not lookup up group member %s\n", member); + d_fprintf(stderr, "Could not lookup up group member %s\n", member); goto done; } @@ -1696,7 +1696,7 @@ static NTSTATUS rpc_add_aliasmem(struct rpc_pipe_client *pipe_hnd, &member_sid, &member_type); if (!NT_STATUS_IS_OK(result)) { - d_printf("Could not lookup up group member %s\n", member); + d_fprintf(stderr, "Could not lookup up group member %s\n", member); return result; } @@ -1752,7 +1752,7 @@ static NTSTATUS rpc_group_addmem_internals(const DOM_SID *domain_sid, if (!NT_STATUS_IS_OK(get_sid_from_name(cli, mem_ctx, argv[0], &group_sid, &group_type))) { - d_printf("Could not lookup group name %s\n", argv[0]); + d_fprintf(stderr, "Could not lookup group name %s\n", argv[0]); return NT_STATUS_UNSUCCESSFUL; } @@ -1761,7 +1761,7 @@ static NTSTATUS rpc_group_addmem_internals(const DOM_SID *domain_sid, &group_sid, argv[1]); if (!NT_STATUS_IS_OK(result)) { - d_printf("Could not add %s to %s: %s\n", + d_fprintf(stderr, "Could not add %s to %s: %s\n", argv[1], argv[0], nt_errstr(result)); } return result; @@ -1772,14 +1772,14 @@ static NTSTATUS rpc_group_addmem_internals(const DOM_SID *domain_sid, &group_sid, argv[1]); if (!NT_STATUS_IS_OK(result)) { - d_printf("Could not add %s to %s: %s\n", + d_fprintf(stderr, "Could not add %s to %s: %s\n", argv[1], argv[0], nt_errstr(result)); } return result; } - d_printf("Can only add members to global or local groups which " - "%s is not\n", argv[0]); + d_fprintf(stderr, "Can only add members to global or local groups " + "which %s is not\n", argv[0]); return NT_STATUS_UNSUCCESSFUL; } @@ -1830,7 +1830,7 @@ static NTSTATUS rpc_del_groupmem(struct rpc_pipe_client *pipe_hnd, &num_rids, &rids, &rid_types); if (!NT_STATUS_IS_OK(result)) { - d_printf("Could not lookup up group member %s\n", member); + d_fprintf(stderr, "Could not lookup up group member %s\n", member); goto done; } @@ -1872,7 +1872,7 @@ static NTSTATUS rpc_del_aliasmem(struct rpc_pipe_client *pipe_hnd, &member_sid, &member_type); if (!NT_STATUS_IS_OK(result)) { - d_printf("Could not lookup up group member %s\n", member); + d_fprintf(stderr, "Could not lookup up group member %s\n", member); return result; } @@ -1926,7 +1926,7 @@ static NTSTATUS rpc_group_delmem_internals(const DOM_SID *domain_sid, if (!NT_STATUS_IS_OK(get_sid_from_name(cli, mem_ctx, argv[0], &group_sid, &group_type))) { - d_printf("Could not lookup group name %s\n", argv[0]); + d_fprintf(stderr, "Could not lookup group name %s\n", argv[0]); return NT_STATUS_UNSUCCESSFUL; } @@ -1935,7 +1935,7 @@ static NTSTATUS rpc_group_delmem_internals(const DOM_SID *domain_sid, &group_sid, argv[1]); if (!NT_STATUS_IS_OK(result)) { - d_printf("Could not del %s from %s: %s\n", + d_fprintf(stderr, "Could not del %s from %s: %s\n", argv[1], argv[0], nt_errstr(result)); } return result; @@ -1946,14 +1946,14 @@ static NTSTATUS rpc_group_delmem_internals(const DOM_SID *domain_sid, &group_sid, argv[1]); if (!NT_STATUS_IS_OK(result)) { - d_printf("Could not del %s from %s: %s\n", + d_fprintf(stderr, "Could not del %s from %s: %s\n", argv[1], argv[0], nt_errstr(result)); } return result; } - d_printf("Can only delete members from global or local groups which " - "%s is not\n", argv[0]); + d_fprintf(stderr, "Can only delete members from global or local groups " + "which %s is not\n", argv[0]); return NT_STATUS_UNSUCCESSFUL; } @@ -2281,7 +2281,7 @@ static NTSTATUS rpc_list_alias_members(struct rpc_pipe_client *pipe_hnd, &num_members, &alias_sids); if (!NT_STATUS_IS_OK(result)) { - d_printf("Couldn't list alias members\n"); + d_fprintf(stderr, "Couldn't list alias members\n"); return result; } @@ -2291,7 +2291,7 @@ static NTSTATUS rpc_list_alias_members(struct rpc_pipe_client *pipe_hnd, lsa_pipe = cli_rpc_pipe_open_noauth(pipe_hnd->cli, PI_LSARPC, &result); if (!lsa_pipe) { - d_printf("Couldn't open LSA pipe. Error was %s\n", + d_fprintf(stderr, "Couldn't open LSA pipe. Error was %s\n", nt_errstr(result) ); return result; } @@ -2300,7 +2300,7 @@ static NTSTATUS rpc_list_alias_members(struct rpc_pipe_client *pipe_hnd, SEC_RIGHTS_MAXIMUM_ALLOWED, &lsa_pol); if (!NT_STATUS_IS_OK(result)) { - d_printf("Couldn't open LSA policy handle\n"); + d_fprintf(stderr, "Couldn't open LSA policy handle\n"); cli_rpc_pipe_close(lsa_pipe); return result; } @@ -2311,7 +2311,7 @@ static NTSTATUS rpc_list_alias_members(struct rpc_pipe_client *pipe_hnd, if (!NT_STATUS_IS_OK(result) && !NT_STATUS_EQUAL(result, STATUS_SOME_UNMAPPED)) { - d_printf("Couldn't lookup SIDs\n"); + d_fprintf(stderr, "Couldn't lookup SIDs\n"); cli_rpc_pipe_close(lsa_pipe); return result; } @@ -2383,7 +2383,7 @@ static NTSTATUS rpc_group_members_internals(const DOM_SID *domain_sid, &sid_Builtin, &domain_pol); if (!NT_STATUS_IS_OK(result)) { - d_printf("Couldn't find group %s\n", argv[0]); + d_fprintf(stderr, "Couldn't find group %s\n", argv[0]); return result; } @@ -2392,13 +2392,13 @@ static NTSTATUS rpc_group_members_internals(const DOM_SID *domain_sid, &rids, &rid_types); if (!NT_STATUS_IS_OK(result)) { - d_printf("Couldn't find group %s\n", argv[0]); + d_fprintf(stderr, "Couldn't find group %s\n", argv[0]); return result; } } if (num_rids != 1) { - d_printf("Couldn't find group %s\n", argv[0]); + d_fprintf(stderr, "Couldn't find group %s\n", argv[0]); return result; } @@ -2466,12 +2466,12 @@ static NTSTATUS rpc_group_rename_internals(const DOM_SID *domain_sid, 1, argv, &num_rids, &rids, &rid_types); if (num_rids != 1) { - d_printf("Couldn't find group %s\n", argv[0]); + d_fprintf(stderr, "Couldn't find group %s\n", argv[0]); return result; } if (rid_types[0] != SID_NAME_DOM_GRP) { - d_printf("Can only rename domain groups\n"); + d_fprintf(stderr, "Can only rename domain groups\n"); return NT_STATUS_UNSUCCESSFUL; } @@ -3057,7 +3057,7 @@ static void copy_fn(const char *mnt, file_info *f, const char *mask, void *state False); break; default: - d_printf("Unsupported mode %d\n", net_mode_share); + d_fprintf(stderr, "Unsupported mode %d\n", net_mode_share); return; } @@ -3099,7 +3099,7 @@ static void copy_fn(const char *mnt, file_info *f, const char *mask, void *state True); break; default: - d_printf("Unsupported file mode %d\n", net_mode_share); + d_fprintf(stderr, "Unsupported file mode %d\n", net_mode_share); return; } @@ -3124,7 +3124,7 @@ BOOL sync_files(struct copy_clistate *cp_clistate, pstring mask) DEBUG(3,("calling cli_list with mask: %s\n", mask)); if (cli_list(cp_clistate->cli_share_src, mask, cp_clistate->attribute, copy_fn, cp_clistate) == -1) { - d_printf("listing %s failed with error: %s\n", + d_fprintf(stderr, "listing %s failed with error: %s\n", mask, cli_errstr(cp_clistate->cli_share_src)); return False; } @@ -3156,7 +3156,7 @@ BOOL copy_top_level_perms(struct copy_clistate *cp_clistate, False); break; default: - d_printf("Unsupported mode %d\n", net_mode_share); + d_fprintf(stderr, "Unsupported mode %d\n", net_mode_share); break; } @@ -3233,7 +3233,7 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid, printf("syncing"); break; default: - d_printf("Unsupported mode %d\n", net_mode_share); + d_fprintf(stderr, "Unsupported mode %d\n", net_mode_share); break; } printf(" [%s] files and directories %s ACLs, %s DOS Attributes %s\n", @@ -3268,13 +3268,13 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid, } if (!copy_top_level_perms(&cp_clistate, netname)) { - d_printf("Could not handle the top level directory permissions for the share: %s\n", netname); + d_fprintf(stderr, "Could not handle the top level directory permissions for the share: %s\n", netname); nt_status = NT_STATUS_UNSUCCESSFUL; goto done; } if (!sync_files(&cp_clistate, mask)) { - d_printf("could not handle files for share: %s\n", netname); + d_fprintf(stderr, "could not handle files for share: %s\n", netname); nt_status = NT_STATUS_UNSUCCESSFUL; goto done; } @@ -3878,8 +3878,8 @@ static BOOL get_user_tokens(int *num_tokens, struct user_token **user_tokens) if (lp_winbind_use_default_domain() && (opt_target_workgroup == NULL)) { - d_printf("winbind use default domain = yes set, please " - "specify a workgroup\n"); + d_fprintf(stderr, "winbind use default domain = yes set, " + "please specify a workgroup\n"); return False; } @@ -4681,11 +4681,11 @@ static NTSTATUS rpc_reg_shutdown_internals(const DOM_SID *domain_sid, if (W_ERROR_IS_OK(result)) { d_printf("\nShutdown of remote machine succeeded\n"); } else { - d_printf("\nShutdown of remote machine failed\n"); + d_fprintf(stderr, "\nShutdown of remote machine failed\n"); if (W_ERROR_EQUAL(result,WERR_MACHINE_LOCKED)) - d_printf("\nMachine locked, use -f switch to force\n"); + d_fprintf(stderr, "\nMachine locked, use -f switch to force\n"); else - d_printf("\nresult was: %s\n", dos_errstr(result)); + d_fprintf(stderr, "\nresult was: %s\n", dos_errstr(result)); } return werror_to_ntstatus(result); @@ -5293,8 +5293,10 @@ static NTSTATUS vampire_trusted_domain(struct rpc_pipe_client *pipe_hnd, goto done; } +#ifdef DEBUG_PASSWORD DEBUG(100,("sucessfully vampired trusted domain [%s], sid: [%s], password: [%s]\n", trusted_dom_name, sid_string_static(&dom_sid), cleartextpwd)); +#endif done: SAFE_FREE(cleartextpwd); @@ -5632,12 +5634,12 @@ static int rpc_trustdom_list(int argc, const char **argv) if (remote_cli) { /* query for domain's sid */ if (run_rpc_command(remote_cli, PI_LSARPC, 0, rpc_query_domain_sid, argc, argv)) - d_printf("couldn't get domain's sid\n"); + d_fprintf(stderr, "couldn't get domain's sid\n"); cli_shutdown(remote_cli); } else { - d_printf("domain controller is not responding\n"); + d_fprintf(stderr, "domain controller is not responding\n"); }; }; diff --git a/source/utils/net_rpc_join.c b/source/utils/net_rpc_join.c index 12e51a85d17..6a5a7559c3a 100644 --- a/source/utils/net_rpc_join.c +++ b/source/utils/net_rpc_join.c @@ -202,14 +202,14 @@ int net_rpc_join_newstyle(int argc, const char **argv) if (!NT_STATUS_IS_OK(result) && !NT_STATUS_EQUAL(result, NT_STATUS_USER_EXISTS)) { - d_printf("Creation of workstation account failed\n"); + d_fprintf(stderr, "Creation of workstation account failed\n"); /* If NT_STATUS_ACCESS_DENIED then we have a valid username/password combo but the user does not have administrator access. */ if (NT_STATUS_V(result) == NT_STATUS_V(NT_STATUS_ACCESS_DENIED)) - d_printf("User specified does not have administrator privileges\n"); + d_fprintf(stderr, "User specified does not have administrator privileges\n"); goto done; } @@ -317,7 +317,7 @@ int net_rpc_join_newstyle(int argc, const char **argv) if ( NT_STATUS_EQUAL(result, NT_STATUS_ACCESS_DENIED) && (sec_channel_type == SEC_CHAN_BDC) ) { - d_printf("Please make sure that no computer account\n" + d_fprintf(stderr, "Please make sure that no computer account\n" "named like this machine (%s) exists in the domain\n", global_myname()); } @@ -338,7 +338,7 @@ int net_rpc_join_newstyle(int argc, const char **argv) if ( NT_STATUS_EQUAL(result, NT_STATUS_ACCESS_DENIED) && (sec_channel_type == SEC_CHAN_BDC) ) { - d_printf("Please make sure that no computer account\n" + d_fprintf(stderr, "Please make sure that no computer account\n" "named like this machine (%s) exists in the domain\n", global_myname()); } diff --git a/source/utils/net_rpc_printer.c b/source/utils/net_rpc_printer.c index d8f3099dec8..5e282403a24 100644 --- a/source/utils/net_rpc_printer.c +++ b/source/utils/net_rpc_printer.c @@ -403,14 +403,14 @@ NTSTATUS net_copy_fileattr(TALLOC_CTX *mem_ctx, /* closing files */ if (!cli_close(cli_share_src, fnum_src)) { - d_printf("could not close %s on originating server: %s\n", + d_fprintf(stderr, "could not close %s on originating server: %s\n", is_file?"file":"dir", cli_errstr(cli_share_src)); nt_status = cli_nt_error(cli_share_src); goto out; } if (!cli_close(cli_share_dst, fnum_dst)) { - d_printf("could not close %s on destination server: %s\n", + d_fprintf(stderr, "could not close %s on destination server: %s\n", is_file?"file":"dir", cli_errstr(cli_share_dst)); nt_status = cli_nt_error(cli_share_dst); goto out; @@ -504,7 +504,7 @@ NTSTATUS net_copy_file(TALLOC_CTX *mem_ctx, /* allocate memory */ if (!(data = (char *)SMB_MALLOC(read_size))) { - d_printf("malloc fail for size %d\n", read_size); + d_fprintf(stderr, "malloc fail for size %d\n", read_size); nt_status = NT_STATUS_NO_MEMORY; goto out; } @@ -538,7 +538,7 @@ NTSTATUS net_copy_file(TALLOC_CTX *mem_ctx, nread + start, n); if (n != ret) { - d_printf("Error writing file: %s\n", + d_fprintf(stderr, "Error writing file: %s\n", cli_errstr(cli_share_dst)); nt_status = cli_nt_error(cli_share_dst); goto out; @@ -561,7 +561,7 @@ NTSTATUS net_copy_file(TALLOC_CTX *mem_ctx, } if (!cli_chkpath(cli_share_dst, dst_name)) { - d_printf("cannot check for directory %s: %s\n", + d_fprintf(stderr, "cannot check for directory %s: %s\n", dst_name, cli_errstr(cli_share_dst)); goto out; } @@ -570,14 +570,14 @@ NTSTATUS net_copy_file(TALLOC_CTX *mem_ctx, /* closing files */ if (!cli_close(cli_share_src, fnum_src)) { - d_printf("could not close file on originating server: %s\n", + d_fprintf(stderr, "could not close file on originating server: %s\n", cli_errstr(cli_share_src)); nt_status = cli_nt_error(cli_share_src); goto out; } if (is_file && !cli_close(cli_share_dst, fnum_dst)) { - d_printf("could not close file on destination server: %s\n", + d_fprintf(stderr, "could not close file on destination server: %s\n", cli_errstr(cli_share_dst)); nt_status = cli_nt_error(cli_share_dst); goto out; @@ -704,7 +704,7 @@ static NTSTATUS check_arch_dir(struct cli_state *cli_share, const char *short_ar } if (!cli_chkpath(cli_share, dir)) { - d_printf("cannot check %s: %s\n", + d_fprintf(stderr, "cannot check %s: %s\n", dir, cli_errstr(cli_share)); goto out; } @@ -859,13 +859,13 @@ static BOOL net_spoolss_open_printer_ex(struct rpc_pipe_client *pipe_hnd, /* be more verbose */ if (W_ERROR_V(result) == W_ERROR_V(WERR_ACCESS_DENIED)) { - d_printf("no access to printer [%s] on [%s] for user [%s] granted\n", + d_fprintf(stderr, "no access to printer [%s] on [%s] for user [%s] granted\n", printername2, servername, username); return False; } if (!W_ERROR_IS_OK(result)) { - d_printf("cannot open printer %s on server %s: %s\n", + d_fprintf(stderr, "cannot open printer %s on server %s: %s\n", printername2, servername, dos_errstr(result)); return False; } @@ -2134,9 +2134,9 @@ NTSTATUS rpc_printer_migrate_printers_internals(const DOM_SID *domain_sid, if (W_ERROR_IS_OK(result)) d_printf ("printer [%s] successfully added.\n", printername); else if (W_ERROR_V(result) == W_ERROR_V(WERR_PRINTER_ALREADY_EXISTS)) - d_printf ("printer [%s] already exists.\n", printername); + d_fprintf (stderr, "printer [%s] already exists.\n", printername); else { - printf ("could not create printer\n"); + d_fprintf (stderr, "could not create printer [%s]\n", printername); goto done; } diff --git a/source/utils/net_rpc_registry.c b/source/utils/net_rpc_registry.c index 289fb59fea3..9852fe4a94f 100644 --- a/source/utils/net_rpc_registry.c +++ b/source/utils/net_rpc_registry.c @@ -105,7 +105,7 @@ static NTSTATUS rpc_registry_enumerate_internal(const DOM_SID *domain_sid, } if ( !reg_split_hive( argv[0], &hive, subpath ) ) { - d_printf("invalid registry path\n"); + d_fprintf(stderr, "invalid registry path\n"); return NT_STATUS_OK; } @@ -113,18 +113,17 @@ static NTSTATUS rpc_registry_enumerate_internal(const DOM_SID *domain_sid, result = rpccli_reg_connect(pipe_hnd, mem_ctx, hive, MAXIMUM_ALLOWED_ACCESS, &pol_hive ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Unable to connect to remote registry\n"); + d_fprintf(stderr, "Unable to connect to remote registry\n"); return werror_to_ntstatus(result); } if ( strlen( subpath ) != 0 ) { result = rpccli_reg_open_entry(pipe_hnd, mem_ctx, &pol_hive, subpath, MAXIMUM_ALLOWED_ACCESS, &pol_key ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Unable to open [%s]\n", argv[0]); + d_fprintf(stderr, "Unable to open [%s]\n", argv[0]); return werror_to_ntstatus(result); } } - memcpy( &pol_key, &pol_hive, sizeof(POLICY_HND) ); /* get the subkeys */ @@ -224,7 +223,7 @@ static NTSTATUS rpc_registry_save_internal(const DOM_SID *domain_sid, } if ( !reg_split_hive( argv[0], &hive, subpath ) ) { - d_printf("invalid registry path\n"); + d_fprintf(stderr, "invalid registry path\n"); return NT_STATUS_OK; } @@ -232,19 +231,19 @@ static NTSTATUS rpc_registry_save_internal(const DOM_SID *domain_sid, result = rpccli_reg_connect(pipe_hnd, mem_ctx, hive, MAXIMUM_ALLOWED_ACCESS, &pol_hive ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Unable to connect to remote registry\n"); + d_fprintf(stderr, "Unable to connect to remote registry\n"); return werror_to_ntstatus(result); } result = rpccli_reg_open_entry(pipe_hnd, mem_ctx, &pol_hive, subpath, MAXIMUM_ALLOWED_ACCESS, &pol_key ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Unable to open [%s]\n", argv[0]); + d_fprintf(stderr, "Unable to open [%s]\n", argv[0]); return werror_to_ntstatus(result); } result = rpccli_reg_save_key(pipe_hnd, mem_ctx, &pol_key, argv[1] ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Unable to save [%s] to %s:%s\n", argv[0], cli->desthost, argv[1]); + d_fprintf(stderr, "Unable to save [%s] to %s:%s\n", argv[0], cli->desthost, argv[1]); } @@ -330,7 +329,7 @@ static BOOL dump_registry_tree( REGF_FILE *file, REGF_NK_REC *nk, const char *pa d_printf("\n"); dump_registry_tree( file, key, regpath ); } - + return True; } @@ -402,7 +401,7 @@ static int rpc_registry_dump( int argc, const char **argv ) d_printf("Opening %s....", argv[0]); if ( !(registry = regfio_open( argv[0], O_RDONLY, 0)) ) { - d_printf("Failed to open %s for reading\n", argv[0]); + d_fprintf(stderr, "Failed to open %s for reading\n", argv[0]); return 1; } d_printf("ok\n"); @@ -433,6 +432,7 @@ static int rpc_registry_copy( int argc, const char **argv ) { REGF_FILE *infile, *outfile; REGF_NK_REC *nk; + int result = 1; if (argc != 2 ) { d_printf("Usage: net rpc copy <srcfile> <newfile>\n"); @@ -441,15 +441,15 @@ static int rpc_registry_copy( int argc, const char **argv ) d_printf("Opening %s....", argv[0]); if ( !(infile = regfio_open( argv[0], O_RDONLY, 0 )) ) { - d_printf("Failed to open %s for reading\n", argv[0]); + d_fprintf(stderr, "Failed to open %s for reading\n", argv[0]); return 1; } d_printf("ok\n"); d_printf("Opening %s....", argv[1]); if ( !(outfile = regfio_open( argv[1], (O_RDWR|O_CREAT|O_TRUNC), (S_IREAD|S_IWRITE) )) ) { - d_printf("Failed to open %s for writing\n", argv[1]); - return 1; + d_fprintf(stderr, "Failed to open %s for writing\n", argv[1]); + goto out_close_infile; } d_printf("ok\n"); @@ -460,15 +460,18 @@ static int rpc_registry_copy( int argc, const char **argv ) write_registry_tree( infile, nk, NULL, outfile, "" ); + result = 0; + d_printf("Closing %s...", argv[1]); regfio_close( outfile ); d_printf("ok\n"); +out_close_infile: d_printf("Closing %s...", argv[0]); regfio_close( infile ); d_printf("ok\n"); - return 0; + return( result); } /******************************************************************** diff --git a/source/utils/net_rpc_rights.c b/source/utils/net_rpc_rights.c index a563475ee10..2c15fef5a09 100644 --- a/source/utils/net_rpc_rights.c +++ b/source/utils/net_rpc_rights.c @@ -335,15 +335,15 @@ static NTSTATUS rpc_rights_list_internal(const DOM_SID *domain_sid, if ( !NT_STATUS_IS_OK(result) ) { if ( NT_STATUS_EQUAL( result, NT_STATUS_NO_SUCH_PRIVILEGE ) ) - d_printf("No such privilege exists: %s.\n", privname); + d_fprintf(stderr, "No such privilege exists: %s.\n", privname); else - d_printf("Error resolving privilege display name [%s].\n", nt_errstr(result)); + d_fprintf(stderr, "Error resolving privilege display name [%s].\n", nt_errstr(result)); continue; } result = enum_accounts_for_privilege(pipe_hnd, mem_ctx, &pol, privname); if (!NT_STATUS_IS_OK(result)) { - d_printf("Error enumerating accounts for privilege %s [%s].\n", + d_fprintf(stderr, "Error enumerating accounts for privilege %s [%s].\n", privname, nt_errstr(result)); continue; } @@ -437,7 +437,7 @@ static NTSTATUS rpc_rights_grant_internal(const DOM_SID *domain_sid, done: if ( !NT_STATUS_IS_OK(result) ) { - d_printf("Failed to grant privileges for %s (%s)\n", + d_fprintf(stderr, "Failed to grant privileges for %s (%s)\n", argv[0], nt_errstr(result)); } @@ -488,7 +488,7 @@ static NTSTATUS rpc_rights_revoke_internal(const DOM_SID *domain_sid, done: if ( !NT_STATUS_IS_OK(result) ) { - d_printf("Failed to revoke privileges for %s (%s)", + d_fprintf(stderr, "Failed to revoke privileges for %s (%s)", argv[0], nt_errstr(result)); } diff --git a/source/utils/net_rpc_samsync.c b/source/utils/net_rpc_samsync.c index f4a0ab90e8f..09e62d9defa 100644 --- a/source/utils/net_rpc_samsync.c +++ b/source/utils/net_rpc_samsync.c @@ -536,7 +536,7 @@ static NTSTATUS fetch_account_info(uint32 rid, SAM_ACCOUNT_INFO *delta) /* try and find the possible unix account again */ if ( !(passwd = Get_Pwnam(account)) ) { - d_printf("Could not create posix account info for '%s'\n", account); + d_fprintf(stderr, "Could not create posix account info for '%s'\n", account); nt_ret = NT_STATUS_NO_SUCH_USER; goto done; } @@ -1847,7 +1847,7 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd, const char *add_ldif = "/tmp/add.ldif", *mod_ldif = "/tmp/mod.ldif"; FILE *add_fd, *mod_fd, *ldif_fd; char sys_cmd[1024]; - int num_alloced = 0, g_index = 0, a_index = 0; + int num_alloced = 0, g_index = 0, a_index = 0, sys_cmd_result; /* Set up array for mapping accounts to groups */ /* Array element is the group rid */ @@ -2068,7 +2068,12 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd, fflush(ldif_fd); } pstr_sprintf(sys_cmd, "cat %s >> %s", add_ldif, ldif_file); - system(sys_cmd); + sys_cmd_result = system(sys_cmd); + if (sys_cmd_result) { + d_fprintf(stderr, "%s failed. Error was (%s)\n", + sys_cmd, strerror(errno)); + return NT_STATUS_UNSUCCESSFUL; + } if (db_type == SAM_DATABASE_DOMAIN) { fprintf(ldif_fd, "# SAM_DATABASE_DOMAIN: MODIFY ENTITIES\n"); @@ -2083,11 +2088,21 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd, fflush(ldif_fd); } pstr_sprintf(sys_cmd, "cat %s >> %s", mod_ldif, ldif_file); - system(sys_cmd); + sys_cmd_result = system(sys_cmd); + if (sys_cmd_result) { + d_fprintf(stderr, "%s failed. Error was (%s)\n", + sys_cmd, strerror(errno)); + return NT_STATUS_UNSUCCESSFUL; + } /* Delete the temporary ldif files */ pstr_sprintf(sys_cmd, "rm -f %s %s", add_ldif, mod_ldif); - system(sys_cmd); + sys_cmd_result = system(sys_cmd); + if (sys_cmd_result) { + d_fprintf(stderr, "%s failed. Error was (%s)\n", + sys_cmd, strerror(errno)); + return NT_STATUS_UNSUCCESSFUL; + } /* Close the ldif file */ fclose(ldif_fd); @@ -2154,11 +2169,11 @@ NTSTATUS rpc_vampire_internals(const DOM_SID *domain_sid, } if (!NT_STATUS_IS_OK(result)) { - d_printf("Failed to fetch domain database: %s\n", + d_fprintf(stderr, "Failed to fetch domain database: %s\n", nt_errstr(result)); if (NT_STATUS_EQUAL(result, NT_STATUS_NOT_SUPPORTED)) - d_printf("Perhaps %s is a Windows 2000 native mode " - "domain?\n", domain_name); + d_fprintf(stderr, "Perhaps %s is a Windows 2000 native " + "mode domain?\n", domain_name); goto fail; } @@ -2170,7 +2185,7 @@ NTSTATUS rpc_vampire_internals(const DOM_SID *domain_sid, } if (!NT_STATUS_IS_OK(result)) { - d_printf("Failed to fetch builtin database: %s\n", + d_fprintf(stderr, "Failed to fetch builtin database: %s\n", nt_errstr(result)); goto fail; } diff --git a/source/utils/net_rpc_service.c b/source/utils/net_rpc_service.c index ed7d1dfab1f..27127a1c3f9 100644 --- a/source/utils/net_rpc_service.c +++ b/source/utils/net_rpc_service.c @@ -40,7 +40,7 @@ static WERROR query_service_state(struct rpc_pipe_client *pipe_hnd, service, SC_RIGHT_SVC_QUERY_STATUS ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to open service. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to open service. [%s]\n", dos_errstr(result)); return result; } @@ -110,7 +110,7 @@ static WERROR control_service(struct rpc_pipe_client *pipe_hnd, service, (SC_RIGHT_SVC_STOP|SC_RIGHT_SVC_PAUSE_CONTINUE) ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to open service. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to open service. [%s]\n", dos_errstr(result)); goto done; } @@ -120,7 +120,7 @@ static WERROR control_service(struct rpc_pipe_client *pipe_hnd, control, &service_status ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Control service request failed. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Control service request failed. [%s]\n", dos_errstr(result)); goto done; } @@ -162,7 +162,7 @@ static NTSTATUS rpc_service_list_internal(const DOM_SID *domain_sid, result = rpccli_svcctl_open_scm(pipe_hnd, mem_ctx, &hSCM, SC_RIGHT_MGR_ENUMERATE_SERVICE ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); return werror_to_ntstatus(result); } @@ -170,7 +170,7 @@ static NTSTATUS rpc_service_list_internal(const DOM_SID *domain_sid, SVCCTL_STATE_ALL, &num_services, &services ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to enumerate services. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to enumerate services. [%s]\n", dos_errstr(result)); goto done; } @@ -219,7 +219,7 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid, result = rpccli_svcctl_open_scm(pipe_hnd, mem_ctx, &hSCM, SC_RIGHT_MGR_ENUMERATE_SERVICE ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); return werror_to_ntstatus(result); } @@ -229,7 +229,7 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid, (SC_RIGHT_SVC_QUERY_STATUS|SC_RIGHT_SVC_QUERY_CONFIG) ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to open service. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to open service. [%s]\n", dos_errstr(result)); goto done; } @@ -237,7 +237,7 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid, result = rpccli_svcctl_query_status(pipe_hnd, mem_ctx, &hService, &service_status ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Query status request failed. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Query status request failed. [%s]\n", dos_errstr(result)); goto done; } @@ -247,7 +247,7 @@ static NTSTATUS rpc_service_status_internal(const DOM_SID *domain_sid, result = rpccli_svcctl_query_config(pipe_hnd, mem_ctx, &hService, &config ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Query config request failed. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Query config request failed. [%s]\n", dos_errstr(result)); goto done; } @@ -318,7 +318,7 @@ static NTSTATUS rpc_service_stop_internal(const DOM_SID *domain_sid, result = rpccli_svcctl_open_scm(pipe_hnd, mem_ctx, &hSCM, SC_RIGHT_MGR_ENUMERATE_SERVICE ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); return werror_to_ntstatus(result); } @@ -356,7 +356,7 @@ static NTSTATUS rpc_service_pause_internal(const DOM_SID *domain_sid, result = rpccli_svcctl_open_scm(pipe_hnd, mem_ctx, &hSCM, SC_RIGHT_MGR_ENUMERATE_SERVICE ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); return werror_to_ntstatus(result); } @@ -394,7 +394,7 @@ static NTSTATUS rpc_service_resume_internal(const DOM_SID *domain_sid, result = rpccli_svcctl_open_scm(pipe_hnd, mem_ctx, &hSCM, SC_RIGHT_MGR_ENUMERATE_SERVICE ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); return werror_to_ntstatus(result); } @@ -433,7 +433,7 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid, result = rpccli_svcctl_open_scm( pipe_hnd, mem_ctx, &hSCM, SC_RIGHT_MGR_ENUMERATE_SERVICE ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to open Service Control Manager. [%s]\n", dos_errstr(result)); return werror_to_ntstatus(result); } @@ -443,7 +443,7 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid, servicename, SC_RIGHT_SVC_START ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Failed to open service. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Failed to open service. [%s]\n", dos_errstr(result)); goto done; } @@ -451,7 +451,7 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid, result = rpccli_svcctl_start_service(pipe_hnd, mem_ctx, &hService, NULL, 0 ); if ( !W_ERROR_IS_OK(result) ) { - d_printf("Query status request failed. [%s]\n", dos_errstr(result)); + d_fprintf(stderr, "Query status request failed. [%s]\n", dos_errstr(result)); goto done; } @@ -460,7 +460,7 @@ static NTSTATUS rpc_service_start_internal(const DOM_SID *domain_sid, if ( W_ERROR_IS_OK(result) && (state == SVCCTL_RUNNING) ) d_printf("Successfully started service: %s\n", servicename ); else - d_printf("Failed to start service: %s [%s]\n", servicename, dos_errstr(result) ); + d_fprintf(stderr, "Failed to start service: %s [%s]\n", servicename, dos_errstr(result) ); done: rpccli_svcctl_close_service(pipe_hnd, mem_ctx, &hService ); diff --git a/source/utils/net_status.c b/source/utils/net_status.c index 31693affe73..d3b1bae276d 100644 --- a/source/utils/net_status.c +++ b/source/utils/net_status.c @@ -74,7 +74,7 @@ static int net_status_sessions(int argc, const char **argv) TDB_DEFAULT, O_RDONLY, 0); if (tdb == NULL) { - d_printf("%s not initialised\n", lock_path("sessionid.tdb")); + d_fprintf(stderr, "%s not initialised\n", lock_path("sessionid.tdb")); return -1; } @@ -186,7 +186,7 @@ static int net_status_shares_parseable(int argc, const char **argv) TDB_DEFAULT, O_RDONLY, 0); if (tdb == NULL) { - d_printf("%s not initialised\n", lock_path("sessionid.tdb")); + d_fprintf(stderr, "%s not initialised\n", lock_path("sessionid.tdb")); return -1; } @@ -197,9 +197,9 @@ static int net_status_shares_parseable(int argc, const char **argv) TDB_DEFAULT, O_RDONLY, 0); if (tdb == NULL) { - d_printf("%s not initialised\n", lock_path("connections.tdb")); - d_printf("This is normal if no SMB client has ever connected " - "to your server.\n"); + d_fprintf(stderr, "%s not initialised\n", lock_path("connections.tdb")); + d_fprintf(stderr, "This is normal if no SMB client has ever " + "connected to your server.\n"); return -1; } @@ -226,10 +226,10 @@ static int net_status_shares(int argc, const char **argv) TDB_DEFAULT, O_RDONLY, 0); if (tdb == NULL) { - d_printf("%s not initialised\n", + d_fprintf(stderr, "%s not initialised\n", lock_path("connections.tdb")); - d_printf("This is normal if no SMB client has ever " - "connected to your server.\n"); + d_fprintf(stderr, "This is normal if no SMB client has " + "ever connected to your server.\n"); return -1; } diff --git a/source/utils/net_time.c b/source/utils/net_time.c index 691adcea00e..1a7116d447d 100644 --- a/source/utils/net_time.c +++ b/source/utils/net_time.c @@ -99,6 +99,7 @@ static int net_time_set(int argc, const char **argv) { time_t t = nettime(NULL); char *cmd; + int result; if (t == 0) return -1; @@ -106,10 +107,13 @@ static int net_time_set(int argc, const char **argv) roll your own. I'm putting this in as it works on a large number of systems and the user has a choice in whether its used or not */ asprintf(&cmd, "/bin/date %s", systime(t)); - system(cmd); + result = system(cmd); + if (result) + d_fprintf(stderr, "%s failed. Error was (%s)\n", + cmd, strerror(errno)); free(cmd); - return 0; + return result; } /* display the time on a remote box in a format ready for /bin/date */ @@ -161,7 +165,7 @@ int net_time(int argc, const char **argv) if (!opt_host && !opt_have_ip && !find_master_ip(opt_target_workgroup, &opt_dest_ip)) { - d_printf("Could not locate a time server. Try "\ + d_fprintf(stderr, "Could not locate a time server. Try "\ "specifying a target host.\n"); net_time_usage(argc,argv); return -1; diff --git a/source/utils/nmblookup.c b/source/utils/nmblookup.c index 09148ad37c3..e88d7862901 100644 --- a/source/utils/nmblookup.c +++ b/source/utils/nmblookup.c @@ -214,6 +214,8 @@ int main(int argc,char *argv[]) *lookup = 0; + load_case_tables(); + setup_logging(argv[0],True); pc = poptGetContext("nmblookup", argc, (const char **)argv, long_options, diff --git a/source/utils/ntlm_auth.c b/source/utils/ntlm_auth.c index 433ba069824..65dbfb71650 100644 --- a/source/utils/ntlm_auth.c +++ b/source/utils/ntlm_auth.c @@ -1752,6 +1752,7 @@ enum { }; /* Samba client initialisation */ + load_case_tables(); dbf = x_stderr; diff --git a/source/utils/pdbedit.c b/source/utils/pdbedit.c index 9c292bd212a..ddf0eea169b 100644 --- a/source/utils/pdbedit.c +++ b/source/utils/pdbedit.c @@ -775,6 +775,8 @@ int main (int argc, char **argv) POPT_TABLEEND }; + load_case_tables(); + setup_logging("pdbedit", True); pc = poptGetContext(NULL, argc, (const char **) argv, long_options, diff --git a/source/utils/smbcacls.c b/source/utils/smbcacls.c index fd1d3cbf89c..cbbd7adaab3 100644 --- a/source/utils/smbcacls.c +++ b/source/utils/smbcacls.c @@ -818,6 +818,8 @@ static struct cli_state *connect_one(const char *share) struct cli_state *cli; + load_case_tables(); + ctx=talloc_init("main"); /* set default debug level to 1 regardless of what smb.conf sets */ diff --git a/source/utils/smbcontrol.c b/source/utils/smbcontrol.c index 25b42a58c1e..b8f7c2f2b55 100644 --- a/source/utils/smbcontrol.c +++ b/source/utils/smbcontrol.c @@ -786,6 +786,8 @@ int main(int argc, const char **argv) POPT_TABLEEND }; + load_case_tables(); + setup_logging(argv[0],True); /* Parse command line arguments using popt */ diff --git a/source/utils/smbcquotas.c b/source/utils/smbcquotas.c index c516fbb2187..f8e33131555 100644 --- a/source/utils/smbcquotas.c +++ b/source/utils/smbcquotas.c @@ -396,7 +396,7 @@ static struct cli_state *connect_one(const char *share) pstring username_str = {0}; pstring path = {0}; pstring set_str = {0}; - enum SMB_QUOTA_TYPE qtype; + enum SMB_QUOTA_TYPE qtype = SMB_INVALID_QUOTA_TYPE; int cmd = 0; static BOOL test_args = False; struct cli_state *cli; @@ -421,6 +421,8 @@ FSQFLAGS:QUOTA_ENABLED/DENY_DISK/LOG_SOFTLIMIT/LOG_HARD_LIMIT", "SETSTRING" }, { NULL } }; + load_case_tables(); + ZERO_STRUCT(qt); /* set default debug level to 1 regardless of what smb.conf sets */ diff --git a/source/utils/smbtree.c b/source/utils/smbtree.c index 00f6a74f2f2..3755b7f8e55 100644 --- a/source/utils/smbtree.c +++ b/source/utils/smbtree.c @@ -203,6 +203,7 @@ static BOOL print_tree(struct user_auth_info *user_info) poptContext pc; /* Initialise samba stuff */ + load_case_tables(); setlinebuf(stdout); diff --git a/source/utils/status.c b/source/utils/status.c index a495d07f047..eeaf83d1772 100644 --- a/source/utils/status.c +++ b/source/utils/status.c @@ -98,18 +98,18 @@ static BOOL Ucrit_addPid( pid_t pid ) return True; } -static void print_share_mode(const struct share_mode_entry *e, char *fname) +static void print_share_mode(const struct share_mode_entry *e, const char *sharepath, const char *fname) { static int count; if (count==0) { d_printf("Locked files:\n"); - d_printf("Pid DenyMode Access R/W Oplock Name\n"); - d_printf("--------------------------------------------------------------\n"); + d_printf("Pid DenyMode Access R/W Oplock SharePath Name\n"); + d_printf("----------------------------------------------------------------------------------------\n"); } count++; if (Ucrit_checkPid(procid_to_pid(&e->pid))) { - d_printf("%s ",procid_str_static(&e->pid)); + d_printf("%-11s ",procid_str_static(&e->pid)); switch (map_share_mode_to_deny_mode(e->share_access, e->private_options)) { case DENY_NONE: d_printf("DENY_NONE "); break; @@ -150,7 +150,7 @@ static void print_share_mode(const struct share_mode_entry *e, char *fname) d_printf("NONE "); } - d_printf(" %s %s",fname, asctime(localtime((time_t *)&e->time.tv_sec))); + d_printf(" %s %s %s",sharepath, fname, asctime(localtime((time_t *)&e->time.tv_sec))); } } @@ -166,7 +166,7 @@ static void print_brl(SMB_DEV_T dev, SMB_INO_T ino, struct process_id pid, } count++; - d_printf("%s %05x:%05x %s %9.0f %9.0f\n", + d_printf("%8s %05x:%05x %s %9.0f %9.0f\n", procid_str_static(&pid), (int)dev, (int)ino, lock_type==READ_LOCK?"R":"W", (double)start, (double)size); @@ -613,6 +613,8 @@ static int traverse_sessionid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, vo POPT_TABLEEND }; + load_case_tables(); + setup_logging(argv[0],True); dbf = x_stderr; diff --git a/source/utils/testparm.c b/source/utils/testparm.c index 0ce838e5c76..f5c835725a4 100644 --- a/source/utils/testparm.c +++ b/source/utils/testparm.c @@ -230,6 +230,8 @@ via the %%o substitution. With encrypted passwords this is not possible.\n", lp_ POPT_TABLEEND }; + load_case_tables(); + pc = poptGetContext(NULL, argc, argv, long_options, POPT_CONTEXT_KEEP_FIRST); poptSetOtherOptionHelp(pc, "[OPTION...] <config-file> [host-name] [host-ip]"); @@ -348,24 +350,7 @@ print command parameter is ignored when using CUPS libraries.\n", if (!silent_mode && !section_name && !parameter_name) { - fprintf(stderr,"Server role: "); - switch(lp_server_role()) { - case ROLE_STANDALONE: - fprintf(stderr,"ROLE_STANDALONE\n"); - break; - case ROLE_DOMAIN_MEMBER: - fprintf(stderr,"ROLE_DOMAIN_MEMBER\n"); - break; - case ROLE_DOMAIN_BDC: - fprintf(stderr,"ROLE_DOMAIN_BDC\n"); - break; - case ROLE_DOMAIN_PDC: - fprintf(stderr,"ROLE_DOMAIN_PDC\n"); - break; - default: - fprintf(stderr,"Unknown -- internal error?\n"); - break; - } + fprintf(stderr,"Server role: %s\n", server_role_str(lp_server_role())); } if (!cname) { diff --git a/source/web/swat.c b/source/web/swat.c index 15612484a35..3806291a6ad 100644 --- a/source/web/swat.c +++ b/source/web/swat.c @@ -103,7 +103,7 @@ static char *stripspaceupper(const char *str) char *p = newstring; while (*str) { - if (*str != ' ') *p++ = toupper(*str); + if (*str != ' ') *p++ = toupper_ascii(*str); ++str; } *p = '\0'; |