From 623b5d9d48ecc9ed6755c85de2f02a778d5cb501 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Thu, 22 Mar 2018 11:31:58 -0400 Subject: [PATCH] r750: check puts() return (#132 & #103) --- format.c | 5 ++--- main.c | 7 ++++++- map.c | 6 +++--- misc.c | 11 +++++++++++ mmpriv.h | 2 ++ 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/format.c b/format.c index 89a93b6..712e560 100644 --- a/format.c +++ b/format.c @@ -118,7 +118,7 @@ void mm_write_sam_hdr(const mm_idx_t *idx, const char *rg, const char *ver, int if (idx) { uint32_t i; for (i = 0; i < idx->n_seq; ++i) - printf("@SQ\tSN:%s\tLN:%d\n", idx->seq[i].name, idx->seq[i].len); + mm_sprintf_lite(&str, "@SQ\tSN:%s\tLN:%d\n", idx->seq[i].name, idx->seq[i].len); } if (rg) sam_write_rg_line(&str, rg); mm_sprintf_lite(&str, "@PG\tID:minimap2\tPN:minimap2"); @@ -129,8 +129,7 @@ void mm_write_sam_hdr(const mm_idx_t *idx, const char *rg, const char *ver, int for (i = 1; i < argc; ++i) mm_sprintf_lite(&str, " %s", argv[i]); } - mm_sprintf_lite(&str, "\n"); - fputs(str.s, stdout); + mm_err_puts(str.s); free(str.s); } diff --git a/main.c b/main.c index 9b07eb8..b6f75e8 100644 --- a/main.c +++ b/main.c @@ -10,7 +10,7 @@ #include "getopt.h" #endif -#define MM_VERSION "2.9-r749-dirty" +#define MM_VERSION "2.9-r750-dirty" #ifdef __linux__ #include @@ -336,6 +336,11 @@ int main(int argc, char *argv[]) } mm_idx_reader_close(idx_rdr); + if (fflush(stdout) == EOF) { + fprintf(stderr, "[ERROR] failed to write the results\n"); + exit(EXIT_FAILURE); + } + if (mm_verbose >= 3) { fprintf(stderr, "[M::%s] Version: %s\n", __func__, MM_VERSION); fprintf(stderr, "[M::%s] CMD:", __func__); diff --git a/map.c b/map.c index 4dcff71..3146678 100644 --- a/map.c +++ b/map.c @@ -489,11 +489,11 @@ static void *worker_pipeline(void *shared, int step, void *in) mm_write_sam2(&p->str, mi, t, i - seg_st, j, s->n_seg[k], &s->n_reg[seg_st], (const mm_reg1_t*const*)&s->reg[seg_st], km, p->opt->flag); else mm_write_paf(&p->str, mi, t, r, km, p->opt->flag); - puts(p->str.s); + mm_err_puts(p->str.s); } - if (s->n_reg[i] == 0 && (p->opt->flag & MM_F_OUT_SAM)) { + if (s->n_reg[i] == 0 && (p->opt->flag & MM_F_OUT_SAM)) { // write an unmapped record mm_write_sam2(&p->str, mi, t, i - seg_st, -1, s->n_seg[k], &s->n_reg[seg_st], (const mm_reg1_t*const*)&s->reg[seg_st], km, p->opt->flag); - puts(p->str.s); + mm_err_puts(p->str.s); } } for (i = seg_st; i < seg_en; ++i) { diff --git a/misc.c b/misc.c index acf2f6c..f7a43cb 100644 --- a/misc.c +++ b/misc.c @@ -1,3 +1,4 @@ +#include #include "mmpriv.h" int mm_verbose = 1; @@ -120,6 +121,16 @@ double realtime(void) return tp.tv_sec + tp.tv_usec * 1e-6; } +void mm_err_puts(const char *str) +{ + int ret; + ret = puts(str); + if (ret == EOF) { + fprintf(stderr, "[ERROR] failed to write the results\n"); + exit(EXIT_FAILURE); + } +} + #include "ksort.h" #define sort_key_128x(a) ((a).x) diff --git a/mmpriv.h b/mmpriv.h index 4a1ae2b..c3c9a6d 100644 --- a/mmpriv.h +++ b/mmpriv.h @@ -86,6 +86,8 @@ mm_seg_t *mm_seg_gen(void *km, uint32_t hash, int n_segs, const int *qlens, int void mm_seg_free(void *km, int n_segs, mm_seg_t *segs); void mm_pair(void *km, int max_gap_ref, int dp_bonus, int sub_diff, int match_sc, const int *qlens, int *n_regs, mm_reg1_t **regs); +void mm_err_puts(const char *str); + #ifdef __cplusplus } #endif