Hi Lili, On Wed, Mar 06, 2024 at 09:02:47PM +0100, Lili Püspök wrote: > Hi Alex, I tried to follow your instructions and applied your concept. > I hope it is ok now. It is. > Cheers > PuLi > > > From fca55af92ec1993823e70a4460a08197fa8da01a Mon Sep 17 00:00:00 2001 > From: =?UTF-8?q?P=C3=BCsp=C3=B6k=20Lili?= <poordirtylili@xxxxxxxxx> > Date: Wed, 6 Mar 2024 20:51:38 +0100 > Subject: [PATCH] [patch] sample program in man7/unix.7 > > Signed-off-by: PuLi <poordirtylili@xxxxxxxxx> > Fixes: 15545eb6d7ae ("unix.7: Add example") > Cc: Heinrich Schuchardt <xypron.glpk@xxxxxx> > > Client wants to send END while server already closed the connection > on DOWN, so connection is broken instead of the Result = 0 in the > sample on sending a single DOWN. > Now, the server disconnects only on first END. After DOWN, all further > processing of number stops. > Patch does not handle cases of double END sending, multiple clients > etc. Patch applied. Thanks. <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=4fe1c74b42f99b3682114e1dab1200f6ced6881f> Have a lovely night! Alex > --- > man7/unix.7 | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/man7/unix.7 b/man7/unix.7 > index cb1dcae45..2dc4f489e 100644 > --- a/man7/unix.7 > +++ b/man7/unix.7 > @@ -1057,12 +1057,16 @@ main(int argc, char *argv[]) > \& > if (!strncmp(buffer, "DOWN", sizeof(buffer))) { > down_flag = 1; > - break; > + continue; > } > \& > if (!strncmp(buffer, "END", sizeof(buffer))) { > break; > } > +\& > + if (down_flag) { > + continue; > + } > \& > /* Add received summand. */ > \& > -- > 2.39.2 > > Alejandro Colomar <alx@xxxxxxxxxx> ezt írta (időpont: 2024. márc. 6., > Sze, 13:19): > > > > [CC += Heinrich] > > > > Hi Lili, > > > > On Mon, Mar 04, 2024 at 05:41:17PM +0100, Lili Püspök wrote: > > > Hi Alejandro, > > > Thanks for replying. > > > > > > The client, after connecting, processes the argv items and sends all > > > of them, then issues the sending of a final END which, on the server > > > side, is not expected after DOWN which would halt the reading (In that > > > case, too, the processing of argv + the END should happen). > > > After the change, DOWN does not break the reading, the closing END is > > > processed and there is no broken connection when client tries to send > > > END while the server closes after sending the result, which is not > > > received by the client. > > > > Hmmm, now I understand. > > > > > > > > --- without DOWN ---- > > > client server > > > argv1..N + END ---> > > > <----- result > > > <---- connection closed > > > > > > -----------problem----------- > > > argv1...N + DOWN -> > > > <---- result > > > END -> ????? > > > <---- connection closed > > > > > > ------- solution:--------- > > > argv1...N + DOWN + END -> > > > <---- result > > > <---- connection closed > > > > Yep, I can reproduce this problem all the way back to the original > > implementation of the example programs. I extracted the original > > programs with: > > > > $ git show 15545eb6d7:man7/unix.7 | man /dev/stdin | cat > > > > And then cut and paste to the C files. > > > > $ cc -Wall -o server server.c > > $ cc -Wall -o client client.c > > $ ./server & > > [1] 94644 > > $ ./client 3 4 > > Result = 7 > > $ ./client 11 -5 > > Result = 6 > > $ ./client DOWN > > recv: Connection reset by peer > > [1]+ Done ./server > > $ > > > > This behavior conflicts with the behavior shown in the manual page, > > which shows (for the last command): > > > > $ ./client DOWN > > Result = 0 > > [1]+ Done ./server > > > > So it seems like a bug. Maybe the server program was slow enough when > > it was implemented in 2016, that the server hadn't closed the socket > > when the client sent "END", so the client didn't fail to read the > > result?? > > > > Anyway, we need to fix it. Agree. > > > > Please add > > > > Fixes: 15545eb6d7ae ("unix.7: Add example") > > Cc: Heinrich Schuchardt <xypron.glpk@xxxxxx> > > > > to the commit message, as well as a small description of the problem. > > > > > I hope I did not overlook something. > > > > However, I'm not convinced by your patch. It seems to allow > > > > $ ./client DOWN 4 3 > > > > which I don't think we want to support. I think we have two options: > > > > - The client avoids sending "END" after "DOWN" (so DOWN implies END). > > - The server only accepts "END" after "DOWN". > > > > Does it make sense to you? > > > > Have a lovely day! > > Alex > > > > > OK, maybe with a unique message containing only the DOWN from client, > > > the issue is not visible, because there is no result to return to > > > client and we don't care it the connection is just broken.... > > > > > > Cheers > > > PuLi > > > > > > Alejandro Colomar <alx@xxxxxxxxxx> ezt írta (időpont: 2024. márc. 4., H, 17:22): > > > > > > > > Hi Lili, > > > > > > > > > Subject: Re: patch - fixing sample program in unix.7 > > > > > > > > On Sun, Mar 03, 2024 at 08:27:17PM +0100, Lili Püspök wrote: > > > > > diff --git a/man7/unix.7 b/man7/unix.7 > > > > > > > > Please add some commit message. I don't understand what this patch > > > > does. How is it broken, and how does it fix it? > > > > > > > > > index cb1dcae45..7fb41af99 100644 > > > > > --- a/man7/unix.7 > > > > > +++ b/man7/unix.7 > > > > > @@ -1057,7 +1057,7 @@ main(int argc, char *argv[]) > > > > > \& > > > > > if (!strncmp(buffer, "DOWN", sizeof(buffer))) { > > > > > down_flag = 1; > > > > > - break; > > > > > + continue; > > > > > > > > DOWN is used to stop the server. How would 'continue' help? > > > > > > > > > > > > $ MANWIDTH=66 man unix | grep -C2 DOWN > > > > tegers. The client prints the sum and exits. The server > > > > waits for the next client to connect. To stop the server, > > > > the client is called with the command‐line argument "DOWN". > > > > > > > > The following output was recorded while running the server > > > > in the background and repeatedly executing the client. Ex‐ > > > > ecution of the server program ends when it receives the > > > > "DOWN" command. > > > > > > > > Example output > > > > -- > > > > $ ./client 11 -5 > > > > Result = 6 > > > > $ ./client DOWN > > > > Result = 0 > > > > [1]+ Done ./server > > > > -- > > > > /* Handle commands. */ > > > > > > > > if (!strncmp(buffer, "DOWN", sizeof(buffer))) { > > > > down_flag = 1; > > > > break; > > > > -- > > > > close(data_socket); > > > > > > > > /* Quit on DOWN command. */ > > > > > > > > if (down_flag) { > > > > > > > > Have a lovely day, > > > > Alex > > > > > > > > > > > > > } > > > > > \& > > > > > if (!strncmp(buffer, "END", sizeof(buffer))) { > > > > > > > > > > > > > -- > > > > <https://www.alejandro-colomar.es/> > > > > Looking for a remote C programming job at the moment. > > > > -- > > <https://www.alejandro-colomar.es/> > > Looking for a remote C programming job at the moment. -- <https://www.alejandro-colomar.es/>
Attachment:
signature.asc
Description: PGP signature