The branch, master has been updated
       via  2649d654cfb smbd: Make strnorm() static to filename.c
       via  a31ab494cfb vfs: Don't go through strnorm(..., CASE_LOWER)
       via  826ae22c1bd vfs: Fix a typo
       via  6d7f079029a smbd: Use ISDOT/ISDOTDOT
       via  61dd0096c29 smbd: Filter out "::$DATA" for query name information
       via  259a716c5ae smbd: Simplify open_file_ntcreate()
       via  219dc590f89 smbd: Only open base_fsp for non-"::$DATA" streams
       via  7ba970b082c vfs: Use is_named_stream() for checking if we have an 
ADS
       via  6e77185f929 smbd: Use fsp_is_alternate_stream(), we checked for 
fsp!=NULL above
       via  1ef6800ef66 smbd: Slightly simplify openat_pathref_fsp()
       via  6f9c20cc66d vfs: Use fsp_get_pathref_fd() in aio_pthread
       via  ea8198ac29e libsmb: Avoid a call to SMBC_errno()
       via  e1674e108f2 libsmb: Avoid a call to SMBC_errno()
      from  4e464fc96ae vfs_gpfs: use linux oplock specific funcions only when 
available

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 2649d654cfbc13d6285bcf3aaaf3c177054a2b20
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Feb 17 11:24:38 2022 +0100

    smbd: Make strnorm() static to filename.c
    
    The caller in vfs_prealloc was a bit unneeded, and strnorm is only
    called here.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>
    
    Autobuild-User(master): Jeremy Allison <j...@samba.org>
    Autobuild-Date(master): Thu Feb 17 18:11:18 UTC 2022 on sn-devel-184

commit a31ab494cfb99b42af9e05b53ab464c8514508be
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Feb 17 11:19:50 2022 +0100

    vfs: Don't go through strnorm(..., CASE_LOWER)
    
    With a fixed CASE_LOWER we should go directly to the lowerlevel call, this
    makes it more obvious to me.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 826ae22c1bd923dc0e567d5728eb19278966e43c
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Feb 17 11:19:42 2022 +0100

    vfs: Fix a typo
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 6d7f079029a33d4f889925d09468099e05a3221b
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Feb 17 11:10:00 2022 +0100

    smbd: Use ISDOT/ISDOTDOT
    
    This is simpler to read for me
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 61dd0096c295416e2fecb3611d69a5f8c681ef7e
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Feb 11 18:09:56 2022 +0100

    smbd: Filter out "::$DATA" for query name information
    
    Make this piece of code robust against having "::$DATA" passed in.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 259a716c5ae67109c2008b5c1a11f0873bc2d66b
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Feb 11 18:07:42 2022 +0100

    smbd: Simplify open_file_ntcreate()
    
    For streams our caller create_file_unixpath() has already taken care
    of properly initializing fsp->base_fsp, so we can rely on
    fsp_is_alternate_stream() here instead of looking at the file name.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 219dc590f89974bc1c42db287eb1ed280067346e
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Feb 11 18:09:00 2022 +0100

    smbd: Only open base_fsp for non-"::$DATA" streams
    
    "is_named_stream()" is more what we really mean here. Make this line robust
    against callers passing in "::$DATA".
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 7ba970b082cceadfdd86968ad255c3d793164e8f
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Feb 11 16:13:07 2022 +0100

    vfs: Use is_named_stream() for checking if we have an ADS
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 6e77185f92912a42861b3e2377f0a3b1405c2758
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Feb 11 15:59:06 2022 +0100

    smbd: Use fsp_is_alternate_stream(), we checked for fsp!=NULL above
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 1ef6800ef6691938e2ce1e182d5a8ff8c116ac29
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Dec 30 18:04:55 2021 +0100

    smbd: Slightly simplify openat_pathref_fsp()
    
    We don't need to look at the full share-relative path to figure out if
    we have a stream name, the original smb_fname is sufficient for this.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 6f9c20cc66d979bdf1e65b1f6f8d0ad49824961e
Author: Volker Lendecke <v...@samba.org>
Date:   Mon Feb 14 13:30:43 2022 +0100

    vfs: Use fsp_get_pathref_fd() in aio_pthread
    
    We only use the fd as "dirfd" in openat, so we don't need an I/O fd
    here.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit ea8198ac29e4238dc8d457b6c33290dc3fb23143
