Esempio n. 1
0
struct barectf_platform_linux_fs_ctx *barectf_platform_linux_fs_init(
	unsigned int buf_size, const char *trace_dir, int simulate_full_backend,
	unsigned int full_backend_rand_lt, unsigned int full_backend_rand_max)
{
	char stream_path[256];
	uint8_t *buf;
	struct barectf_platform_linux_fs_ctx *ctx;
	struct barectf_platform_callbacks cbs = {
		.default_clock_get_value = get_clock,
		.is_backend_full = is_backend_full,
		.open_packet = open_packet,
		.close_packet = close_packet,
	};

	ctx = malloc(sizeof(*ctx));

	if (!ctx) {
		return NULL;
	}

	buf = malloc(buf_size);

	if (!buf) {
		free(ctx);
		return NULL;
	}

	memset(buf, 0, buf_size);

	sprintf(stream_path, "%s/stream", trace_dir);
	ctx->fh = fopen(stream_path, "wb");

	if (!ctx->fh) {
		free(ctx);
		free(buf);
		return NULL;
	}

	ctx->simulate_full_backend = simulate_full_backend;
	ctx->full_backend_rand_lt = full_backend_rand_lt;
	ctx->full_backend_rand_max = full_backend_rand_max;

	barectf_init(&ctx->ctx, buf, buf_size, cbs, ctx);
	open_packet(ctx);

	return ctx;
}
Esempio n. 2
0
int fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int len)
{
    int limit, rest;

    if (len <= 0) {
        return 0;
    }

    if (req->out_hdr && req->out_hdr->type != type) {
        close_packet(req);
    }
#if 0
    /* Unoptimized, but clear version */
    rest = len;
    while (rest > 0) {
        limit = sizeof(req->out_buf) - (req->out_pos - req->out_buf);

        if (!req->out_hdr) {
            if (limit < sizeof(fcgi_header)) {
                if (!fcgi_flush(req, 0)) {
                    return -1;
                }
            }
            open_packet(req, type);
        }
        limit = sizeof(req->out_buf) - (req->out_pos - req->out_buf);
        if (rest < limit) {
            memcpy(req->out_pos, str, rest);
            req->out_pos += rest;
            return len;
        } else {
            memcpy(req->out_pos, str, limit);
            req->out_pos += limit;
            rest -= limit;
            str += limit;
            if (!fcgi_flush(req, 0)) {
                return -1;
            }
        }
    }
#else
    /* Optimized version */
    limit = sizeof(req->out_buf) - (req->out_pos - req->out_buf);
    if (!req->out_hdr) {
        limit -= sizeof(fcgi_header);
        if (limit < 0) limit = 0;
    }

    if (len < limit) {
        if (!req->out_hdr) {
            open_packet(req, type);
        }
        memcpy(req->out_pos, str, len);
        req->out_pos += len;
    } else if (len - limit < sizeof(req->out_buf) - sizeof(fcgi_header)) {
        if (!req->out_hdr) {
            open_packet(req, type);
        }
        if (limit > 0) {
            memcpy(req->out_pos, str, limit);
            req->out_pos += limit;
        }
        if (!fcgi_flush(req, 0)) {
            return -1;
        }
        if (len > limit) {
            open_packet(req, type);
            memcpy(req->out_pos, str + limit, len - limit);
            req->out_pos += len - limit;
        }
    } else {
        int pos = 0;
        int pad;

        close_packet(req);
        while ((len - pos) > 0xffff) {
            open_packet(req, type);
            fcgi_make_header(req->out_hdr, type, req->id, 0xfff8);
            req->out_hdr = NULL;
            if (!fcgi_flush(req, 0)) {
                return -1;
            }
            if (safe_write(req, str + pos, 0xfff8) != 0xfff8) {
                req->keep = 0;
                return -1;
            }
            pos += 0xfff8;
        }

        pad = (((len - pos) + 7) & ~7) - (len - pos);
        rest = pad ? 8 - pad : 0;

        open_packet(req, type);
        fcgi_make_header(req->out_hdr, type, req->id, (len - pos) - rest);
        req->out_hdr = NULL;
        if (!fcgi_flush(req, 0)) {
            return -1;
        }
        if (safe_write(req, str + pos, (len - pos) - rest) != (len - pos) - rest) {
            req->keep = 0;
            return -1;
        }
        if (pad) {
            open_packet(req, type);
            memcpy(req->out_pos, str + len - rest,  rest);
            req->out_pos += rest;
        }
    }
#endif
    return len;
}