1ad054a21SCyrill Gorcunov /* 2ad054a21SCyrill Gorcunov * Taken from perf which in turn take it from GIT 3ad054a21SCyrill Gorcunov */ 4ad054a21SCyrill Gorcunov 5f3150089SPekka Enberg #include "kvm/util.h" 6ad054a21SCyrill Gorcunov 7ad054a21SCyrill Gorcunov static void report(const char *prefix, const char *err, va_list params) 8ad054a21SCyrill Gorcunov { 9ad054a21SCyrill Gorcunov char msg[1024]; 10ad054a21SCyrill Gorcunov vsnprintf(msg, sizeof(msg), err, params); 11ad054a21SCyrill Gorcunov fprintf(stderr, " %s%s\n", prefix, msg); 12ad054a21SCyrill Gorcunov } 13ad054a21SCyrill Gorcunov 14ad054a21SCyrill Gorcunov static NORETURN void die_builtin(const char *err, va_list params) 15ad054a21SCyrill Gorcunov { 16ad054a21SCyrill Gorcunov report(" Fatal: ", err, params); 17ad054a21SCyrill Gorcunov exit(128); 18ad054a21SCyrill Gorcunov } 19ad054a21SCyrill Gorcunov 20ad054a21SCyrill Gorcunov static void error_builtin(const char *err, va_list params) 21ad054a21SCyrill Gorcunov { 22ad054a21SCyrill Gorcunov report(" Error: ", err, params); 23ad054a21SCyrill Gorcunov } 24ad054a21SCyrill Gorcunov 25ad054a21SCyrill Gorcunov static void warn_builtin(const char *warn, va_list params) 26ad054a21SCyrill Gorcunov { 27ad054a21SCyrill Gorcunov report(" Warning: ", warn, params); 28ad054a21SCyrill Gorcunov } 29ad054a21SCyrill Gorcunov 3007f9d0dbSCyrill Gorcunov static void info_builtin(const char *info, va_list params) 3107f9d0dbSCyrill Gorcunov { 3207f9d0dbSCyrill Gorcunov report(" Info: ", info, params); 3307f9d0dbSCyrill Gorcunov } 3407f9d0dbSCyrill Gorcunov 35ad054a21SCyrill Gorcunov void die(const char *err, ...) 36ad054a21SCyrill Gorcunov { 37ad054a21SCyrill Gorcunov va_list params; 38ad054a21SCyrill Gorcunov 39ad054a21SCyrill Gorcunov va_start(params, err); 40ad054a21SCyrill Gorcunov die_builtin(err, params); 41ad054a21SCyrill Gorcunov va_end(params); 42ad054a21SCyrill Gorcunov } 43ad054a21SCyrill Gorcunov 44ad054a21SCyrill Gorcunov int error(const char *err, ...) 45ad054a21SCyrill Gorcunov { 46ad054a21SCyrill Gorcunov va_list params; 47ad054a21SCyrill Gorcunov 48ad054a21SCyrill Gorcunov va_start(params, err); 49ad054a21SCyrill Gorcunov error_builtin(err, params); 50ad054a21SCyrill Gorcunov va_end(params); 51ad054a21SCyrill Gorcunov return -1; 52ad054a21SCyrill Gorcunov } 53ad054a21SCyrill Gorcunov 54ad054a21SCyrill Gorcunov void warning(const char *warn, ...) 55ad054a21SCyrill Gorcunov { 56ad054a21SCyrill Gorcunov va_list params; 57ad054a21SCyrill Gorcunov 58ad054a21SCyrill Gorcunov va_start(params, warn); 59ad054a21SCyrill Gorcunov warn_builtin(warn, params); 60ad054a21SCyrill Gorcunov va_end(params); 61ad054a21SCyrill Gorcunov } 62ad054a21SCyrill Gorcunov 6307f9d0dbSCyrill Gorcunov void info(const char *info, ...) 6407f9d0dbSCyrill Gorcunov { 6507f9d0dbSCyrill Gorcunov va_list params; 6607f9d0dbSCyrill Gorcunov 6707f9d0dbSCyrill Gorcunov va_start(params, info); 6807f9d0dbSCyrill Gorcunov info_builtin(info, params); 6907f9d0dbSCyrill Gorcunov va_end(params); 7007f9d0dbSCyrill Gorcunov } 7107f9d0dbSCyrill Gorcunov 72ad054a21SCyrill Gorcunov void die_perror(const char *s) 73ad054a21SCyrill Gorcunov { 74ad054a21SCyrill Gorcunov perror(s); 75ad054a21SCyrill Gorcunov exit(1); 76ad054a21SCyrill Gorcunov } 77*0b322d96SCyrill Gorcunov 78*0b322d96SCyrill Gorcunov /** 79*0b322d96SCyrill Gorcunov * strlcat - Append a length-limited, %NUL-terminated string to another 80*0b322d96SCyrill Gorcunov * @dest: The string to be appended to 81*0b322d96SCyrill Gorcunov * @src: The string to append to it 82*0b322d96SCyrill Gorcunov * @count: The size of the destination buffer. 83*0b322d96SCyrill Gorcunov */ 84*0b322d96SCyrill Gorcunov size_t strlcat(char *dest, const char *src, size_t count) 85*0b322d96SCyrill Gorcunov { 86*0b322d96SCyrill Gorcunov size_t dsize = strlen(dest); 87*0b322d96SCyrill Gorcunov size_t len = strlen(src); 88*0b322d96SCyrill Gorcunov size_t res = dsize + len; 89*0b322d96SCyrill Gorcunov 90*0b322d96SCyrill Gorcunov DIE_IF(dsize >= count); 91*0b322d96SCyrill Gorcunov 92*0b322d96SCyrill Gorcunov dest += dsize; 93*0b322d96SCyrill Gorcunov count -= dsize; 94*0b322d96SCyrill Gorcunov if (len >= count) 95*0b322d96SCyrill Gorcunov len = count - 1; 96*0b322d96SCyrill Gorcunov 97*0b322d96SCyrill Gorcunov memcpy(dest, src, len); 98*0b322d96SCyrill Gorcunov dest[len] = 0; 99*0b322d96SCyrill Gorcunov 100*0b322d96SCyrill Gorcunov return res; 101*0b322d96SCyrill Gorcunov } 102