Author: Volker Lendecke <v...@samba.org>
Date:   Sun Feb 13 09:25:54 2022 +0100

    libsmb: Avoid a call to SMBC_errno()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit e1674e108f2937a00f3cd1ca228b6376638bb8c6
Author: Volker Lendecke <v...@samba.org>
Date:   Sun Feb 13 09:21:47 2022 +0100

    libsmb: Avoid a call to SMBC_errno()
    
    This involves converting cli_print_queue() to NTSTATUS. No caller
    looked at the number of jobs returned.
    
    Review with "git show -b", most of the patch is indentation
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/include/proto.h           |   1 -
 source3/lib/util_str.c            |  12 -----
 source3/libsmb/cliprint.c         | 103 ++++++++++++++++++++++++--------------
 source3/libsmb/libsmb_file.c      |   7 ++-
 source3/libsmb/libsmb_printjob.c  |   8 +--
 source3/libsmb/proto.h            |   4 +-
 source3/modules/vfs_aio_pthread.c |  12 ++---
 source3/modules/vfs_prealloc.c    |   6 ++-
 source3/smbd/filename.c           |   8 +++
 source3/smbd/files.c              |   2 +-
 source3/smbd/mangle_hash2.c       |   6 +--
 source3/smbd/open.c               |   7 +--
 source3/smbd/trans2.c             |   4 +-
 13 files changed, 102 insertions(+), 78 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index 19a9c6b8a01..916032a931d 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -525,7 +525,6 @@ int poll_intr_one_fd(int fd, int events, int timeout, int 
*revents);
 bool next_token(const char **ptr, char *buff, const char *sep, size_t bufsize);
 bool strnequal(const char *s1,const char *s2,size_t n);
 bool strcsequal(const char *s1,const char *s2);
-bool strnorm(char *s, int case_default);
 char *skip_string(const char *base, size_t len, char *buf);
 size_t str_charnum(const char *s);
 bool trim_char(char *s,char cfront,char cback);
diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c
index b1ed43669c0..9362969795e 100644
--- a/source3/lib/util_str.c
+++ b/source3/lib/util_str.c
@@ -52,18 +52,6 @@ bool strnequal(const char *s1,const char *s2,size_t n)
        return(strncasecmp_m(s1,s2,n)==0);
 }
 
-/**
- Convert a string to "normal" form.
-**/
-
-bool strnorm(char *s, int case_default)
-{
-       if (case_default == CASE_UPPER)
-               return strupper_m(s);
-       else
-               return strlower_m(s);
-}
-
 /**
  Skip past a string in a buffer. Buffer may not be
  null terminated. end_ptr points to the first byte after
diff --git a/source3/libsmb/cliprint.c b/source3/libsmb/cliprint.c
index 309a108a72c..c4ee3420e73 100644
--- a/source3/libsmb/cliprint.c
+++ b/source3/libsmb/cliprint.c
@@ -52,16 +52,18 @@ static const char *fix_char_ptr(unsigned int datap, 
unsigned int converter,
 call fn() on each entry in a print queue
 ****************************************************************************/
 
