lib/util: remove extra safe_string.h file
[samba.git] / source4 / ntvfs / ipc / vfs_ipc.c
index 8097a67ab9ea5f00aea042bfa13efd16803d0b04..967c80d299591f9b4837947725c3956f5d413ac4 100644 (file)
 #include "lib/socket/socket.h"
 #include "auth/credentials/credentials.h"
 #include "auth/credentials/credentials_krb5.h"
-#include <gssapi/gssapi.h>
+#include "system/kerberos.h"
+#include "system/gssapi.h"
 #include "system/locale.h"
+#include "system/filesys.h"
+
+#undef strncasecmp
 
 /* this is the private structure used to keep the state of an open
    ipc$ connection. It needs to keep information about all open
@@ -251,16 +255,22 @@ static NTSTATUS ipc_open(struct ntvfs_module_context *ntvfs,
        struct tevent_req *subreq;
        const char *fname;
        const char *directory;
-       const struct tsocket_address *client_addr;
-       const struct tsocket_address *server_addr;
+       const struct tsocket_address *remote_client_addr;
+       const struct tsocket_address *local_server_addr;
 
        switch (oi->generic.level) {
        case RAW_OPEN_NTCREATEX:
        case RAW_OPEN_NTTRANS_CREATE:
                fname = oi->ntcreatex.in.fname;
+               while (fname[0] == '\\') fname++;
                break;
        case RAW_OPEN_OPENX:
                fname = oi->openx.in.fname;
+               while (fname[0] == '\\') fname++;
+               if (strncasecmp(fname, "PIPE\\", 5) != 0) {
+                       return NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
+               }
+               while (fname[0] == '\\') fname++;
                break;
        case RAW_OPEN_SMB2:
                fname = oi->smb2.in.fname;
@@ -282,8 +292,6 @@ static NTSTATUS ipc_open(struct ntvfs_module_context *ntvfs,
        p = talloc(h, struct pipe_state);
        NT_STATUS_HAVE_NO_MEMORY(p);
 
-       while (fname[0] == '\\') fname++;
-
        /* check for valid characters in name */
        fname = strlower_talloc(p, fname);
 
