Fix clang 9 missing-field-initializer warnings
[amitay/samba.git] / source3 / smbd / pysmbd.c
index 1179b5db0edbb02c3e5477595c637d80c0f2114a..9f5663e2e43e1ff9e0373a5d58626488346628ab 100644 (file)
@@ -193,13 +193,13 @@ static NTSTATUS init_files_struct(TALLOC_CTX *mem_ctx,
        fsp->file_id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
        fsp->vuid = UID_FIELD_INVALID;
        fsp->file_pid = 0;
-       fsp->can_lock = True;
-       fsp->can_read = True;
-       fsp->can_write = True;
+       fsp->fsp_flags.can_lock = true;
+       fsp->fsp_flags.can_read = true;
+       fsp->fsp_flags.can_write = true;
        fsp->print_file = NULL;
-       fsp->modified = False;
+       fsp->fsp_flags.modified = false;
        fsp->sent_oplock_break = NO_BREAK_SENT;
-       fsp->is_directory = S_ISDIR(smb_fname->st.st_ex_mode);
+       fsp->fsp_flags.is_directory = S_ISDIR(smb_fname->st.st_ex_mode);
 
        *_fsp = fsp;
 
@@ -262,6 +262,7 @@ static NTSTATUS get_nt_acl_conn(TALLOC_CTX *mem_ctx,
                                        fname,
                                        NULL,
                                        NULL,
+                                       0,
                                        lp_posix_pathnames() ?
                                                SMB_FILENAME_POSIX_PATH : 0);
 
@@ -270,13 +271,15 @@ static NTSTATUS get_nt_acl_conn(TALLOC_CTX *mem_ctx,
                return NT_STATUS_NO_MEMORY;
        }
 
-       status = SMB_VFS_GET_NT_ACL(conn,
+       status = SMB_VFS_GET_NT_ACL_AT(conn,
+                               conn->cwd_fsp,
                                smb_fname,
                                security_info_wanted,
                                mem_ctx,
                                sd);
        if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0,("get_nt_acl_conn: get_nt_acl returned %s.\n", nt_errstr(status)));
+               DBG_ERR("get_nt_acl_at returned %s.\n",
+                       nt_errstr(status));
        }
 
        TALLOC_FREE(frame);
@@ -427,25 +430,43 @@ static PyObject *py_smbd_set_simple_acl(PyObject *self, PyObject *args, PyObject
        const char * const kwnames[] = {
                "fname",
                "mode",
+               "session_info",
                "gid",
                "service",
                NULL
        };
        char *fname, *service = NULL;
+       PyObject *py_session = Py_None;
+       struct auth_session_info *session_info = NULL;
        int ret;
        int mode, gid = -1;
        SMB_ACL_T acl;
        TALLOC_CTX *frame;
        connection_struct *conn;
 
-       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "si|iz",
+       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO|iz",
                                         discard_const_p(char *, kwnames),
                                         &fname,
                                         &mode,
+                                        &py_session,
                                         &gid,
                                         &service))
                return NULL;
 
+       if (!py_check_dcerpc_type(py_session,
+                                 "samba.dcerpc.auth",
+                                 "session_info")) {
+               return NULL;
+       }
+       session_info = pytalloc_get_type(py_session,
+                                        struct auth_session_info);
+       if (session_info == NULL) {
+               PyErr_Format(PyExc_TypeError,
+                            "Expected auth_session_info for session_info argument got %s",
+                            pytalloc_get_name(py_session));
+               return NULL;
+       }
+
        frame = talloc_stackframe();
 
        acl = make_simple_acl(frame, gid, mode);
@@ -454,7 +475,7 @@ static PyObject *py_smbd_set_simple_acl(PyObject *self, PyObject *args, PyObject
                return NULL;
        }
 
-       conn = get_conn_tos(service, NULL);
+       conn = get_conn_tos(service, session_info);
        if (!conn) {
                TALLOC_FREE(frame);
                return NULL;
@@ -482,6 +503,7 @@ static PyObject *py_smbd_chown(PyObject *self, PyObject *args, PyObject *kwargs)
                "fname",
                "uid",
                "gid",
+               "session_info",
                "service",
                NULL
        };
@@ -489,21 +511,38 @@ static PyObject *py_smbd_chown(PyObject *self, PyObject *args, PyObject *kwargs)
        int ret;
        NTSTATUS status;
        char *fname, *service = NULL;
+       PyObject *py_session = Py_None;
+       struct auth_session_info *session_info = NULL;
        int uid, gid;
        TALLOC_CTX *frame;
        struct files_struct *fsp = NULL;
 
-       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sii|z",
+       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siiO|z",
                                         discard_const_p(char *, kwnames),
                                         &fname,
                                         &uid,
                                         &gid,
