root/source4/ntvfs/posix/pvfs_seek.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pvfs_seek

   1 /* 
   2    Unix SMB/CIFS implementation.
   3 
   4    POSIX NTVFS backend - seek
   5 
   6    Copyright (C) Andrew Tridgell 2004
   7 
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 3 of the License, or
  11    (at your option) any later version.
  12    
  13    This program is distributed in the hope that it will be useful,
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16    GNU General Public License for more details.
  17    
  18    You should have received a copy of the GNU General Public License
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  20 */
  21 
  22 #include "includes.h"
  23 #include "vfs_posix.h"
  24 
  25 /*
  26   seek in a file
  27 */
  28 NTSTATUS pvfs_seek(struct ntvfs_module_context *ntvfs,
     /* [<][>][^][v][top][bottom][index][help] */
  29                    struct ntvfs_request *req,
  30                    union smb_seek *io)
  31 {
  32         struct pvfs_state *pvfs = talloc_get_type(ntvfs->private_data,
  33                                   struct pvfs_state);
  34         struct pvfs_file *f;
  35         struct pvfs_file_handle *h;
  36         NTSTATUS status;
  37 
  38         f = pvfs_find_fd(pvfs, req, io->lseek.in.file.ntvfs);
  39         if (!f) {
  40                 return NT_STATUS_INVALID_HANDLE;
  41         }
  42         h = f->handle;
  43 
  44         status = NT_STATUS_OK;
  45 
  46         switch (io->lseek.in.mode) {
  47         case SEEK_MODE_START:
  48                 h->seek_offset = io->lseek.in.offset;
  49                 break;
  50 
  51         case SEEK_MODE_CURRENT:
  52                 h->seek_offset += io->lseek.in.offset;
  53                 break;
  54 
  55         case SEEK_MODE_END:
  56                 status = pvfs_resolve_name_fd(pvfs, h->fd, h->name, PVFS_RESOLVE_NO_OPENDB);
  57                 h->seek_offset = h->name->st.st_size + io->lseek.in.offset;
  58                 break;
  59         }
  60 
  61         io->lseek.out.offset = h->seek_offset;
  62 
  63         return status;
  64 }
  65 

/* [<][>][^][v][top][bottom][index][help] */