-int cli_print_queue(struct cli_state *cli,
-                   void (*fn)(struct print_job_info *))
+NTSTATUS cli_print_queue(struct cli_state *cli,
+                        void (*fn)(struct print_job_info *))
 {
-       char *rparam = NULL;
-       char *rdata = NULL;
-       char *p;
-       unsigned int rdrcnt, rprcnt;
+       uint8_t *rparam = NULL;
+       uint8_t *rdata = NULL;
+       char *p = NULL;
+       uint32_t rdrcnt, rprcnt;
        char param[1024];
+       int converter;
        int result_code=0;
        int i = -1;
+       NTSTATUS status;
 
        memset(param,'\0',sizeof(param));
 
@@ -82,43 +84,68 @@ int cli_print_queue(struct cli_state *cli,
 
        DEBUG(4,("doing cli_print_queue for %s\n", cli->share));
 
-       if (cli_api(cli,
-                   param, PTR_DIFF(p,param), 1024,  /* Param, length, maxlen */
-                   NULL, 0, CLI_BUFFER_SIZE,            /* data, length, 
maxlen */
-                   &rparam, &rprcnt,                /* return params, length */
-                   &rdata, &rdrcnt)) {               /* return data, length */
-               int converter;
-               result_code = SVAL(rparam,0);
-               converter = SVAL(rparam,2);       /* conversion factor */
-
-               if (result_code == 0) {
-                       struct print_job_info job;
-
-                       p = rdata;
-
-                       for (i = 0; i < SVAL(rparam,4); ++i) {
-                               job.id = SVAL(p,0);
-                               job.priority = SVAL(p,2);
-                               fstrcpy(job.user,
-                                       fix_char_ptr(SVAL(p,4), converter,
-                                                    rdata, rdrcnt));
-                               job.t = make_unix_date3(
-                                       p + 12, 
smb1cli_conn_server_time_zone(cli->conn));
-                               job.size = IVAL(p,16);
-                               fstrcpy(job.name,fix_char_ptr(SVAL(p,24),
-                                                             converter,
-                                                             rdata, rdrcnt));
-                               fn(&job);
-                               p += 28;
-                       }
+       status = cli_trans(
+               talloc_tos(),
+               cli,
+               SMBtrans,          /* trans_cmd */
+               "\\PIPE\\LANMAN",  /* name */
+               0,                 /* fid */
+               0,                 /* function */
+               0,                 /* flags */
+               NULL,              /* setup */
+               0,                 /* num_setup */
+               0,                 /* max_setup */
+               (uint8_t *)param,  /* param */
+               PTR_DIFF(p,param), /* num_param */
+               1024,              /* max_param */
+               NULL,              /* data */
+               0,                 /* num_data */
+               CLI_BUFFER_SIZE,   /* max_data */
+               NULL,              /* recv_flags2 */
+               NULL,              /* rsetup */
+               0,                 /* min_rsetup */
+               NULL,              /* num_rsetup */
+               &rparam,           /* rparam */
+               8,                 /* min_rparam */
+               &rprcnt,           /* num_rparam */
+               &rdata,            /* rdata */
+               0,                 /* min_rdata */
+               &rdrcnt);          /* num_rdata */
+       if (!NT_STATUS_IS_OK(status)) {
+               cli->raw_status = status;
+               return status;
+       }
+
+       result_code = SVAL(rparam,0);
+       converter = SVAL(rparam,2);       /* conversion factor */
+
+       if (result_code == 0) {
+               struct print_job_info job;
+
+               p = (char *)rdata;
+
+               for (i = 0; i < SVAL(rparam,4); ++i) {
+                       job.id = SVAL(p,0);
+                       job.priority = SVAL(p,2);
+                       fstrcpy(job.user,
+                               fix_char_ptr(SVAL(p,4), converter,
+                                            (char *)rdata, rdrcnt));
+                       job.t = make_unix_date3(
+                               p + 12, 
smb1cli_conn_server_time_zone(cli->conn));
+                       job.size = IVAL(p,16);
+                       fstrcpy(job.name,fix_char_ptr(SVAL(p,24),
+                                                     converter,
+                                                     (char *)rdata, rdrcnt));
+                       fn(&job);
+                       p += 28;
                }
        }
 
        /* If any parameters or data were returned, free the storage. */
-       SAFE_FREE(rparam);
-       SAFE_FREE(rdata);
+       TALLOC_FREE(rparam);
+       TALLOC_FREE(rdata);
 
-       return i;
+       return NT_STATUS_OK;
 }
 
 /****************************************************************************
diff --git a/source3/libsmb/libsmb_file.c b/source3/libsmb/libsmb_file.c
index 499be92cb4a..fa301b9fa18 100644
--- a/source3/libsmb/libsmb_file.c
+++ b/source3/libsmb/libsmb_file.c
@@ -197,12 +197,11 @@ SMBC_open_ctx(SMBCCTX *context,
        /* Check if opendir needed ... */
 
        if (!NT_STATUS_IS_OK(status)) {
-               int eno = 0;
-
-               eno = SMBC_errno(context, srv->cli);
                file = smbc_getFunctionOpendir(context)(context, fname);
-               if (!file) errno = eno;
                TALLOC_FREE(frame);
+               if (file == NULL) {
+                       errno = cli_status_to_errno(status);
+               }
                return file;
        }
 
diff --git a/source3/libsmb/libsmb_printjob.c b/source3/libsmb/libsmb_printjob.c
index 813841a9ca9..cb567231fce 100644
--- a/source3/libsmb/libsmb_printjob.c
+++ b/source3/libsmb/libsmb_printjob.c
@@ -194,6 +194,7 @@ SMBC_list_print_jobs_ctx(SMBCCTX *context,
        char *path = NULL;
        uint16_t port = 0;
        TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status;
 
        if (!context || !context->internal->initialized) {
                 errno = EINVAL;
@@ -242,10 +243,11 @@ SMBC_list_print_jobs_ctx(SMBCCTX *context,
                 return -1;  /* errno set by SMBC_server */
         }
 
-        if (cli_print_queue(srv->cli,
-                            (void (*)(struct print_job_info *))fn) < 0) {
-                errno = SMBC_errno(context, srv->cli);
+       status = cli_print_queue(srv->cli,
+                                (void (*)(struct print_job_info *))fn);
+       if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(frame);
+               errno = cli_status_to_errno(status);
                 return -1;
         }
 
diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h
index bda4058dafe..ec66582e28a 100644
--- a/source3/libsmb/proto.h
+++ b/source3/libsmb/proto.h
@@ -801,8 +801,8 @@ NTSTATUS cli_oplock_ack_recv(struct tevent_req *req);
 
 /* The following definitions come from libsmb/cliprint.c  */
 
-int cli_print_queue(struct cli_state *cli,
-                   void (*fn)(struct print_job_info *));
+NTSTATUS cli_print_queue(struct cli_state *cli,
+                        void (*fn)(struct print_job_info *));
 int cli_printjob_del(struct cli_state *cli, int job);
 
 /* The following definitions come from libsmb/cliquota.c  */
diff --git a/source3/modules/vfs_aio_pthread.c 
b/source3/modules/vfs_aio_pthread.c
index 685f91d9f2b..d58e990a666 100644
--- a/source3/modules/vfs_aio_pthread.c
+++ b/source3/modules/vfs_aio_pthread.c
@@ -302,8 +302,8 @@ static struct aio_open_private_data 
*create_private_open_data(
                return NULL;
        }
 
-       if (fsp_get_io_fd(dirfsp) != AT_FDCWD) {
-               opd->dir_fd = fsp_get_io_fd(dirfsp);
+       if (fsp_get_pathref_fd(dirfsp) != AT_FDCWD) {
+               opd->dir_fd = fsp_get_pathref_fd(dirfsp);
        } else {
 #if defined(O_DIRECTORY)
                opd->dir_fd = open(".", O_RDONLY|O_DIRECTORY);
@@ -458,7 +458,7 @@ static int aio_pthread_openat_fn(vfs_handle_struct *handle,
        bool aio_allow_open = lp_parm_bool(
                SNUM(handle->conn), "aio_pthread", "aio open", false);
 
-       if (smb_fname->stream_name != NULL) {
+       if (is_named_stream(smb_fname)) {
                /* Don't handle stream opens. */
                errno = ENOENT;
                return -1;
@@ -473,7 +473,7 @@ static int aio_pthread_openat_fn(vfs_handle_struct *handle,
 
        if (!aio_allow_open) {
                /* aio opens turned off. */
-               return openat(fsp_get_io_fd(dirfsp),
+               return openat(fsp_get_pathref_fd(dirfsp),
                              smb_fname->base_name,
                              flags,
                              mode);
@@ -481,7 +481,7 @@ static int aio_pthread_openat_fn(vfs_handle_struct *handle,
 
        if (!(flags & O_CREAT)) {
                /* Only creates matter. */
-               return openat(fsp_get_io_fd(dirfsp),
+               return openat(fsp_get_pathref_fd(dirfsp),
                              smb_fname->base_name,
                              flags,
                              mode);
@@ -489,7 +489,7 @@ static int aio_pthread_openat_fn(vfs_handle_struct *handle,
 
        if (!(flags & O_EXCL)) {
                /* Only creates with O_EXCL matter. */
-               return openat(fsp_get_io_fd(dirfsp),
+               return openat(fsp_get_pathref_fd(dirfsp),
                              smb_fname->base_name,
                              flags,
                              mode);
diff --git a/source3/modules/vfs_prealloc.c b/source3/modules/vfs_prealloc.c
index 19b142e877b..467f619b8df 100644
--- a/source3/modules/vfs_prealloc.c
+++ b/source3/modules/vfs_prealloc.c
@@ -129,8 +129,10 @@ static int prealloc_openat(struct vfs_handle_struct* 
handle,
        dot = strrchr(smb_fname->base_name, '.');
        if (dot && *++dot) {
                if (strlen(dot) < sizeof(fext)) {
+                       bool ok;
                        strncpy(fext, dot, sizeof(fext));
-                       if (!strnorm(fext, CASE_LOWER)) {
+                       ok = strlower_m(fext);
+                       if (!ok);
                                goto normal_open;
                        }
                }
@@ -158,7 +160,7 @@ static int prealloc_openat(struct vfs_handle_struct* handle,
                return fd;
        }
 
-       /* Prellocate only if the file is being created or replaced. Note that
+       /* Preallocate only if the file is being created or replaced. Note that
         * Samba won't ever pass down O_TRUNC, which is why we have to handle
         * truncate calls specially.
         */
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index ef382b43bd6..00fc3c7ca68 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -418,6 +418,14 @@ NTSTATUS canonicalize_snapshot_path(struct smb_filename 
*smb_fname,
        return NT_STATUS_OK;
 }
 
+static bool strnorm(char *s, int case_default)
+{
+       if (case_default == CASE_UPPER)
+               return strupper_m(s);
+       else
+               return strlower_m(s);
+}
+
 /*
  * Utility function to normalize case on an incoming client filename
  * if required on this connection struct.
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 32c9f00547a..da792a41c6e 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -497,7 +497,7 @@ NTSTATUS openat_pathref_fsp(const struct files_struct 
*dirfsp,
        }
 
        if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
-           && is_ntfs_stream_smb_fname(fsp->fsp_name))
+           && is_ntfs_stream_smb_fname(smb_fname))
        {
                /*
                 * We must use smb_fname here, not fsp->fsp_name
diff --git a/source3/smbd/mangle_hash2.c b/source3/smbd/mangle_hash2.c
index 53e944ef61b..a8cf3527b57 100644
--- a/source3/smbd/mangle_hash2.c
+++ b/source3/smbd/mangle_hash2.c
@@ -443,10 +443,8 @@ static bool is_8_3(const char *name, bool check_case, bool 
allow_wildcards, cons
        char *dot_p;
 
        /* as a special case, the names '.' and '..' are allowable 8.3 names */
-       if (name[0] == '.') {
-               if (!name[1] || (name[1] == '.' && !name[2])) {
-                       return True;
-               }
+       if (ISDOT(name) || (ISDOTDOT(name))) {
+               return true;
        }
 
        /* the simplest test is on the overall length of the
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index ddc9866605e..d32b7b19368 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -4034,8 +4034,9 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
         */
 
        /* Delete streams if create_disposition requires it */
-       if (!new_file_created && clear_ads(create_disposition) &&
-           !is_ntfs_stream_smb_fname(smb_fname)) {
+       if (!new_file_created &&
+           clear_ads(create_disposition) &&
+           !fsp_is_alternate_stream(fsp)) {
                status = delete_all_streams(conn, smb_fname);
                if (!NT_STATUS_IS_OK(status)) {
                        del_share_mode(lck, fsp);
@@ -5664,7 +5665,7 @@ static NTSTATUS create_file_unixpath(connection_struct 
*conn,
        }
 
        if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
-           && is_ntfs_stream_smb_fname(smb_fname))
+           && is_named_stream(smb_fname))
        {
                uint32_t base_create_disposition;
                struct smb_filename *smb_fname_base = NULL;
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index cf5f6fedfdc..ce274d196be 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -5249,7 +5249,7 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
                if (!dos_fname) {
                        return NT_STATUS_NO_MEMORY;
                }
-               if (is_ntfs_stream_smb_fname(smb_fname)) {
+               if (is_named_stream(smb_fname)) {
                        dos_fname = talloc_asprintf(dos_fname, "%s",
                                                    smb_fname->stream_name);
                        if (!dos_fname) {
@@ -5526,7 +5526,7 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
                        }
                        string_replace(nfname, '/', '\\');
 
-                       if (smb_fname->stream_name != NULL) {
+                       if (fsp_is_alternate_stream(fsp)) {
                                const char *s = smb_fname->stream_name;
                                const char *e = NULL;
                                size_t n;


-- 
Samba Shared Repository

Reply via email to