Commit efc30c08 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Andrei Vagin

compel: make output streams options

That will help to omit pr_* output on the screen on tests,
where one can redefine `opts`.

Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Reviewed-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent c200d803
...@@ -15,17 +15,39 @@ typedef struct { ...@@ -15,17 +15,39 @@ typedef struct {
char *prefix_name; char *prefix_name;
char *var_name; char *var_name;
char *nrgotpcrel_name; char *nrgotpcrel_name;
FILE *fout;
FILE *ferr;
FILE *fdebug;
} piegen_opt_t; } piegen_opt_t;
extern piegen_opt_t opts; extern piegen_opt_t opts;
extern FILE *fout;
#define pr_out(fmt, ...) fprintf(fout, fmt, ##__VA_ARGS__) #define pr_out(fmt, ...) \
do { \
if (opts.fout) \
fprintf(opts.fout, fmt, ##__VA_ARGS__); \
} while (0)
#define pr_debug(fmt, ...) printf("%s: "fmt, opts.stream_name, ##__VA_ARGS__) #define pr_debug(fmt, ...) \
do { \
if (opts.fdebug) \
fprintf(opts.fdebug, "%s: "fmt, \
opts.stream_name, ##__VA_ARGS__); \
} while (0)
#define pr_err(fmt, ...) fprintf(stderr, "%s: Error (%s:%d): "fmt, opts.stream_name, __FILE__, __LINE__, ##__VA_ARGS__) #define pr_err(fmt, ...) \
#define pr_perror(fmt, ...) fprintf(stderr, "%s: Error (%s:%d): "fmt ": %m\n", opts.stream_name, __FILE__, __LINE__, ##__VA_ARGS__) do { \
if (opts.ferr) \
fprintf(opts.ferr, "%s: Error (%s:%d): "fmt, \
opts.stream_name, __FILE__, __LINE__, ##__VA_ARGS__); \
} while (0)
#define pr_perror(fmt, ...) \
do { \
if (opts.ferr) \
fprintf(opts.ferr, "%s: Error (%s:%d): "fmt ": %m\n", \
opts.stream_name, __FILE__, __LINE__, ##__VA_ARGS__); \
} while (0)
extern int handle_binary(void *mem, size_t size); extern int handle_binary(void *mem, size_t size);
......
...@@ -25,10 +25,9 @@ piegen_opt_t opts = { ...@@ -25,10 +25,9 @@ piegen_opt_t opts = {
.prefix_name = "__", .prefix_name = "__",
.var_name = "elf_relocs", .var_name = "elf_relocs",
.nrgotpcrel_name = "nr_gotpcrel", .nrgotpcrel_name = "nr_gotpcrel",
.fout = NULL,
}; };
FILE *fout;
static int piegen(void) static int piegen(void)
{ {
struct stat st; struct stat st;
...@@ -46,8 +45,8 @@ static int piegen(void) ...@@ -46,8 +45,8 @@ static int piegen(void)
goto err; goto err;
} }
fout = fopen(opts.output_filename, "w"); opts.fout = fopen(opts.output_filename, "w");
if (fout == NULL) { if (opts.fout == NULL) {
pr_perror("Can't open %s", opts.output_filename); pr_perror("Can't open %s", opts.output_filename);
goto err; goto err;
} }
...@@ -69,8 +68,8 @@ static int piegen(void) ...@@ -69,8 +68,8 @@ static int piegen(void)
err: err:
if (fd >= 0) if (fd >= 0)
close(fd); close(fd);
if (fout) if (opts.fout)
fclose(fout); fclose(opts.fout);
if (!ret) if (!ret)
printf("%s generated successfully.\n", opts.output_filename); printf("%s generated successfully.\n", opts.output_filename);
return ret; return ret;
...@@ -82,6 +81,9 @@ int main(int argc, char *argv[]) ...@@ -82,6 +81,9 @@ int main(int argc, char *argv[])
int opt, idx, i; int opt, idx, i;
char *action; char *action;
opts.fdebug = stdout;
opts.ferr = stderr;
typedef struct { typedef struct {
const char *arch; const char *arch;
const char *cflags; const char *cflags;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment