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;
}
Exemple #2
0
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;
}