+                                        &py_session,
                                         &service))
                return NULL;
 
+       if (!py_check_dcerpc_type(py_session,
+                                 "samba.dcerpc.auth",
+                                 "session_info")) {
+               return NULL;
+       }
+       session_info = pytalloc_get_type(py_session,
+                                        struct auth_session_info);
+       if (session_info == NULL) {
+               PyErr_Format(PyExc_TypeError,
+                            "Expected auth_session_info for session_info argument got %s",
+                            pytalloc_get_name(py_session));
+               return NULL;
+       }
+
        frame = talloc_stackframe();
 
-       conn = get_conn_tos(service, NULL);
+       conn = get_conn_tos(service, session_info);
        if (!conn) {
                TALLOC_FREE(frame);
                return NULL;
@@ -560,26 +599,46 @@ static PyObject *py_smbd_unlink(PyObject *self, PyObject *args, PyObject *kwargs
 {
        const char * const kwnames[] = {
                "fname",
+               "session_info",
                "service",
                NULL
        };
        connection_struct *conn;
        int ret;
        struct smb_filename *smb_fname = NULL;
+       PyObject *py_session = Py_None;
+       struct auth_session_info *session_info = NULL;
        char *fname, *service = NULL;
        TALLOC_CTX *frame;
 
        frame = talloc_stackframe();
 
-       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|z",
+       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sO|z",
                                         discard_const_p(char *, kwnames),
                                         &fname,
+                                        &py_session ,
                                         &service)) {
                TALLOC_FREE(frame);
                return NULL;
        }
 
-       conn = get_conn_tos(service, NULL);
+       if (!py_check_dcerpc_type(py_session,
+                                 "samba.dcerpc.auth",
+                                 "session_info")) {
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+       session_info = pytalloc_get_type(py_session,
+                                        struct auth_session_info);
+       if (session_info == NULL) {
+               PyErr_Format(PyExc_TypeError,
+                            "Expected auth_session_info for session_info argument got %s",
+                            pytalloc_get_name(py_session));
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+
+       conn = get_conn_tos(service, session_info);
        if (!conn) {
                TALLOC_FREE(frame);
                return NULL;
@@ -630,8 +689,8 @@ static PyObject *py_smbd_set_nt_acl(PyObject *self, PyObject *args, PyObject *kw
                "fname",
                "security_info_sent",
                "sd",
-               "service",
                "session_info",
+               "service",
                NULL
        };
 
@@ -647,13 +706,13 @@ static PyObject *py_smbd_set_nt_acl(PyObject *self, PyObject *args, PyObject *kw
 
        frame = talloc_stackframe();
 
-       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO|zO",
+       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siOO|z",
                                         discard_const_p(char *, kwnames),
                                         &fname,
                                         &security_info_sent,
                                         &py_sd,
-                                        &service,
-                                        &py_session)) {
+                                        &py_session,
+                                        &service)) {
                TALLOC_FREE(frame);
                return NULL;
        }
@@ -663,21 +722,19 @@ static PyObject *py_smbd_set_nt_acl(PyObject *self, PyObject *args, PyObject *kw
                return NULL;
        }
 
-       if (py_session != Py_None) {
-               if (!py_check_dcerpc_type(py_session,
-                                         "samba.dcerpc.auth",
-                                         "session_info")) {
-                       TALLOC_FREE(frame);
-                       return NULL;
-               }
-               session_info = pytalloc_get_type(py_session,
-                                                struct auth_session_info);
-               if (!session_info) {
-                       PyErr_Format(PyExc_TypeError,
-                                    "Expected auth_session_info for session_info argument got %s",
-                                    pytalloc_get_name(py_session));
-                       return NULL;
-               }
+       if (!py_check_dcerpc_type(py_session,
+                                 "samba.dcerpc.auth",
+                                 "session_info")) {
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+       session_info = pytalloc_get_type(py_session,
+                                        struct auth_session_info);
+       if (session_info == NULL) {
+               PyErr_Format(PyExc_TypeError,
+                            "Expected auth_session_info for session_info argument got %s",
+                            pytalloc_get_name(py_session));
+               return NULL;
        }
 
        conn = get_conn_tos(service, session_info);
@@ -700,11 +757,13 @@ static PyObject *py_smbd_set_nt_acl(PyObject *self, PyObject *args, PyObject *kw
  */
 static PyObject *py_smbd_get_nt_acl(PyObject *self, PyObject *args, PyObject *kwargs)
 {
-       const char * const kwnames[] = { "fname",
-                                        "security_info_wanted",
-                                        "service",
-                                        "session_info",
-                                        NULL };
+       const char * const kwnames[] = {
+               "fname",
+               "security_info_wanted",
+               "session_info",
+               "service",
+               NULL
+       };
        char *fname, *service = NULL;
        int security_info_wanted;
        PyObject *py_sd;
@@ -718,34 +777,32 @@ static PyObject *py_smbd_get_nt_acl(PyObject *self, PyObject *args, PyObject *kw
 
        ret = PyArg_ParseTupleAndKeywords(args,
                                          kwargs,
-                                         "si|zO",
+                                         "siO|z",
                                          discard_const_p(char *, kwnames),
                                          &fname,
                                          &security_info_wanted,
-                                         &service,
-                                         &py_session);
+                                         &py_session,
+                                         &service);
        if (!ret) {
                TALLOC_FREE(frame);
                return NULL;
        }
 
-       if (py_session != Py_None) {
-               if (!py_check_dcerpc_type(py_session,
-                                         "samba.dcerpc.auth",
-                                         "session_info")) {
-                       TALLOC_FREE(frame);
-                       return NULL;
-               }
-               session_info = pytalloc_get_type(py_session,
-                                                struct auth_session_info);
-               if (!session_info) {
-                       PyErr_Format(
-                               PyExc_TypeError,
-                               "Expected auth_session_info for "
-                               "session_info argument got %s",
-                               pytalloc_get_name(py_session));
-                       return NULL;
-               }
+       if (!py_check_dcerpc_type(py_session,
+                                 "samba.dcerpc.auth",
+                                 "session_info")) {
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+       session_info = pytalloc_get_type(py_session,
+                                        struct auth_session_info);
+       if (session_info == NULL) {
+               PyErr_Format(
+                       PyExc_TypeError,
+                       "Expected auth_session_info for "
+                       "session_info argument got %s",
+                       pytalloc_get_name(py_session));
+               return NULL;
        }
 
        conn = get_conn_tos(service, session_info);
@@ -769,18 +826,31 @@ static PyObject *py_smbd_get_nt_acl(PyObject *self, PyObject *args, PyObject *kw
  */
 static PyObject *py_smbd_set_sys_acl(PyObject *self, PyObject *args, PyObject *kwargs)
 {
-       const char * const kwnames[] = { "fname", "acl_type", "acl", "service", NULL };
+       const char * const kwnames[] = {
+               "fname",
+               "acl_type",
+               "acl",
+               "session_info",
+               "service",
+               NULL
+       };
        TALLOC_CTX *frame = talloc_stackframe();
        int ret;
        char *fname, *service = NULL;
        PyObject *py_acl;
+       PyObject *py_session = Py_None;
+       struct auth_session_info *session_info = NULL;
        struct smb_acl_t *acl;
        int acl_type;
        connection_struct *conn;
 
-       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO|z",
+       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siOO|z",
                                         discard_const_p(char *, kwnames),
-                                        &fname, &acl_type, &py_acl, &service)) {
+                                        &fname,
+                                        &acl_type,
+                                        &py_acl,
+                                        &py_session,
+                                        &service)) {
                TALLOC_FREE(frame);
                return NULL;
        }
@@ -790,7 +860,23 @@ static PyObject *py_smbd_set_sys_acl(PyObject *self, PyObject *args, PyObject *k
                return NULL;
        }
 
-       conn = get_conn_tos(service, NULL);
+       if (!py_check_dcerpc_type(py_session,
+                                 "samba.dcerpc.auth",
+                                 "session_info")) {
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+       session_info = pytalloc_get_type(py_session,
+                                        struct auth_session_info);
+       if (session_info == NULL) {
+               PyErr_Format(PyExc_TypeError,
+                            "Expected auth_session_info for session_info argument got %s",
+                            pytalloc_get_name(py_session));
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+
+       conn = get_conn_tos(service, session_info);
        if (!conn) {
                TALLOC_FREE(frame);
                return NULL;
@@ -814,9 +900,17 @@ static PyObject *py_smbd_set_sys_acl(PyObject *self, PyObject *args, PyObject *k
  */
 static PyObject *py_smbd_get_sys_acl(PyObject *self, PyObject *args, PyObject *kwargs)
 {
-       const char * const kwnames[] = { "fname", "acl_type", "service", NULL };
+       const char * const kwnames[] = {
+               "fname",
+               "acl_type",
+               "session_info",
+               "service",
+               NULL
+       };
        char *fname;
        PyObject *py_acl;
+       PyObject *py_session = Py_None;
+       struct auth_session_info *session_info = NULL;
        struct smb_acl_t *acl;
        int acl_type;
        TALLOC_CTX *frame = talloc_stackframe();
@@ -824,14 +918,33 @@ static PyObject *py_smbd_get_sys_acl(PyObject *self, PyObject *args, PyObject *k
        char *service = NULL;
        struct smb_filename *smb_fname = NULL;
 
-       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "si|z",
+       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "siO|z",
                                         discard_const_p(char *, kwnames),
-                                        &fname, &acl_type, &service)) {
+                                        &fname,
+                                        &acl_type,
+                                        &py_session,
+                                        &service)) {
                TALLOC_FREE(frame);
                return NULL;
        }
 
-       conn = get_conn_tos(service, NULL);
+       if (!py_check_dcerpc_type(py_session,
+                                 "samba.dcerpc.auth",
+                                 "session_info")) {
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+       session_info = pytalloc_get_type(py_session,
+                                        struct auth_session_info);
+       if (session_info == NULL) {
+               PyErr_Format(PyExc_TypeError,
+                            "Expected auth_session_info for session_info argument got %s",
+                            pytalloc_get_name(py_session));
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+
+       conn = get_conn_tos(service, session_info);
        if (!conn) {
                TALLOC_FREE(frame);
                return NULL;
@@ -859,8 +972,15 @@ static PyObject *py_smbd_get_sys_acl(PyObject *self, PyObject *args, PyObject *k
 
 static PyObject *py_smbd_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
 {
-       const char * const kwnames[] = { "fname", "service", NULL };
+       const char * const kwnames[] = {
+               "fname",
+               "session_info",
+               "service",
+               NULL
+       };
        char *fname, *service = NULL;
+       PyObject *py_session = Py_None;
+       struct auth_session_info *session_info = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
        struct connection_struct *conn = NULL;
        struct smb_filename *smb_fname = NULL;
@@ -869,16 +989,33 @@ static PyObject *py_smbd_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
 
        if (!PyArg_ParseTupleAndKeywords(args,
                                         kwargs,
-                                        "s|z",
+                                        "sO|z",
                                         discard_const_p(char *,
                                                         kwnames),
                                         &fname,
+                                        &py_session,
                                         &service)) {
                TALLOC_FREE(frame);
                return NULL;
        }
 
-       conn = get_conn_tos(service, NULL);
+       if (!py_check_dcerpc_type(py_session,
+                                 "samba.dcerpc.auth",
+                                 "session_info")) {
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+       session_info = pytalloc_get_type(py_session,
+                                        struct auth_session_info);
+       if (session_info == NULL) {
+               PyErr_Format(PyExc_TypeError,
+                            "Expected auth_session_info for session_info argument got %s",
+                            pytalloc_get_name(py_session));
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+
+       conn = get_conn_tos(service, session_info);
        if (!conn) {
                TALLOC_FREE(frame);
                return NULL;
@@ -888,6 +1025,7 @@ static PyObject *py_smbd_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
                                        fname,
                                        NULL,
                                        NULL,
+                                       0,
                                        lp_posix_pathnames() ?
                                        SMB_FILENAME_POSIX_PATH : 0);
 
@@ -923,8 +1061,15 @@ static PyObject *py_smbd_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
  */
 static PyObject *py_smbd_create_file(PyObject *self, PyObject *args, PyObject *kwargs)
 {
-       const char * const kwnames[] = { "fname", "service", NULL };
+       const char * const kwnames[] = {
+               "fname",
+               "session_info",
+               "service",
+               NULL
+       };
        char *fname, *service = NULL;
+       PyObject *py_session = Py_None;
+       struct auth_session_info *session_info = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
        struct connection_struct *conn = NULL;
        struct files_struct *fsp = NULL;
@@ -932,16 +1077,33 @@ static PyObject *py_smbd_create_file(PyObject *self, PyObject *args, PyObject *k
 
        if (!PyArg_ParseTupleAndKeywords(args,
                                         kwargs,
-                                        "s|z",
+                                        "sO|z",
                                         discard_const_p(char *,
                                                         kwnames),
                                         &fname,
+                                        &py_session,
                                         &service)) {
                TALLOC_FREE(frame);
                return NULL;
        }
 
-       conn = get_conn_tos(service, NULL);
+       if (!py_check_dcerpc_type(py_session,
+                                 "samba.dcerpc.auth",
+                                 "session_info")) {
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+       session_info = pytalloc_get_type(py_session,
+                                        struct auth_session_info);
+       if (session_info == NULL) {
+               PyErr_Format(PyExc_TypeError,
+                            "Expected auth_session_info for session_info argument got %s",
+                            pytalloc_get_name(py_session));
+               TALLOC_FREE(frame);
+               return NULL;
+       }
+
+       conn = get_conn_tos(service, session_info);
        if (!conn) {
                TALLOC_FREE(frame);
                return NULL;
@@ -1002,7 +1164,7 @@ static PyMethodDef py_smbd_methods[] = {
                PY_DISCARD_FUNC_SIG(PyCFunction, py_smbd_create_file),
                METH_VARARGS|METH_KEYWORDS,
                NULL },
-       { NULL }
+       {0}
 };
 
 void initsmbd(void);