From d6845ac396b1f7ec5bba96b2c0e76ee1e389c754 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sun, 6 Mar 2022 20:34:50 +0000 Subject: [PATCH 01/16] dvd-sector-copy.c: Add option to verify source id. --- dvd-sector-copy.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index ea34461..2017689 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -3,7 +3,7 @@ static void usage(FILE *fp) { fprintf(fp, - "usage: %s [-c] [-B PARAM=VALUE,...] [-R MAP]\n" + "usage: %s [-ci] [-B PARAM=VALUE,...] [-R MAP]\n" "\t[-b OUTMAP] [-r [START]-[END]] DEVICE OUTFILE\n", prog); } @@ -955,7 +955,8 @@ int main(int argc, char *argv[]) struct timeval tv0, tv1; double t, rate, tot; const char *rateunit, *totunit; - char timebuf[TIMESTRMAX]; + char timebuf[TIMESTRMAX], id_in[MAXIDSZ], id_out[MAXIDSZ]; + dvd_reader_t *dvd_out; struct stat st; #ifdef DEBUG const struct file *file; @@ -966,11 +967,12 @@ int main(int argc, char *argv[]) #define f_continue 2u #define f_fixup 4u #define f_stats 8u +#define f_checkid 16u #define f_write 256u set_prog(argv[0]); for (;;) { - opt = getopt(argc, argv, "hB:E:FR:X:b:cr:s"); if (opt < 0) break; + opt = getopt(argc, argv, "hB:E:FR:X:b:cir:s"); if (opt < 0) break; switch (opt) { case 'h': usage(stderr); exit(0); case 'B': @@ -1109,6 +1111,16 @@ int main(int argc, char *argv[]) bail("device `%s' volume size %"PRIu64" not a multiple of %d", device, volsz, SECTORSZ); + if (f&f_checkid) { + open_dvd(outfile, 0, &dvd_out); + if (dvd_id(id_in, dvd, DIF_MUSTIFOHASH, device) || + dvd_id(id_out, dvd_out, DIF_MUSTIFOHASH, device)) + exit(2); + if (STRCMP(id_in, !=, id_out)) + bail("DVD id mismatch: input `%s' is `%s'; output `%s' is `%s'", + device, id_in, outfile, id_out); + } + outfd = open(outfile, O_WRONLY | O_CREAT, 0666); if (outfd < 0) bail_syserr(errno, "failed to create output file `%s'", outfile); -- 2.11.0 From e14e362103f7c571dcf8d7ecf9e6291bdcc3737c Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sun, 6 Mar 2022 20:42:02 +0000 Subject: [PATCH 02/16] dvdrip: Fail if we can't read the `.IFO' hash for the disc id. This may help with the kernel reporting stale medium sizes. --- dvdrip | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvdrip b/dvdrip index 8173906..8ff1d98 100755 --- a/dvdrip +++ b/dvdrip @@ -78,7 +78,7 @@ esac mkdir -p "$tmp/$tag" -discid=$("$DVD_ID" "$dev") +discid=$("$DVD_ID" -I "$dev") if [ -f "$tmp/$tag/discid" ]; then read oldid <"$tmp/$tag/discid" case $force,$oldid in -- 2.11.0 From 8d83b9f6ad70dc0e3970ce15d2a10137eb4140bc Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sun, 6 Mar 2022 23:53:21 +0000 Subject: [PATCH 03/16] dvdrip: Check for the device size apparently changing during the copy. This indicates something going horribly wrong. --- dvdrip | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dvdrip b/dvdrip index 8ff1d98..9634fe0 100755 --- a/dvdrip +++ b/dvdrip @@ -96,6 +96,9 @@ info "copying \`$discid'" echo "$discid" >"$tmp/$tag/discid.new" mv "$tmp/$tag/discid.new" "$tmp/$tag/discid" +if [ -b "$dev" ]; then msz=$(blockdev --getsize64 "$dev") +else msz=nil; fi + echo "$dev" >"$tmp/$tag/device.new" mv "$tmp/$tag/device.new" "$tmp/$tag/device" @@ -152,6 +155,16 @@ if [ ! -f "$tmp/$tag/iso" ]; then if [ -f "$tmp/$tag/badblocks" ]; then fail "bad sectors found: check \`$tmp/$tag/iso', run again if ok" fi + case $msz in + nil) ;; + *) + newmsz=$(blockdev --getsize64 "$dev") + case $newmsz in + $msz) ;; + *) fail "medium size changed ($msz -> $newmsz): try again" ;; + esac + ;; + esac fi rm -f "$tmp/$tag/device" -- 2.11.0 From 4bd4876f5135f4dffd180d7e969dfd89151f4864 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sun, 6 Mar 2022 23:54:02 +0000 Subject: [PATCH 04/16] dvd-sector-copy.c: Export device-size machinery to the library. --- dvd-sector-copy.c | 16 ++-------------- lib.c | 19 +++++++++++++++++++ lib.h | 1 + 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index 2017689..cdd2849 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -940,7 +940,7 @@ int main(int argc, char *argv[]) { unsigned f = 0; const char *p; - uint64_t volsz; + off_t volsz; secaddr pos; off_t off; secaddr start, end, last; @@ -957,7 +957,6 @@ int main(int argc, char *argv[]) const char *rateunit, *totunit; char timebuf[TIMESTRMAX], id_in[MAXIDSZ], id_out[MAXIDSZ]; dvd_reader_t *dvd_out; - struct stat st; #ifdef DEBUG const struct file *file; char fn[MAXFNSZ]; @@ -1092,19 +1091,8 @@ int main(int argc, char *argv[]) } open_dvd(device, &dvdfd, &dvd); - if (fstat(dvdfd, &st)) - bail_syserr(errno, "failed to stat device `%s'", device); - if (S_ISREG(st.st_mode)) { - blksz = SECTORSZ; - volsz = st.st_size; - } else if (S_ISBLK(st.st_mode)) { - if (ioctl(dvdfd, BLKSSZGET, &blksz)) - bail_syserr(errno, "failed to get block size for `%s'", device); - if (ioctl(dvdfd, BLKGETSIZE64, &volsz)) - bail_syserr(errno, "failed to get volume size for `%s'", device); - } else - bail("can't use `%s' as source: expected file or block device", device); + blksz = SECTORSZ; volsz = device_size(dvdfd, device, &blksz); if (blksz != SECTORSZ) bail("device `%s' block size %d /= %d", device, blksz, SECTORSZ); if (volsz%SECTORSZ) diff --git a/lib.c b/lib.c index 80b1507..521af8d 100644 --- a/lib.c +++ b/lib.c @@ -85,6 +85,25 @@ void carefully_fclose(FILE *fp, const char *what) bail_syserr(errno, "error writing %s file", what); } +off_t device_size(int fd, const char *file, int *blksz_out) +{ + struct stat st; + uint64_t volsz; + + if (fstat(fd, &st)) + bail_syserr(errno, "failed to obtain status for `%s'", file); + if (S_ISREG(st.st_mode)) + volsz = st.st_size; + else if (S_ISBLK(st.st_mode)) { + if (ioctl(fd, BLKGETSIZE64, &volsz)) + bail_syserr(errno, "failed to get volume size for `%s'", file); + if (ioctl(fd, BLKSSZGET, blksz_out)) + bail_syserr(errno, "failed to get block size for `%s'", file); + } else + bail("can't read size for `%s': expected file or block device", file); + return ((off_t)volsz); +} + void store_filename(char *buf, ident id) { switch (id_kind(id)) { diff --git a/lib.h b/lib.h index bad7c3b..8a63e58 100644 --- a/lib.h +++ b/lib.h @@ -80,6 +80,7 @@ extern void open_file_on_demand(const char *file, FILE **fp_inout, const char *what); extern void check_write(FILE *fp, const char *what); extern void carefully_fclose(FILE *fp, const char *what); +extern off_t device_size(int fd, const char *file, int *blksz_out); enum { RAW, IFO, VOB, BUP }; typedef uint_least32_t ident; -- 2.11.0 From eac2ed1a81c1c4af7b154ef40627eed7cab9a467 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sun, 6 Mar 2022 23:57:20 +0000 Subject: [PATCH 05/16] chkdvdimg.c: Retrieve device size using the new function. ... which works on block devices as well as ordinary files. --- chkdvdimg.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/chkdvdimg.c b/chkdvdimg.c index 0fbb48e..0adc6df 100644 --- a/chkdvdimg.c +++ b/chkdvdimg.c @@ -96,23 +96,23 @@ static int all_zero_p(const unsigned char *p, size_t sz) static void check_img(const char *file) { int fd = -1; - struct stat st; unsigned char b[SECTORSZ], bb[SECTORSZ]; + off_t volsz; + int blksz; secaddr end; unsigned i, j; fd = open(file, (flags&F_FIX) ? O_RDWR : O_RDONLY); if (fd < 0) { gripe_syserr(2, errno, "failed to open `%s'", file); goto end; } - if (fstat(fd, &st)) { - gripe_syserr(2, errno, "failed to retrieve file status for `%s'", file); - goto end; - } - if (st.st_size%SECTORSZ) { + blksz = SECTORSZ; volsz = device_size(fd, file, &blksz); + if (SECTORSZ != 2048) + { gripe(2, "device sector size %d /= 2048", blksz); goto end; } + if (volsz%SECTORSZ) { gripe(2, "bad length for `%s' -- not whole number of sectors", file); goto end; } - end = st.st_size/SECTORSZ; + end = volsz/SECTORSZ; if (carefully_read(fd, 256*SECTORSZ, b, SECTORSZ, file) || check_anchor_header(b, 256, CAHF_GRIPE | CAHF_FULL, file)) -- 2.11.0 From 040a38df0811338ccb100506cc022da9c8a32176 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 7 Mar 2022 00:36:12 +0000 Subject: [PATCH 06/16] dvd-sector-copy.c: Add missing handler for the `-i' option. --- dvd-sector-copy.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index cdd2849..cb43588 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -1059,6 +1059,7 @@ int main(int argc, char *argv[]) mapfile = optarg; break; case 'c': f |= f_continue; break; + case 'i': f |= f_checkid; break; case 'r': start = 0; end = -1; if (parse_range(optarg, PRF_HYPHEN, &start, &end)) -- 2.11.0 From 323c8d53a7336d950c45771cb99c926a71d7a404 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 7 Mar 2022 12:48:05 +0000 Subject: [PATCH 07/16] chkdvdimg.c: Name the file when reporting too many trailing zeros. --- chkdvdimg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chkdvdimg.c b/chkdvdimg.c index 0adc6df..623c50f 100644 --- a/chkdvdimg.c +++ b/chkdvdimg.c @@ -124,7 +124,7 @@ static void check_img(const char *file) if (bb[0] || !all_zero_p(bb, SECTORSZ)) goto nonzero; } gripe(1, "too many trailing zero sectors: " - "couldn't find backup anchor descriptor"); + "couldn't find backup anchor descriptor in `%s'", file); goto end; nonzero: j = i; -- 2.11.0 From cf556df2bfc8ad5bcb96602ffdeb5d80249acae2 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 7 Mar 2022 23:45:29 +0000 Subject: [PATCH 08/16] dvd-sector-copy.c: Fix botched debugging code. --- dvd-sector-copy.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index cb43588..a05a555 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -335,7 +335,7 @@ static ssize_t read_sectors(secaddr pos, void *buf, secaddr want) if (badblocks.n) { best = 0; lo = 0; hi = badblocks.n; #ifdef DEBUG - progress_clear(); + progress_clear(&progress); printf(";; searching badblocks for %"PRIuSEC" .. %"PRIuSEC"\n", pos, pos + want); #endif @@ -455,7 +455,7 @@ static PRINTF_LIKE(2, 3) va_list ap; va_start(ap, what); - progress_clear(); + progress_clear(&progress); printf(";; recovery buffer ("); vprintf(what, ap); printf("): " @@ -488,7 +488,7 @@ static ssize_t recovery_read_buffer(struct recoverybuf *r, ssize_t n; #ifdef DEBUG - progress_clear(); + progress_clear(&progress); show_recovery_buffer_map(r, "begin(%"PRIuSEC", %"PRIuSEC")", pos, want); #endif @@ -510,7 +510,7 @@ static ssize_t recovery_read_buffer(struct recoverybuf *r, } else if (pos > r->pos + r->end) { r->pos = pos; r->start = r->end = 0; #ifdef DEBUG -p show_recovery_buffer_map(r, "cleared; beyond previous region"); + show_recovery_buffer_map(r, "cleared; beyond previous region"); #endif } else if (pos + want > r->pos + r->sz) { diff = (pos + want) - (r->pos + r->sz); -- 2.11.0 From 7763378f512e3123c1eaa489f7baff1aef8c5e55 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 7 Mar 2022 23:45:57 +0000 Subject: [PATCH 09/16] dvd-sector-copy.c: Eliminate unused variable. --- dvd-sector-copy.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index a05a555..3c779bf 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -948,7 +948,6 @@ int main(int argc, char *argv[]) const char *device, *outfile; struct badblock *bad; int opt, blksz; - unsigned n; size_t i; FILE *fp; struct buf buf = BUF_INIT; @@ -1148,7 +1147,7 @@ int main(int argc, char *argv[]) qsort(eventq.v, eventq.n, sizeof(struct event), compare_event); - f &= ~f_write; start = 0; n = 0; + f &= ~f_write; start = 0; for (i = 0; i < eventq.n; i++) { ev = &eventq.v[i]; switch (ev->ev) { @@ -1156,7 +1155,7 @@ int main(int argc, char *argv[]) if (f&f_write) bail("overlapping ranges: range from %"PRIuSEC" still open at %"PRIuSEC"", start, ev->pos); - n++; f |= f_write; start = ev->pos; + f |= f_write; start = ev->pos; break; case EV_STOP: f &= ~f_write; @@ -1177,7 +1176,7 @@ int main(int argc, char *argv[]) eventq.n = i; if (f&f_fixup) { put_event(EV_WRITE, 0, start); - n++; f |= f_write; + f |= f_write; } if (f&f_write) { nsectors += limit - start; -- 2.11.0 From d366dab789a3ed1f799e862e6906ee390dba27b3 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 7 Mar 2022 23:46:29 +0000 Subject: [PATCH 10/16] dvd-sector-copy.c: Dump the event queue before we start processing it. --- dvd-sector-copy.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index 3c779bf..833d8bd 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -936,6 +936,39 @@ end: return (rc); } +#ifdef DEBUG +static void dump_eventq(const char *what) +{ + unsigned i; + const struct event *ev; + char fn[MAXFNSZ]; + + printf("\n;; event dump (%s):\n", what); + for (i = 0; i < eventq.n; i++) { + ev = &eventq.v[i]; + switch (ev->ev) { + case EV_BEGIN: + store_filename(fn, filetab.v[ev->file].id); + printf(";; %8"PRIuSEC": begin %s\n", ev->pos, fn); + break; + case EV_END: + store_filename(fn, filetab.v[ev->file].id); + printf(";; %8"PRIuSEC": end %s\n", ev->pos, fn); + break; + case EV_WRITE: + printf(";; %8"PRIuSEC": write\n", ev->pos); + break; + case EV_STOP: + printf(";; %8"PRIuSEC": stop\n", ev->pos); + break; + default: + printf(";; %8"PRIuSEC": ?%u\n", ev->pos, ev->ev); + break; + } + } +} +#endif + int main(int argc, char *argv[]) { unsigned f = 0; @@ -1163,6 +1196,9 @@ int main(int argc, char *argv[]) } } +#ifdef DEBUG + dump_eventq("initial"); +#endif f &= ~f_write; start = 0; for (i = 0; i < eventq.n; i++) { ev = &eventq.v[i]; @@ -1174,6 +1210,9 @@ int main(int argc, char *argv[]) if (f&f_fixup) start = ev->pos; } eventq.n = i; +#ifdef DEBUG + dump_eventq("trimmed"); +#endif if (f&f_fixup) { put_event(EV_WRITE, 0, start); f |= f_write; @@ -1182,6 +1221,9 @@ int main(int argc, char *argv[]) nsectors += limit - start; put_event(EV_STOP, 0, limit); } +#ifdef DEBUG + dump_eventq("final"); +#endif copy_progress.render = render_copy_progress; progress_additem(&progress, ©_progress); -- 2.11.0 From 627fa6be07e6469245881c1b53b0f565ff6f6011 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 7 Mar 2022 23:46:52 +0000 Subject: [PATCH 11/16] dvd-sector-copy.c: Report final statistics correctly. --- dvd-sector-copy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index 833d8bd..cd45710 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -1298,7 +1298,7 @@ int main(int argc, char *argv[]) if (f&f_stats) { gettimeofday(&tv1, 0); t = tvdiff(&tv0, &tv1); - if (nsectors == limit - start) { ndone -= start; nsectors -= start; } + if (nsectors == limit) { ndone -= start; nsectors -= start; } tot = scale_bytes((double)nsectors*SECTORSZ, &totunit); rate = scale_bytes((double)nsectors*SECTORSZ/t, &rateunit); moan("all done: %.1f %sB in %s -- %.1f %sB/s", -- 2.11.0 From 410341025e517d40adc6e2efe122873a8b2c3657 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 7 Mar 2022 23:47:20 +0000 Subject: [PATCH 12/16] dvd-sector-copy.c: Truncate the event list before processing a lost `stop'. --- dvd-sector-copy.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index cd45710..fe8da21 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -1202,11 +1202,9 @@ int main(int argc, char *argv[]) f &= ~f_write; start = 0; for (i = 0; i < eventq.n; i++) { ev = &eventq.v[i]; - switch (ev->ev) { - case EV_WRITE: start = ev->pos; f |= f_write; break; - case EV_STOP: nsectors += ev->pos - start; f &= ~f_write; break; - } + if (ev->ev == EV_WRITE) { start = ev->pos; f |= f_write; } if (ev->pos >= limit) break; + if (ev->ev == EV_STOP) { nsectors += ev->pos - start; f &= ~f_write; } if (f&f_fixup) start = ev->pos; } eventq.n = i; -- 2.11.0 From 58062d28e9b92cda624743d8a391fec22dfe51c1 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Wed, 9 Mar 2022 11:34:04 +0000 Subject: [PATCH 13/16] dvdrip-upload: Fix self-call the case where there's no daemon running. --- dvdrip-upload | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dvdrip-upload b/dvdrip-upload index f75f414..b343e7b 100755 --- a/dvdrip-upload +++ b/dvdrip-upload @@ -41,12 +41,12 @@ case $lockedp,$listen in echo check >"$tmp/upload.wakeup" exit 0 else - exec locking "$tmp/upload.lock" "$0" "${opts+-$opts}" + exec locking "$tmp/upload.lock" "$0" ${opts:+"-$opts"} fi exit 2 ;; nil,t) - exec locking -f "$tmp/upload.lock" "$0" "${opts+-$opts}" + exec locking -f "$tmp/upload.lock" "$0" ${opts:+"-$opts"} exit 2 ;; esac -- 2.11.0 From 502323844014498c5123e462f85ef56af9465f6c Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Fri, 11 Mar 2022 11:40:16 +0000 Subject: [PATCH 14/16] dvd-sector-copy.c: Wrap long line properly. --- dvd-sector-copy.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index fe8da21..03310a0 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -1186,7 +1186,8 @@ int main(int argc, char *argv[]) switch (ev->ev) { case EV_WRITE: if (f&f_write) - bail("overlapping ranges: range from %"PRIuSEC" still open at %"PRIuSEC"", + bail("overlapping ranges: range from %"PRIuSEC" " + "still open at %"PRIuSEC"", start, ev->pos); f |= f_write; start = ev->pos; break; -- 2.11.0 From 50c72655176127c8347fa668091b02d4649320f6 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Fri, 11 Mar 2022 11:40:40 +0000 Subject: [PATCH 15/16] dvd-sector-copy.c: Show file ends in the dump. --- dvd-sector-copy.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index 03310a0..f0800c8 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -1174,7 +1174,8 @@ int main(int argc, char *argv[]) for (i = 0; i < filetab.n; i++) { file = &filetab.v[i]; store_filename(fn, file->id); - printf(";;\t%8"PRIuSEC" %s\n", file->start, fn); + printf(";;\t%8"PRIuSEC" .. %-8"PRIuSEC" %s\n", + file->start, file->end, fn); } #endif -- 2.11.0 From 903a6a88f08282643f6189333d42fecc6b7a8f7f Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 19 Mar 2022 14:07:15 +0000 Subject: [PATCH 16/16] Makefile: Factor out the `CFLAGS'. Makes overriding from the command line less awful. --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 836a7f4..f68c312 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,10 @@ v-tag = $(call v-tag_$V,$1) v-tag_0 = @printf " %-8s %s\n" "$1" "$@"; CC = gcc -CFLAGS = -O2 -g -pedantic -Wall -Werror +OPTIMIZE = -O2 +DEBUG = -g +WARN = -pedantic -Wall -Werror +CFLAGS = $(OPTIMIZE) $(DEBUG) $(WARN) LD = gcc LDFLAGS = -- 2.11.0