Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Aug 2019 16:24:19 +0000
From:      "Farhan Khan" <farhan@farhan.codes>
To:        freebsd-hackers@freebsd.org
Subject:   Trouble using and understanding funopen(3)
Message-ID:  <519c2fce85fe0db1cd189d2060f09a0f@farhan.codes>

next in thread | raw e-mail | index | archive | help
Hi all,=0A=0AI am having trouble understanding how funopen(3)'s read func=
tion works. Specifically, how do I have the readfn return with less than =
the requested amount of bytes.=0A=0AMy understanding: I believe that funo=
pen(3) allows you to assign the read, write and close methods to a FILE s=
tream. When a program runs fread(3) on a FILE stream opened by funopen(3)=
, the program will run the readfn handler in a loop until it returns eith=
er returns the requested number of bytes, 0 or -1 (error).=0A=0AQuestion:=
 How do I structure the code so that readfn returns with less than the nu=
mbe of requested bytes? For example, what if the calling fread() function=
 requests 100 bytes, but the readfn can only return 10 bytes? What mechan=
ism do I need to implement so that the fread(3) returns "10" bytes rather=
 than the readfn handler running 10 times? This results in the fread()'s =
return value as 100, even though only 10 bytes were *actually* read.=0A=
=0AI have looked at a few examples from the src tree. Clearly they have t=
o use buffering and append the bytes they read to the memory object they =
were initially passed. Somehow they return with the number of bytes they =
actually read, not necessarily the requested amount. But it is not clear =
to me how they make this distinction and avoid having their respective re=
adfn function re-rerun. Also, in the examples I did look up there does no=
t appear to be any use of setvbuf().=0A=0ABelow is a very simple test cas=
e to illustrate the issue.=0A=0A------=0A#include <stdio.h>=0A#include <s=
tring.h>=0A#include <stdlib.h>=0A=0Astatic int=0Assh_readfn(void *v, char=
 *buf, int len)=0A{=0A	printf("Running readfn handler\n");=0A	memcpy(buf,=
 "AAAAAAAAAA", 10);=0A	return 10;=0A}=0A=0Astatic int=0Assh_writefn(void =
*v, const char *buf, int len)=0A{=0A	return 0;=0A}=0A=0Aint=0Amain()=0A{=
=0A	int x;=0A	char buf[1000];=0A	FILE *f;=0A=0A	f =3D funopen(NULL, ssh_r=
eadfn, ssh_writefn, NULL, NULL);=0A	if (f =3D=3D NULL) {=0A		printf("funo=
pen failed, exiting.\n");=0A		exit(0);=0A	}=0A=0A	x =3D fread(buf, 1, 100=
, f);=0A	printf("Bytes read: %d\n", x);=0A}=0A------=0A=0AThis displays 1=
0 "Running readfn handler" lines fllowed by "Bytes read: 100" even though=
 I am explicitly returning 10 in ssh_readfn. Please advise what the mecha=
nism is only return with less than the requested number of bytes.=0A=0ATh=
anks!=0A---=0AFarhan Khan=0APGP Fingerprint: 1312 89CE 663E 1EB2 179C 1C8=
3 C41D 2281 F8DA C0DE



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?519c2fce85fe0db1cd189d2060f09a0f>