1 /* 2 * MISC.C 3 * 4 * $DragonFly: src/bin/cpdup/misc.c,v 1.8 2006/09/16 18:18:05 dillon Exp $ 5 */ 6 7 #include "cpdup.h" 8 9 void 10 logstd(const char *ctl, ...) 11 { 12 va_list va; 13 14 va_start(va, ctl); 15 vprintf(ctl, va); 16 va_end(va); 17 } 18 19 void 20 logerr(const char *ctl, ...) 21 { 22 va_list va; 23 24 va_start(va, ctl); 25 vfprintf(stderr, ctl, va); 26 va_end(va); 27 } 28 29 char * 30 mprintf(const char *ctl, ...) 31 { 32 char *ptr; 33 va_list va; 34 35 ptr = NULL; 36 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); 43 } 44 45 char * 46 fextract(FILE *fi, int n, int *pc, int skip) 47 { 48 int i; 49 int c; 50 int imax; 51 char *s; 52 53 i = 0; 54 c = *pc; 55 imax = (n < 0) ? 64 : n + 1; 56 57 s = malloc(imax); 58 if (s == NULL) { 59 fprintf(stderr, "out of memory\n"); 60 exit(EXIT_FAILURE); 61 } 62 63 while (c != EOF) { 64 if (n == 0 || (n < 0 && (c == ' ' || c == '\n'))) 65 break; 66 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); 74 } 75 } 76 if (n > 0) 77 --n; 78 c = getc(fi); 79 } 80 if (c == skip && skip != EOF) 81 c = getc(fi); 82 *pc = c; 83 s[i] = 0; 84 return(s); 85 } 86 87 void 88 fatal(const char *ctl, ...) 89 { 90 va_list va; 91 92 if (ctl == NULL) { 93 puts("cpdup [<options>] src [dest]"); 94 puts(" -v[vv] verbose level (-vv is typical)\n" 95 " -u use unbuffered output for -v[vv]\n" 96 " -I display performance summary\n" 97 " -f force update even if files look the same\n" 98 " -i0 do NOT confirm when removing something\n" 99 " -s0 disable safeties - allow files to overwrite directories\n" 100 " -q quiet operation\n" 101 " -o do not remove any files, just overwrite/add\n" 102 ); 103 puts( 104 #ifndef NOMD5 105 " -m maintain/generate MD5 checkfile on source,\n" 106 " and compare with (optional) destination,\n" 107 " copying if the compare fails\n" 108 " -M file -m+specify MD5 checkfile, else .MD5_CHECKSUMS\n" 109 " copy if md5 check fails\n" 110 #endif 111 " -x use .cpignore as exclusion file\n" 112 " -X file specify exclusion file\n" 113 " Version 1.07 by Matt Dillon and Dima Ruban\n" 114 ); 115 exit(0); 116 } else { 117 va_start(va, ctl); 118 vprintf(ctl, va); 119 va_end(va); 120 puts(""); 121 exit(1); 122 } 123 } 124