Re: [Toybox] [PATCH 0/1] Added basic post-data support to wget.c

2022-03-28 Thread enh via Toybox
On Sat, Mar 26, 2022 at 2:49 PM Rob Landley  wrote:

> On 3/26/22 11:59 AM, Moritz C. Weber wrote:
> > Dear all,
> > I wrote the simple patch to enable wget for POST requests with an
> --post-data option.
> > Sadly, patched wget and git HEAD segfault on my current build machine.
>
> I did some cleanups to wget recently (after talking to you about it), and
> applied your patch on top of those.
>
> You got the argument order backwards in GLOBALS, the arguments from right
> to
> left in the NEWTOY() string populate the structure from top to bottom. I
> need to
> finish the tutorial video on that...
>

or reverse them in the code? this always gets me too. is it easier to just
fix it (by having a max that we subtract from?) so struct fields can be in
the "obvious" order, rather than add more explanations of why it's
"backwards" (for non-RTL language natives at least)?

it would be a disruptive diff to say the least, but better sooner than
later?


> I admit it's a little nonobvious. The bits go from right to left,
> NEWTOY(blah, "abcd", FLAGS) means d is (1<<0), c is (1<<1), b is (1<<2)
> and so
> on. So "blah -a -b -d" would set toys.optflags to binary 1101.
>
> GLOBALS() is essentially treated as a union of the command's type
> structure, and
> an array of long that gets populated in packed bit order. So "a#b*cd:"
> would be:
>
> GLOBALS(
>   char *d;
>   struct arg_list *b;
>   long a;
> )
>
> Since "-c" doesn't take an argument, it doesn't consume a slot.
>
> Linux is LP64 so sizeof(pointer) == sizeof(long), and register sized
> entries in
> structures have no packing between or before them, so -d arg goes in TT.d,
> -b
> arg goes in TT.b, and -a arg goes it TT.a.
>
> Note that when they're the same type I collate the declarations, and C
> declarations go "left to right then top to bottom". So:
>
> NEWTOY(blah, "a#b:cd:", FLAGS)
> GLOBALS(
>   char *d, *b;
>   long a;
> )
>
> NEWTOY(blah, "a#b#cd:", FLAGS)
> GLOBALS(
>   char *d;
>   long b, a;
> )
>
> (By convention I put a blank line between variables populated by arguments
> and
> globals that are just used by the code to store stuff. The latter are
> always
> initialized to zero.)
>
> > So, testing can and will be improved, but I mainly send this patch to
> learn
> > the process. And I think the change is trivial, if I got everything
> right.
> >
> > I am not used to write C and I am still learning the toybox
> infrastructure.
> > So I would be happy to get feedback what to do better.
>
> sizeof(pointer) gives you the size of the pointer variable (4 bytes on 32
> bit
> systems, 8 bytes on 64 bit systems). You wanted strlen(pointer). I fixed
> it up
> already.
>
> The other thing is an issue that was already there in wget (and part of the
> reason it's still in pending): toybuf is a 4k buffer but there's no limit
> on the
> length of the input arguments, so sprintf(toybuf, xxx) can run off the end
> of
> the buffer. I need to add length checks. (Working on it...)
>
> > The long-term purpose for this patch would be to refactor the wget logic
> into
> > the library, so that I could reuse GET and POST in a git toy, which I
> plan.
>
> That is good to do. The cleanups I'm doing should help towards that.
>
> Thanks,
>
> Rob
> ___
> Toybox mailing list
> Toybox@lists.landley.net
> http://lists.landley.net/listinfo.cgi/toybox-landley.net
>
___
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net


Re: [Toybox] [PATCH 0/1] Added basic post-data support to wget.c

2022-03-26 Thread Rob Landley
On 3/26/22 11:59 AM, Moritz C. Weber wrote:
> Dear all,
> I wrote the simple patch to enable wget for POST requests with an --post-data 
> option.
> Sadly, patched wget and git HEAD segfault on my current build machine.

I did some cleanups to wget recently (after talking to you about it), and
applied your patch on top of those.

You got the argument order backwards in GLOBALS, the arguments from right to
left in the NEWTOY() string populate the structure from top to bottom. I need to
finish the tutorial video on that...

I admit it's a little nonobvious. The bits go from right to left,
NEWTOY(blah, "abcd", FLAGS) means d is (1<<0), c is (1<<1), b is (1<<2) and so
on. So "blah -a -b -d" would set toys.optflags to binary 1101.

GLOBALS() is essentially treated as a union of the command's type structure, and
an array of long that gets populated in packed bit order. So "a#b*cd:" would be:

GLOBALS(
  char *d;
  struct arg_list *b;
  long a;
)

Since "-c" doesn't take an argument, it doesn't consume a slot.

Linux is LP64 so sizeof(pointer) == sizeof(long), and register sized entries in
structures have no packing between or before them, so -d arg goes in TT.d, -b
arg goes in TT.b, and -a arg goes it TT.a.

Note that when they're the same type I collate the declarations, and C
declarations go "left to right then top to bottom". So:

NEWTOY(blah, "a#b:cd:", FLAGS)
GLOBALS(
  char *d, *b;
  long a;
)

NEWTOY(blah, "a#b#cd:", FLAGS)
GLOBALS(
  char *d;
  long b, a;
)

(By convention I put a blank line between variables populated by arguments and
globals that are just used by the code to store stuff. The latter are always
initialized to zero.)

> So, testing can and will be improved, but I mainly send this patch to learn
> the process. And I think the change is trivial, if I got everything right.
> 
> I am not used to write C and I am still learning the toybox infrastructure.
> So I would be happy to get feedback what to do better.

sizeof(pointer) gives you the size of the pointer variable (4 bytes on 32 bit
systems, 8 bytes on 64 bit systems). You wanted strlen(pointer). I fixed it up
already.

The other thing is an issue that was already there in wget (and part of the
reason it's still in pending): toybuf is a 4k buffer but there's no limit on the
length of the input arguments, so sprintf(toybuf, xxx) can run off the end of
the buffer. I need to add length checks. (Working on it...)

> The long-term purpose for this patch would be to refactor the wget logic into
> the library, so that I could reuse GET and POST in a git toy, which I plan.

That is good to do. The cleanups I'm doing should help towards that.

Thanks,

Rob
___
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net


[Toybox] [PATCH 0/1] Added basic post-data support to wget.c

2022-03-26 Thread Moritz C. Weber
Dear all,
I wrote the simple patch to enable wget for POST requests with an --post-data 
option. Sadly, patched wget and git HEAD segfault on my current build machine.

So, testing can and will be improved, but I mainly send this patch to learn the 
process. And I think the change is trivial, if I got everything right.

I am not used to write C and I am still learning the toybox infrastructure. So 
I would be happy to get feedback what to do better.

The long-term purpose for this patch would be to refactor the wget logic into 
the library, so that I could reuse GET and POST in a git toy, which I plan.

Best regards,
Moritz

Moritz C. Weber (1):
  Added basic post-data support

 toys/pending/wget.c | 21 +++--
 1 file changed, 15 insertions(+), 6 deletions(-)

-- 
2.20.1

___
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net