1/* 2 * Copyright 2004-2008, Fran��ois Revol, <revol@free.fr>. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _WEBSEARCHFS_H 6#define _WEBSEARCHFS_H 7 8/* wrappers */ 9#ifdef __HAIKU__ 10 11#include <fs_interface.h> 12#include <fs_info.h> 13#include <private/shared/locks.h> 14#include <NodeMonitor.h> 15#define lock mutex 16#define new_lock mutex_init 17#define free_lock mutex_destroy 18#define LOCK mutex_lock 19#define UNLOCK mutex_unlock 20typedef dev_t nspace_id; 21#endif 22 23#include "lists2.h" 24 25#include <Errors.h> 26#include <sys/stat.h> 27#include <SupportDefs.h> 28 29/* should be more than enough */ 30//#define WEBSEARCHFS_NAME_LEN B_OS_NAME_LENGTH 31//#define WEBSEARCHFS_NAME_LEN 64 /* GR_MAX_NAME */ 32/* some DuckDuckGo results are a bit more than 64 */ 33#define WEBSEARCHFS_NAME_LEN 70 /* GR_MAX_NAME */ 34 35#define WEBSEARCHFS_NAME "websearchfs" 36#define WEBSEARCHFS_PRETTY_NAME "Web Search Bookmark File System" 37 38#define MAX_VNIDS 5000 39 40#ifdef __cplusplus 41extern "C" { 42#endif 43 44struct attr_entry { 45 const char *name; 46 uint32 type; 47 size_t size; 48 void *value; 49}; 50 51#undef ASSERT 52#define ASSERT(op) if (!(op)) panic("ASSERT: %s in %s:%s", #op, __FILE__, __FUNCTION__) 53 54struct mount_fs_params 55{ 56 /* no param */ 57}; 58 59struct fs_file_cookie; 60 61struct fs_node 62{ 63 struct fs_node *nlnext; /* node list */ 64 struct fs_node *qnext; /* query list */ 65 struct fs_node *next; /* next in folder */ 66 struct fs_node *parent, *children; 67 struct fs_file_cookie *opened; /* opened on this node */ 68 69 char name[WEBSEARCHFS_NAME_LEN]; 70 ino_t vnid; 71 lock l; 72 73 int is_perm:1; /* don't delete on last close */ 74 int deleted:1; 75 int qcompleted:1; 76 int hidden:1; /* don't list in readdir */ 77 struct stat st; /* including S_IFDIR in st_mode */ 78 struct duckduckgo_request *request; /* set on root folder for a query */ 79 struct duckduckgo_result *result; /* for query results */ 80 struct attr_entry *attrs_indirect; 81 struct attr_entry attrs[10]; 82 void *data; 83 size_t data_size; 84}; 85 86struct vnidpool; 87 88struct fs_nspace 89{ 90 nspace_id nsid; 91 ino_t rootid; 92 struct vnidpool *vnids; 93 struct fs_node *root; /* fast access for stat time change */ 94 struct fs_node *nodes; 95 struct fs_node *queries; 96 int32 nodecount; /* just for statvfs() */ 97 98 lock l; 99}; 100 101struct fs_file_cookie 102{ 103 struct fs_file_cookie *next; /* must stay here */ 104 struct fs_node *node; 105 int dir_current; /* current entry for readdir() */ 106 int omode; 107 int type; /* S_IF* of the *cookie* */ 108 struct attr_entry *attr; 109}; 110/* just for type */ 111#define S_IFQUERY 00000070000 112 113typedef struct attr_entry attr_entry; 114typedef struct fs_nspace fs_nspace; 115typedef struct fs_node fs_node; 116typedef struct fs_file_cookie fs_file_cookie; 117/* not much different */ 118#define fs_dir_cookie fs_file_cookie 119#define fs_attr_dir_cookie fs_file_cookie 120#define fs_query_cookie fs_file_cookie 121 122ino_t new_vnid(fs_nspace *ns); 123 124int websearchfs_event(fs_nspace *ns, fs_node *node, int flags); 125 126/* used by the requester to publish entries in queries 127 * result = NULL to notify end of list 128 */ 129extern int websearchfs_push_result_to_query(struct duckduckgo_request *request, 130 struct duckduckgo_result *result); 131 132#ifdef __cplusplus 133} 134#endif 135 136#endif 137