@@ -315,16 +323,16 @@ static NTSTATUS ipc_open(struct ntvfs_module_context *ntvfs,
 
        NT_STATUS_NOT_OK_RETURN(status);
 
-       client_addr = ntvfs_get_local_address(ipriv->ntvfs);
-       server_addr = ntvfs_get_remote_address(ipriv->ntvfs);
+       local_server_addr = ntvfs_get_local_address(ipriv->ntvfs);
+       remote_client_addr = ntvfs_get_remote_address(ipriv->ntvfs);
 
        subreq = tstream_npa_connect_send(p,
                                          ipriv->ntvfs->ctx->event_ctx,
                                          directory,
                                          fname,
-                                         client_addr,
+                                         remote_client_addr,
                                          NULL,
-                                         server_addr,
+                                         local_server_addr,
                                          NULL,
                                          state->session_info_transport);
        NT_STATUS_HAVE_NO_MEMORY(subreq);
@@ -731,11 +739,13 @@ static NTSTATUS ipc_close(struct ntvfs_module_context *ntvfs,
                                    struct ipc_private);
        struct pipe_state *p;
 
-       if (io->generic.level != RAW_CLOSE_CLOSE) {
+       if (io->generic.level != RAW_CLOSE_GENERIC) {
                return ntvfs_map_close(ntvfs, req, io);
        }
 
-       p = pipe_state_find(ipriv, io->close.in.file.ntvfs);
+       ZERO_STRUCT(io->generic.out);
+
+       p = pipe_state_find(ipriv, io->generic.in.file.ntvfs);
        if (!p) {
                return NT_STATUS_INVALID_HANDLE;
        }
@@ -1169,12 +1179,12 @@ static NTSTATUS ipc_ioctl_smb2(struct ntvfs_module_context *ntvfs,
        state = talloc(req, struct ipc_ioctl_state);
        NT_STATUS_HAVE_NO_MEMORY(state);
 
-       io->smb2.out._pad       = 0;
+       io->smb2.out.reserved   = 0;
        io->smb2.out.function   = io->smb2.in.function;
-       io->smb2.out.unknown2   = 0;
-       io->smb2.out.unknown3   = 0;
-       io->smb2.out.in         = io->smb2.in.out;
-       io->smb2.out.out = data_blob_talloc(req, NULL, io->smb2.in.max_response_size);
+       io->smb2.out.flags      = 0;
+       io->smb2.out.reserved2  = 0;
+       io->smb2.out.in         = data_blob_null;
+       io->smb2.out.out = data_blob_talloc(req, NULL, io->smb2.in.max_output_response);
        NT_STATUS_HAVE_NO_MEMORY(io->smb2.out.out.data);
 
        state->ipriv = ipriv;
@@ -1289,7 +1299,7 @@ static NTSTATUS ipc_ioctl(struct ntvfs_module_context *ntvfs,
 /*
   initialialise the IPC backend, registering ourselves with the ntvfs subsystem
  */
-NTSTATUS ntvfs_ipc_init(void)
+NTSTATUS ntvfs_ipc_init(TALLOC_CTX *ctx)
 {
        NTSTATUS ret;
        struct ntvfs_ops ops;
@@ -1302,36 +1312,36 @@ NTSTATUS ntvfs_ipc_init(void)
        ops.type = NTVFS_IPC;
 
        /* fill in all the operations */
-       ops.connect = ipc_connect;
-       ops.disconnect = ipc_disconnect;
-       ops.unlink = ipc_unlink;
-       ops.chkpath = ipc_chkpath;
-       ops.qpathinfo = ipc_qpathinfo;
-       ops.setpathinfo = ipc_setpathinfo;
-       ops.open = ipc_open;
-       ops.mkdir = ipc_mkdir;
-       ops.rmdir = ipc_rmdir;
-       ops.rename = ipc_rename;
-       ops.copy = ipc_copy;
-       ops.ioctl = ipc_ioctl;
-       ops.read = ipc_read;
-       ops.write = ipc_write;
-       ops.seek = ipc_seek;
-       ops.flush = ipc_flush;  
-       ops.close = ipc_close;
-       ops.exit = ipc_exit;
-       ops.lock = ipc_lock;
-       ops.setfileinfo = ipc_setfileinfo;
-       ops.qfileinfo = ipc_qfileinfo;
-       ops.fsinfo = ipc_fsinfo;
-       ops.lpq = ipc_lpq;
-       ops.search_first = ipc_search_first;
-       ops.search_next = ipc_search_next;
-       ops.search_close = ipc_search_close;
-       ops.trans = ipc_trans;
-       ops.logoff = ipc_logoff;
-       ops.async_setup = ipc_async_setup;
-       ops.cancel = ipc_cancel;
+       ops.connect_fn = ipc_connect;
+       ops.disconnect_fn = ipc_disconnect;
+       ops.unlink_fn = ipc_unlink;
+       ops.chkpath_fn = ipc_chkpath;
+       ops.qpathinfo_fn = ipc_qpathinfo;
+       ops.setpathinfo_fn = ipc_setpathinfo;
+       ops.open_fn = ipc_open;
+       ops.mkdir_fn = ipc_mkdir;
+       ops.rmdir_fn = ipc_rmdir;
+       ops.rename_fn = ipc_rename;
+       ops.copy_fn = ipc_copy;
+       ops.ioctl_fn = ipc_ioctl;
+       ops.read_fn = ipc_read;
+       ops.write_fn = ipc_write;
+       ops.seek_fn = ipc_seek;
+       ops.flush_fn = ipc_flush;
+       ops.close_fn = ipc_close;
+       ops.exit_fn = ipc_exit;
+       ops.lock_fn = ipc_lock;
+       ops.setfileinfo_fn = ipc_setfileinfo;
+       ops.qfileinfo_fn = ipc_qfileinfo;
+       ops.fsinfo_fn = ipc_fsinfo;
+       ops.lpq_fn = ipc_lpq;
+       ops.search_first_fn = ipc_search_first;
+       ops.search_next_fn = ipc_search_next;
+       ops.search_close_fn = ipc_search_close;
+       ops.trans_fn = ipc_trans;
+       ops.logoff_fn = ipc_logoff;
+       ops.async_setup_fn = ipc_async_setup;
+       ops.cancel_fn = ipc_cancel;
 
        /* register ourselves with the NTVFS subsystem. */
        ret = ntvfs_register(&ops, &vers);