int open64(const char *path, int flags, ...) { char *rpath, *strflags=str_flags(flags); va_list argptr; mode_t mode; int found; // If O_CREAT then mode is not set. if (flags & O_CREAT) { va_start(argptr, flags); mode=va_arg(argptr, mode_t); va_end(argptr); } else { mode=0; } sb_log(2, "Start open64(\"%s\", %s, %04o).", path, strflags, mode); rpath=rewrite(path, R_FILE); if ((found=has_access(rpath)) || ! (flags & (O_WRONLY|O_RDWR))) { // Disable O_CREAT when O_RDONLY if (!found) { flags&=~O_CREAT; strflags=str_flags(flags); } sb_log(4, "Do open64(\"%s\", %s, %04o).", path, strflags, mode); return _real_open64(path, flags, mode); } if (action==A_HALT) exit(0); sb_log(0, "Attempt to open64(\"%s\", %s, %04o).", rpath, strflags, mode); free(rpath); free(strflags); if (action==A_WARN) return devnull; errno=EACCES; return -1; }
static void print_msg_info(const char* meta, bbus_object* obj) { unsigned char msgtype; unsigned char sotype; unsigned char errcode; unsigned token; unsigned psize; unsigned char flags; char* msgmeta; int ret; ret = bbus_obj_parse(obj, "bbbuubs", &msgtype, &sotype, &errcode, &token, &psize, &flags, &msgmeta); if (ret < 0) { die("Error extracting message data from object: %s\n", bbus_strerror(bbus_lasterror())); } printf("Message %s\n", meta); printf("{\n"); printf("\tmsgtype\t=\t%s\n", str_msgtype(msgtype)); printf("\tsotype\t=\t%s\n", str_sotype(sotype)); printf("\terrcode\t=\t%s\n", str_errcode(errcode)); printf("\ttoken\t=\t%u\n", token); printf("\tpsize\t=\t%u\n", psize); printf("\tflags\t=\t%s\n", str_flags(flags)); printf("\tmeta\t=\t"); if (strlen(msgmeta) == 0) { printf("<no meta>"); } else { printf("\"%s\"", msgmeta); } printf("\n}\n"); }
/* Format scale parameter for meaningful display */ static char * str_scale(int scale) { char *result; if (scale == HN_AUTOSCALE || scale == HN_GETSCALE) return str_flags(scale, ""); result = malloc(MAX_INT_STR_DIGITS); result[0] = '\0'; snprintf(result, MAX_INT_STR_DIGITS, "%d", scale); return result; }
int main(int argc, char * const argv[]) { char *buf; char *flag_str, *scale_str; size_t buflen, errcnt, i, skipped, tested; int r; int includeNegScale; int includeExabyteTests; int verbose; buflen = 4; includeNegScale = 0; includeExabyteTests = 0; verbose = 0; read_options(argc, argv, &buflen, &includeNegScale, &includeExabyteTests, &verbose); buf = malloc(buflen); errcnt = 0; tested = 0; skipped = 0; if (buflen != 4) printf("Warning: buffer size %zu != 4, expect some results to differ.\n", buflen); printf("1..%zu\n", nitems(test_args)); for (i = 0; i < nitems(test_args); i++) { /* KLUDGE */ if (test_args[i].num == INT64_MAX && buflen == 4) { /* Start final tests which require buffer of 6 */ free(buf); buflen = 6; buf = malloc(buflen); if (verbose) printf("Buffer length increased to %zu\n", buflen); } if (test_args[i].scale < 0 && ! includeNegScale) { skipped++; testskipped(i + 1); continue; } if (test_args[i].num >= halfExabyte && ! includeExabyteTests) { skipped++; testskipped(i + 1); continue; } r = humanize_number(buf, buflen, test_args[i].num, "", test_args[i].scale, test_args[i].flags); flag_str = str_flags(test_args[i].flags, "[no flags]"); scale_str = str_scale(test_args[i].scale); if (r != test_args[i].retval) { if (verbose) printf("wrong return value on index %zu, " "buflen: %zu, got: %d + \"%s\", " "expected %d + \"%s\"; num = %jd, " "scale = %s, flags= %s.\n", i, buflen, r, buf, test_args[i].retval, test_args[i].res, (intmax_t)test_args[i].num, scale_str, flag_str); else printf("not ok %zu # return %d != %d\n", i + 1, r, test_args[i].retval); errcnt++; } else if (strcmp(buf, test_args[i].res) != 0) { if (verbose) printf("result mismatch on index %zu, got: " "\"%s\", expected \"%s\"; num = %jd, " "scale = %s, flags= %s.\n", i, buf, test_args[i].res, (intmax_t)test_args[i].num, scale_str, flag_str); else printf("not ok %zu # buf \"%s\" != \"%s\"\n", i + 1, buf, test_args[i].res); errcnt++; } else { if (verbose) printf("successful result on index %zu, " "returned %d, got: \"%s\"; num = %jd, " "scale = %s, flags= %s.\n", i, r, buf, (intmax_t)test_args[i].num, scale_str, flag_str); else printf("ok %zu\n", i + 1); } tested++; } if (verbose) printf("total errors: %zu/%zu tests, %zu skipped\n", errcnt, tested, skipped); if (errcnt) return 1; return 0; }