~ubuntu-branches/ubuntu/utopic/duff/utopic-proposed

« back to all changes in this revision

Viewing changes to src/duff.h

  • Committer: Package Import Robot
  • Author(s): Kamal Mostafa
  • Date: 2012-01-29 08:02:46 UTC
  • Revision ID: package-import@ubuntu.com-20120129080246-jd9w62dkx0v5q7r1
Tags: upstream-0.5.2
ImportĀ upstreamĀ versionĀ 0.5.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * duff - Duplicate file finder
 
3
 * Copyright (c) 2005 Camilla Berglund <elmindreda@elmindreda.org>
 
4
 *
 
5
 * This software is provided 'as-is', without any express or implied
 
6
 * warranty. In no event will the authors be held liable for any
 
7
 * damages arising from the use of this software.
 
8
 *
 
9
 * Permission is granted to anyone to use this software for any
 
10
 * purpose, including commercial applications, and to alter it and
 
11
 * redistribute it freely, subject to the following restrictions:
 
12
 *
 
13
 *  1. The origin of this software must not be misrepresented; you
 
14
 *     must not claim that you wrote the original software. If you use
 
15
 *     this software in a product, an acknowledgment in the product
 
16
 *     documentation would be appreciated but is not required.
 
17
 *
 
18
 *  2. Altered source versions must be plainly marked as such, and
 
19
 *     must not be misrepresented as being the original software.
 
20
 *
 
21
 *  3. This notice may not be removed or altered from any source
 
22
 *     distribution.
 
23
 */
 
24
 
 
25
#include "gettext.h"
 
26
 
 
27
/* Shorthand macro for gettext.
 
28
  */
 
29
#define _(String) gettext(String)
 
30
 
 
31
/* Only use __attribute__ on GCC and compatible compilers */
 
32
#ifndef __GNUC__
 
33
#define __attribute__(x)
 
34
#endif
 
35
 
 
36
/* The number of bytes to use as read buffer when reading files.
 
37
 * NOTE: This must be at least 1 and should likely be multiples of 4096.
 
38
 */
 
39
#define BUFFER_SIZE 8192
 
40
 
 
41
/* The number of bytes to sample from the beginning of potential duplicates.
 
42
 * NOTE: This must be at least 1 but likely not larger than 4096.
 
43
 */
 
44
#define SAMPLE_SIZE 4096
 
45
 
 
46
/* The number of bits of file size to use as bucket index.
 
47
 * NOTE: This must be at least 1.
 
48
 */
 
49
#define HASH_BITS 10
 
50
 
 
51
/* Typedefs for structs and enums.
 
52
 */
 
53
typedef enum Status Status;
 
54
typedef enum SymlinkMode SymlinkMode;
 
55
typedef enum Function Function;
 
56
typedef struct File File;
 
57
typedef struct FileList FileList;
 
58
 
 
59
/* Status modes for files.
 
60
 */
 
61
enum Status
 
62
{
 
63
  /* The file has been stat:d but its data has not been touched.
 
64
   */
 
65
  UNTOUCHED,
 
66
  /* The beginning of the file has been hashed.
 
67
   */
 
68
  SAMPLED,
 
69
  /* The entire file has been hashed.
 
70
   */
 
71
  HASHED,
 
72
  /* An error ocurred when reading from the file.
 
73
   */
 
74
  INVALID,
 
75
  /* The file has been reported as a duplicate.
 
76
   */
 
77
  REPORTED
 
78
};
 
79
 
 
80
/* Symlink dereferencing modes.
 
81
 */
 
82
enum SymlinkMode
 
83
{
 
84
  /* Do not dereference any directory symlinks.
 
85
   */
 
86
  NO_SYMLINKS,
 
87
  /* Dereference all directory symlinks encountered.
 
88
   */
 
89
  ALL_SYMLINKS,
 
90
  /* Dereference only those directory symlinks listed on the command line.
 
91
   */
 
92
  ARG_SYMLINKS
 
93
};
 
94
 
 
95
/* Represents a collected file and potential duplicate.
 
96
 */
 
97
struct File
 
98
{
 
99
  char* path;
 
100
  off_t size;
 
101
  dev_t device;
 
102
  ino_t inode;
 
103
  Status status;
 
104
  uint8_t* digest;
 
105
  uint8_t* sample;
 
106
};
 
107
 
 
108
/* Represents a list of files.
 
109
 */
 
110
struct FileList
 
111
{
 
112
  File* files;
 
113
  size_t allocated;
 
114
  size_t available;
 
115
};
 
116
 
 
117
/* Message digest functions.
 
118
 */
 
119
enum Function
 
120
{
 
121
  SHA_1,
 
122
  SHA_256,
 
123
  SHA_384,
 
124
  SHA_512,
 
125
};
 
126
 
 
127
/* These are defined and documented in dufffile.c */
 
128
void init_file(File* file, const char* path, const struct stat* sb);
 
129
void free_file(File* file);
 
130
int compare_files(File* first, File* second);
 
131
void generate_file_digest(File* file);
 
132
 
 
133
/* These are defined and documented in duffutil.c */
 
134
void init_file_list(FileList* list);
 
135
File* alloc_file(FileList* list);
 
136
void empty_file_list(FileList* list);
 
137
void free_file_list(FileList* list);
 
138
char* read_path(FILE* stream);
 
139
void kill_trailing_slashes(char* path);
 
140
size_t get_field_terminator(void);
 
141
void set_digest_function(Function function);
 
142
size_t get_digest_size(void);
 
143
void digest_init(void);
 
144
void digest_update(const void* data, size_t size);
 
145
void digest_finish(uint8_t* digest);
 
146
void error(const char* format, ...) __attribute__((format(printf, 1, 2))) __attribute__((noreturn));
 
147
void warning(const char* format, ...) __attribute__((format(printf, 1, 2)));
 
148
int cluster_header_uses_digest(const char* format);
 
149
void print_cluster_header(const char* format,
 
150
                          unsigned int count,
 
151
                          unsigned int index,
 
152
                          off_t size,
 
153
                          const uint8_t* digest);
 
154
 
 
155
/* These are defined and documented in duffdriver.c */
 
156
void process_args(int argc, char** argv);
 
157