libcli: move ioctl function field defs to smb_constants
[rusty/samba.git] / source4 / ntvfs / print / vfs_print.c
index 82829d759a8ec3e6a93b47639e61c172364378f1..6019e44132525b1af2c5ab91ea3a87148bec0e5a 100644 (file)
@@ -5,7 +5,7 @@
 
    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
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 /*
   this implements the print backend, called by the NTVFS subsystem to
 */
 
 #include "includes.h"
+#include "../libcli/smb/smb_constants.h"
+#include "ntvfs/ntvfs.h"
+#include "param/param.h"
+
+NTSTATUS ntvfs_print_init(void);
 
 /*
   connect to a share - used when a tree_connect operation comes
   in. For printing shares this should check that the spool directory
   is available
 */
-static NTSTATUS print_connect(struct request_context *req, const char *sharename)
+static NTSTATUS print_connect(struct ntvfs_module_context *ntvfs,
+                             struct ntvfs_request *req, union smb_tcon* tcon)
 {
+       ntvfs->ctx->fs_type = talloc_strdup(ntvfs->ctx, "NTFS");
+       NT_STATUS_HAVE_NO_MEMORY(ntvfs->ctx->fs_type);
+
+       ntvfs->ctx->dev_type = talloc_strdup(ntvfs->ctx, "LPT1:");
+       NT_STATUS_HAVE_NO_MEMORY(ntvfs->ctx->dev_type);
+
+       if (tcon->generic.level == RAW_TCON_TCONX) {
+               tcon->tconx.out.fs_type = ntvfs->ctx->fs_type;
+               tcon->tconx.out.dev_type = ntvfs->ctx->dev_type;
+       }
+
        return NT_STATUS_OK;
 }
 
 /*
   disconnect from a share
 */
-static NTSTATUS print_disconnect(struct tcon_context *conn)
+static NTSTATUS print_disconnect(struct ntvfs_module_context *ntvfs)
 {
        return NT_STATUS_OK;
 }
@@ -45,7 +61,9 @@ static NTSTATUS print_disconnect(struct tcon_context *conn)
 /*
   lots of operations are not allowed on printing shares - mostly return NT_STATUS_ACCESS_DENIED
 */
-static NTSTATUS print_unlink(struct request_context *req, struct smb_unlink *unl)
+static NTSTATUS print_unlink(struct ntvfs_module_context *ntvfs,
+                            struct ntvfs_request *req,
+                            union smb_unlink *unl)
 {
        return NT_STATUS_ACCESS_DENIED;
 }
@@ -54,20 +72,26 @@ static NTSTATUS print_unlink(struct request_context *req, struct smb_unlink *unl
 /*
   ioctl - used for job query
 */
-static NTSTATUS print_ioctl(struct request_context *req, struct smb_ioctl *io)
+static NTSTATUS print_ioctl(struct ntvfs_module_context *ntvfs,
+                           struct ntvfs_request *req, union smb_ioctl *io)
 {
        char *p;
 
-       if (io->in.request == IOCTL_QUERY_JOB_INFO) {
+       if (io->generic.level != RAW_IOCTL_IOCTL) {
+               return NT_STATUS_NOT_IMPLEMENTED;
+       }
+
+       if (io->ioctl.in.request == IOCTL_QUERY_JOB_INFO) {
+
                /* a request for the print job id of an open print job */
-               io->out.blob = data_blob_talloc(req->mem_ctx, NULL, 32);
+               io->ioctl.out.blob = data_blob_talloc(req, NULL, 32);
 
-               memset(io->out.blob.data, 0, io->out.blob.length);
+               data_blob_clear(&io->ioctl.out.blob);
 
-               p = io->out.blob.data;
+               p = (char *)io->ioctl.out.blob.data;
                SSVAL(p,0, 1 /* REWRITE: fsp->rap_print_jobid */);
-               push_string(NULL, p+2, lp_netbios_name(), 15, STR_TERMINATE|STR_ASCII);
-               push_string(NULL, p+18, lp_servicename(req->conn->service), 13, STR_TERMINATE|STR_ASCII);
+               push_string(p+2, lpcfg_netbios_name(ntvfs->ctx->lp_ctx), 15, STR_TERMINATE|STR_ASCII);
+               push_string(p+18, ntvfs->ctx->config->name, 13, STR_TERMINATE|STR_ASCII);
                return NT_STATUS_OK;
        }
 
@@ -82,9 +106,11 @@ NTSTATUS ntvfs_print_init(void)
 {
        NTSTATUS ret;
        struct ntvfs_ops ops;
+       NTVFS_CURRENT_CRITICAL_SIZES(vers);
 
        ZERO_STRUCT(ops);
-       
+
+       /* fill in the name and type */
        ops.name = "default";
        ops.type = NTVFS_PRINT;
        
@@ -96,7 +122,7 @@ NTSTATUS ntvfs_print_init(void)
 
        /* register ourselves with the NTVFS subsystem. We register under the name 'default'
           as we wish to be the default backend */
-       ret = register_backend("ntvfs", &ops);
+       ret = ntvfs_register(&ops, &vers);
 
        if (!NT_STATUS_IS_OK(ret)) {
                DEBUG(0,("Failed to register PRINT backend!\n"));