/*  kernel_interface.h: interface to fuse and coda kernel mocule.
    Copyright (C) 2006, 2007, 2008, 2009, 2020 Werner Baumann

    This file is part of davfs2.

    davfs2 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 3 of the License, or
    (at your option) any later version.

    davfs2 is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with davfs2; if not, write to the Free Software Foundation,
    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */


#ifndef DAV_KERNEL_INTERFACE_H
#define DAV_KERNEL_INTERFACE_H


/* Function type definitions */
/*===========================*/

/* Call back function to be passed to dav_init_kernel_interface(). Will be
   called to see whether the file system is still mounted.
   return value : 1 is mounted, 0 is not mounted. */
typedef int (*dav_is_mounted_fn)(void);


/* Function prototypes */
/*=====================*/

/* Opens the device for communication with the kernel file system, if possible
   mounts the file system and updates the interface data (dev,
   dav_ran_msgloop_fn, mdata, kernel_fs and buf_size).
   In case of an error it prints an error message and terminates the program.
   dev       : File descriptor of the open device for communication with the
               kernel file system.
   mdata     : That mount data that will be passed to the mount function.
   kernel_fs : Type of the kernel file system to us (fuse or coda). If this
               does not work, the other file system will be tried. The name
               of the file system that is really used is returned.
               If NULL, fuse is tried first.
   buf_size  : Size of the buffer for communication with the kernel file system
               (fuse only). The size passed to this function is checked against
               the requirements of the kernel fs and updated if necessary.
   url       : Server url.
   mpoint    : Mount point.
   mopts     : Mount options.
   owner     : The owner of the file system (fuse only).
   group     : Group the file system belongs to (fuse only).
   mode      : Mode of the root node (fuse only).
   return value : 0: the file system has not yet been mounted
                  1: the file system has been mounted successfully. */
void
dav_init_kernel_interface(int *dev, size_t *buf_size, const char *url,
                          const char *mpoint, const dav_args *args);


/* Message loop for fuse kernel module with major number 7.
   device          : File descriptor of the open fuse device.
   mpoint          : String with the name of the mount point.
   buf_size        : Size of the buffer for communication with the kernel
                     module.
   idle_t          : Time to wait for upcalls before calling dav_tidy_cache().
   is_mounted_fn   : Call back function to check if still mounted.
   keep_on_running : Pointer to run flag.
   dbg             : send debug messages to syslog if dbg != 0 */
void
dav_fuse_loop(int device, char *mpoint, size_t bufsize, time_t idle_time,
              dav_is_mounted_fn is_mounted, volatile int *keep_on_running,
              int dbg);


#endif /* DAV_KERNEL_INTERFACE_H */
