2 This file is part of GNUnet.
3 (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
23 * @brief definitions for the entire fs module
24 * @author Igor Wronsky, Christian Grothoff
29 #include "gnunet_constants.h"
30 #include "gnunet_datastore_service.h"
31 #include "gnunet_dht_service.h"
32 #include "gnunet_fs_service.h"
33 #include "gnunet_block_lib.h"
38 * Size of the individual blocks used for file-sharing.
40 #define DBLOCK_SIZE (32*1024)
43 * Blocksize to use when hashing files for indexing (blocksize for IO,
44 * not for the DBlocks). Larger blocksizes can be more efficient but
45 * will be more disruptive as far as the scheduler is concerned.
47 #define HASHING_BLOCKSIZE (1024 * 128)
51 * @brief content hash key
56 * Hash of the original content, used for encryption.
61 * Hash of the encrypted content, used for querying.
63 GNUNET_HashCode query;
68 * Message sent from a GNUnet (fs) publishing activity to the
69 * gnunet-fs-service to initiate indexing of a file. The service is
70 * supposed to check if the specified file is available and has the
71 * same cryptographic hash. It should then respond with either a
72 * confirmation or a denial.
74 * On OSes where this works, it is considered acceptable if the
75 * service only checks that the path, device and inode match (it can
76 * then be assumed that the hash will also match without actually
77 * computing it; this is an optimization that should be safe given
78 * that the client is not our adversary).
80 struct IndexStartMessage
84 * Message type will be GNUNET_MESSAGE_TYPE_FS_INDEX_START.
86 struct GNUNET_MessageHeader header;
91 uint32_t reserved GNUNET_PACKED;
94 * ID of device containing the file, as seen by the client. This
95 * device ID is obtained using a call like "statvfs" (and converting
96 * the "f_fsid" field to a 32-bit big-endian number). Use 0 if the
97 * OS does not support this, in which case the service must do a
98 * full hash recomputation.
100 uint64_t device GNUNET_PACKED;
103 * Inode of the file on the given device, as seen by the client
104 * ("st_ino" field from "struct stat"). Use 0 if the OS does not
105 * support this, in which case the service must do a full hash
108 uint64_t inode GNUNET_PACKED;
111 * Hash of the file that we would like to index.
113 GNUNET_HashCode file_id;
115 /* this is followed by a 0-terminated
116 * filename of a file with the hash
117 * "file_id" as seen by the client */
123 * Message send by FS service in response to a request
124 * asking for a list of all indexed files.
126 struct IndexInfoMessage
129 * Message type will be
130 * GNUNET_MESSAGE_TYPE_FS_INDEX_LIST_ENTRY.
132 struct GNUNET_MessageHeader header;
137 uint32_t reserved GNUNET_PACKED;
140 * Hash of the indexed file.
142 GNUNET_HashCode file_id;
144 /* this is followed by a 0-terminated
145 * filename of a file with the hash
146 * "file_id" as seen by the client */
152 * Message sent from a GNUnet (fs) unindexing activity to the
153 * gnunet-service-fs to indicate that a file will be unindexed. The
154 * service is supposed to remove the file from the list of indexed
155 * files and response with a confirmation message (even if the file
156 * was already not on the list).
158 struct UnindexMessage
162 * Message type will be
163 * GNUNET_MESSAGE_TYPE_FS_UNINDEX.
165 struct GNUNET_MessageHeader header;
170 uint32_t reserved GNUNET_PACKED;
173 * Hash of the file that we will unindex.
175 GNUNET_HashCode file_id;
181 * Message sent from a GNUnet (fs) search activity to the
182 * gnunet-service-fs to start a search.
188 * Message type will be
189 * GNUNET_MESSAGE_TYPE_FS_START_SEARCH.
191 struct GNUNET_MessageHeader header;
194 * Bitmask with options. Zero for no options, one for loopback-only.
195 * Other bits are currently not defined.
197 int32_t options GNUNET_PACKED;
200 * Type of the content that we're looking for.
202 uint32_t type GNUNET_PACKED;
205 * Desired anonymity level, big-endian.
207 uint32_t anonymity_level GNUNET_PACKED;
210 * If the request is for a DBLOCK or IBLOCK, this is the identity of
211 * the peer that is known to have a response. Set to all-zeros if
212 * such a target is not known (note that even if OUR anonymity
213 * level is >0 we may happen to know the responder's identity;
214 * nevertheless, we should probably not use it for a DHT-lookup
215 * or similar blunt actions in order to avoid exposing ourselves).
217 * If the request is for an SBLOCK, this is the identity of the
218 * pseudonym to which the SBLOCK belongs.
220 * If the request is for a KBLOCK, "target" must be all zeros.
222 GNUNET_HashCode target;
225 * Hash of the keyword (aka query) for KBLOCKs; Hash of
226 * the CHK-encoded block for DBLOCKS and IBLOCKS (aka query)
227 * and hash of the identifier XORed with the target for
228 * SBLOCKS (aka query).
230 GNUNET_HashCode query;
232 /* this is followed by the hash codes of already-known
233 * results (which should hence be excluded from what
234 * the service returns); naturally, this only applies
235 * to queries that can have multiple results, such as
236 * those for KBLOCKS (KSK) and SBLOCKS (SKS) */
241 * Response from FS service with a result for a previous FS search.
242 * Note that queries for DBLOCKS and IBLOCKS that have received a
243 * single response are considered done. This message is transmitted
244 * between peers as well as between the service and a client.
250 * Message type will be GNUNET_MESSAGE_TYPE_FS_PUT.
252 struct GNUNET_MessageHeader header;
255 * Type of the block (in big endian). Should never be zero.
257 uint32_t type GNUNET_PACKED;
260 * When does this result expire?
262 struct GNUNET_TIME_AbsoluteNBO expiration;
264 /* this is followed by the actual encrypted content */