HAMMER VFS - Major retooling of the refcount mechanics, and fix a deadlock
[dragonfly.git] / bin / cpdup / misc.c
blob5fb0ff5f8b4a8ef0892e496348a1cfffbdffc44b
1 /*
2 * MISC.C
4 * $DragonFly: src/bin/cpdup/misc.c,v 1.16 2008/09/15 20:13:16 thomas Exp $
5 */
7 #include "cpdup.h"
9 void
10 logstd(const char *ctl, ...)
12 va_list va;
14 va_start(va, ctl);
15 vprintf(ctl, va);
16 va_end(va);
19 void
20 logerr(const char *ctl, ...)
22 va_list va;
24 va_start(va, ctl);
25 vfprintf(stderr, ctl, va);
26 va_end(va);
29 char *
30 mprintf(const char *ctl, ...)
32 char *ptr;
33 va_list va;
35 ptr = NULL;
37 va_start(va, ctl);
38 if (vasprintf(&ptr, ctl, va) < 0)
39 fatal("malloc failed");
40 va_end(va);
41 assert(ptr != NULL);
42 return(ptr);
45 char *
46 fextract(FILE *fi, int n, int *pc, int skip)
48 int i;
49 int c;
50 int imax;
51 char *s;
53 i = 0;
54 c = *pc;
55 imax = (n < 0) ? 64 : n + 1;
57 s = malloc(imax);
58 if (s == NULL) {
59 fprintf(stderr, "out of memory\n");
60 exit(EXIT_FAILURE);
63 while (c != EOF) {
64 if (n == 0 || (n < 0 && (c == ' ' || c == '\n')))
65 break;
67 s[i++] = c;
68 if (i == imax) {
69 imax += 64;
70 s = realloc(s, imax);
71 if (s == NULL) {
72 fprintf(stderr, "out of memory\n");
73 exit(EXIT_FAILURE);
76 if (n > 0)
77 --n;
78 c = getc(fi);
80 if (c == skip && skip != EOF)
81 c = getc(fi);
82 *pc = c;
83 s[i] = 0;
84 return(s);
87 #ifdef DEBUG_MALLOC
89 #undef malloc
90 #undef free
92 struct malloc_info {
93 struct malloc_info *next;
94 struct malloc_info *prev;
95 const char *file;
96 int magic;
97 int line;
100 struct malloc_info DummyInfo = { &DummyInfo, &DummyInfo, NULL, 0, 0 };
101 struct malloc_info *InfoList = &DummyInfo;
103 void *
104 debug_malloc(size_t bytes, const char *file, int line)
106 struct malloc_info *info = malloc(sizeof(*info) + bytes);
108 info->magic = 0x5513A4C2;
109 info->file = file;
110 info->line = line;
112 info->next = InfoList;
113 info->prev = InfoList->prev;
114 info->next->prev = info;
115 info->prev->next = info;
116 return(info + 1);
119 void
120 debug_free(void *ptr)
122 struct malloc_info *info = (struct malloc_info *)ptr - 1;
123 struct malloc_info *scan;
124 static int report;
126 for (scan = DummyInfo.next; scan != &DummyInfo; scan = scan->next) {
127 if (info == scan) {
128 assert(info->magic == 0x5513A4C2);
129 info->magic = 0;
130 info->next->prev = info->prev;
131 info->prev->next = info->next;
132 free(info);
133 break;
136 if (scan == &DummyInfo)
137 free(ptr);
139 if ((++report & 65535) == 0) {
140 printf("--- report\n");
141 for (scan = DummyInfo.next; scan != &DummyInfo; scan = scan->next) {
142 printf("%-15s %d\n", scan->file, scan->line);
147 #endif
149 void
150 fatal(const char *ctl, ...)
152 va_list va;
154 if (ctl == NULL) {
155 puts("cpdup [<options>] src [dest]");
156 puts(" -C request compressed ssh link if remote operation\n"
157 " -v[vv] verbose level (-vv is typical)\n"
158 " -d print directories being traversed\n"
159 " -u use unbuffered output for -v[vv]\n"
160 " -I display performance summary\n"
161 " -f force update even if files look the same\n"
162 " -F<ssh_opt> Add <ssh_opt> to options passed to ssh\n"
163 " -i0 do NOT confirm when removing something\n"
164 " -j0 do not try to recreate CHR or BLK devices\n"
165 " -l force line-buffered stdout/stderr\n"
166 " -s0 disable safeties - allow files to overwrite directories\n"
167 " -q quiet operation\n"
168 " -o do not remove any files, just overwrite/add\n"
170 puts(
171 " -k maintain/generate FSMID checkfile on target,\n"
172 " and compare source FSMIDs against the checkfiles\n"
173 " -K file -k+specify FSMID checkfile, else .FSMID.CHECK\n"
174 #ifndef NOMD5
175 " -m maintain/generate MD5 checkfile on source,\n"
176 " and compare with (optional) destination,\n"
177 " copying if the compare fails\n"
178 " -M file -m+specify MD5 checkfile, else .MD5_CHECKSUMS\n"
179 " copy if md5 check fails\n"
180 #endif
181 " -H path hardlink from path to target instead of copying\n"
182 " source to target, if source matches path.\n"
183 " -V verify file contents even if they appear\n"
184 " to be the same.\n"
185 " -VV same as -V but ignore mtime entirely\n"
186 " -x use .cpignore as exclusion file\n"
187 " -X file specify exclusion file\n"
188 " Version 1.16 by Matt Dillon and Dima Ruban\n"
190 exit(0);
191 } else {
192 va_start(va, ctl);
193 vprintf(ctl, va);
194 va_end(va);
195 puts("");
196 exit(1);