root/src/tools/fs_shell/fd.h
/* 
 * Copyright 2002-2006, Axel Dörfler, axeld@pinc-software.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef _FSSH_FD_H
#define _FSSH_FD_H


#include "vfs.h"


namespace FSShell {


struct file_descriptor;
struct select_sync;
struct vnode;

extern io_context* gKernelIOContext;


struct fd_ops {
        fssh_status_t   (*fd_read)(struct file_descriptor *, fssh_off_t pos,
                                                        void *buffer, fssh_size_t *length);
        fssh_status_t   (*fd_write)(struct file_descriptor *, fssh_off_t pos,
                                                        const void *buffer, fssh_size_t *length);
        fssh_off_t              (*fd_seek)(struct file_descriptor *, fssh_off_t pos,
                                                        int seekType);
        fssh_status_t   (*fd_ioctl)(struct file_descriptor *, uint32_t op,
                                                        void *buffer, fssh_size_t length);
        fssh_status_t   (*fd_select)(struct file_descriptor *, uint8_t event,
                                                        uint32_t ref, struct select_sync *sync);
        fssh_status_t   (*fd_deselect)(struct file_descriptor *, uint8_t event,
                                                        struct select_sync *sync);
        fssh_status_t   (*fd_read_dir)(struct file_descriptor *,
                                                        struct fssh_dirent *buffer, fssh_size_t bufferSize,
                                                        uint32_t *_count);
        fssh_status_t   (*fd_rewind_dir)(struct file_descriptor *);
        fssh_status_t   (*fd_read_stat)(struct file_descriptor *,
                                                        struct fssh_stat *);
        fssh_status_t   (*fd_write_stat)(struct file_descriptor *,
                                                        const struct fssh_stat *, int statMask);
        fssh_status_t   (*fd_close)(struct file_descriptor *);
        void                    (*fd_free)(struct file_descriptor *);
};

struct file_descriptor {
        int32_t                 type;               /* descriptor type */
        int32_t                 ref_count;
        int32_t                 open_count;
        struct fd_ops*  ops;
        union {
                struct vnode*           vnode;
                struct fs_mount*        mount;
        } u;
        void*                   cookie;
        int32_t                 open_mode;
        fssh_off_t              pos;
};


/* Types of file descriptors we can create */

enum fd_types {
        FDTYPE_FILE     = 1,
        FDTYPE_ATTR,
        FDTYPE_DIR,
        FDTYPE_ATTR_DIR,
        FDTYPE_INDEX,
        FDTYPE_INDEX_DIR,
        FDTYPE_QUERY,
        FDTYPE_SOCKET
};

// additional open mode - kernel special
#define FSSH_O_DISCONNECTED 0x80000000

/* Prototypes */

extern file_descriptor* alloc_fd(void);
extern int                              new_fd_etc(struct io_context *,
                                                        struct file_descriptor *, int firstIndex);
extern int                              new_fd(struct io_context *, struct file_descriptor *);
extern file_descriptor* get_fd(struct io_context *, int);
extern void                             close_fd(struct file_descriptor *descriptor);
extern void                             put_fd(struct file_descriptor *descriptor);
extern void                             disconnect_fd(struct file_descriptor *descriptor);
extern void                             inc_fd_ref_count(struct file_descriptor *descriptor);
extern fssh_status_t    select_fd(int fd, uint8_t event, uint32_t ref,
                                                        struct select_sync *sync, bool kernel);
extern fssh_status_t    deselect_fd(int fd, uint8_t event,
                                                        struct select_sync *sync, bool kernel);
extern bool                             fd_is_valid(int fd, bool kernel);
extern vnode*                   fd_vnode(struct file_descriptor *descriptor);

extern bool                             fd_close_on_exec(struct io_context *context, int fd);
extern void                             fd_set_close_on_exec(struct io_context *context, int fd,
                                                        bool closeFD);

static io_context*              get_current_io_context(bool kernel);

/* The prototypes of the (sys|user)_ functions are currently defined in vfs.h */


/* Inlines */

static inline struct io_context *
get_current_io_context(bool /*kernel*/)
{
        return gKernelIOContext;
}


}       // namespace FSShell


#endif /* _FSSH_FD_H */