コード例 #1
0
ファイル: private.c プロジェクト: maandree/shr
int main(int argc, char *argv[])
{
	shr_key_t key;
	shr_t shr;
	shr_t revshr;
	ssize_t got = 1, wrote;
	pid_t pid;
	int closed = 0;
	size_t ptr, len;

	if (argc != 1) {
		fprintf(stderr, "See README for usage.\n");
		return 1;
	}

	SHR_PRIVATE(&key, BUFFER_SIZE, 3);
	t (shr_open(&shr, &key, SHR_WRITE));

	t (shr_reverse_dup(&shr, &revshr));
	t (pid = fork());

	if (pid)
		shr = revshr;

	while (!pid && got) {
		char* buf;
		t (shr_write(&shr, &buf));
		t (got = read(STDIN_FILENO, buf, BUFFER_SIZE));
		t (shr_write_done(&shr, (size_t)got));
	}

	while (pid && !closed) {
		const char* buf;
		t (shr_read(&shr, &buf, &len));
		for (ptr = 0; ptr < len;) {
			t (wrote = write(STDOUT_FILENO, buf, len));
			ptr += (size_t)wrote;
		}
		t (closed = shr_read_done(&shr));
	}

	shr_close(&shr);
	if (pid)
		shr_remove(&shr);
	return 0;
 fail:
	perror(called);
	shr_remove_by_key(&key);
	return 1;
	(void) argv;
}
コード例 #2
0
ファイル: send.c プロジェクト: maandree/shr
int main(int argc, char *argv[])
{
	shr_key_t key;
	shr_t shr;
	char str[SHR_KEY_STR_MAX];
	char* buf;
	ssize_t got = 1;
	int r;
	struct timespec timeout = { .tv_sec = 0, .tv_nsec = 500000000L };

	if (argc != 1) {
		fprintf(stderr, "See README for usage.\n");
		return 1;
	}

	t (shr_create(&key, BUFFER_SIZE, 3, 0600));
	t (shr_open(&shr, &key, SHR_WRITE));

	shr_key_to_str(&key, str);
	t (printf("key: %s\n", str));

	while (got) {
		called = "shr_write_try(&shr, &buf)";
		r = shr_write_try(&shr, &buf);
		if (r < 0) {
			if (errno != EAGAIN)  goto fail;
			fprintf(stderr, "\033[31mThe ring is full.\033[00m\n");
			called = "shr_write_timed(&shr, &buf, &len, &timeout)";
			for (;;) {
				r = shr_write_timed(&shr, &buf, &timeout);
				if (r == 0)  break;
				if (errno != EAGAIN)  goto fail;
				fprintf(stderr, "\033[31mWaiting...\033[00m\n");
			}
		}
		t (got = read(STDIN_FILENO, buf, BUFFER_SIZE));
		t (shr_write_done(&shr, (size_t)got));
	}

	shr_close(&shr);
	return 0;
 fail:
	perror(called);
	shr_remove_by_key(&key);
	return 1;
	(void) argv;
}
コード例 #3
0
ファイル: test6.c プロジェクト: rikxqd/misc
int main() {
 struct shr *s=NULL;
 int rc = -1;

 unlink(ring);
 if (shr_init(ring, 6, 0) < 0) goto done;

 s = shr_open(ring);
 if (s == NULL) goto done;

 printf("writing ...");
 if (shr_write(s, &data[0], 3) < 0) goto done;
 printf("ok\n");

 printf("reading ...");
 ssize_t nr;
 nr = shr_read(s, out, sizeof(out));
 if (nr < 0) goto done;
 printf("read %ld bytes\n", (long)nr);
 if (nr > 0) printf("%.*s\n", (int)nr, out);

 printf("writing ...");
 if (shr_write(s, &data[3], 3) < 0) goto done;
 printf("ok\n");

 printf("reading ...");
 nr = shr_read(s, out, sizeof(out));
 if (nr < 0) goto done;
 printf("read %ld bytes\n", (long)nr);
 if (nr > 0) printf("%.*s\n", (int)nr, out);

 rc = 0;

done:
 printf("end\n");
 if (s) shr_close(s);
 return rc;
}
コード例 #4
0
ファイル: stat-and-remove.c プロジェクト: maandree/shr
int main(int argc, char *argv[])
{
	shr_key_t key;
	shr_t shr;
	uid_t uid;
	gid_t gid;
	mode_t mode;

	if (argc != 2) {
		fprintf(stderr, "See README for usage.\n");
		return 1;
	}

	uid = (uid_t)atoll(argv[3]);
	gid = (gid_t)atoll(argv[4]);
	mode = (mode_t)atoll(argv[5]);

	shr_str_to_key(argv[1], &key);
	t (shr_open(&shr, &key, SHR_READ));
	t (shr_stat(&shr, &uid, &gid, &mode));

	printf("buffer size: %zu\n", SHR_BUFFER_SIZE(&shr));
	printf("buffer count: %zu\n", SHR_BUFFER_COUNT(&shr));
	printf("owner: %lli\n", (long long)uid);
	printf("group: %lli\n", (long long)gid);
	printf("mode: %o\n", (int)mode);

	shr_close(&shr);
	shr_remove(&shr);

	return 0;
 fail:
	perror(called);
	shr_remove(&shr);
	return 1;
}