* [Xenomai] [PATCH] demo/alchemy/cross-link: Properly handle syscall errors
@ 2016-02-22 23:42 Michael Welling
2016-02-22 23:49 ` Gilles Chanteperdrix
2016-02-22 23:50 ` Michael Welling
0 siblings, 2 replies; 4+ messages in thread
From: Michael Welling @ 2016-02-22 23:42 UTC (permalink / raw)
To: xenomai, Gilles Chanteperdrix, Jan Kiszka, mwelling,
Lowell Gilbert
Update cross link demo to properly handle errors returned from syscalls.
Signed-off-by: Michael Welling <mwelling@ieee.org>
---
demo/alchemy/cobalt/cross-link.c | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/demo/alchemy/cobalt/cross-link.c b/demo/alchemy/cobalt/cross-link.c
index 8c0f53f..dceb928 100644
--- a/demo/alchemy/cobalt/cross-link.c
+++ b/demo/alchemy/cobalt/cross-link.c
@@ -23,6 +23,7 @@
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
+#include <errno.h>
#include <sys/mman.h>
#include <alchemy/task.h>
#include <alchemy/timer.h>
@@ -78,8 +79,8 @@ static int close_file( int fd, char *name)
do {
i++;
err = close(fd);
- switch (err) {
- case -EAGAIN:
+ switch (errno) {
+ case EAGAIN:
printf(MAIN_PREFIX "%s -> EAGAIN (%d times)\n",
name, i);
rt_task_sleep(50000); /* wait 50us */
@@ -89,10 +90,10 @@ static int close_file( int fd, char *name)
break;
default:
printf(MAIN_PREFIX "%s -> %s\n", name,
- strerror(-err));
+ strerror(errno));
break;
}
- } while (err == -EAGAIN && i < 10);
+ } while (errno == EAGAIN && i < 10);
return err;
}
@@ -158,7 +159,7 @@ static void write_task_proc(void *arg)
written = write(write_fd, &write_time, sz);
if (written < 0 ) {
printf(WTASK_PREFIX "error on write, %s\n",
- strerror(-err));
+ strerror(errno));
break;
} else if (written != sz) {
printf(WTASK_PREFIX "only %d / %zd byte transmitted\n",
@@ -201,8 +202,8 @@ static void read_task_proc(void *arg)
if (err) {
printf(RTASK_PREFIX
"error on RTSER_RTIOC_WAIT_EVENT, %s\n",
- strerror(-err));
- if (err == -ETIMEDOUT)
+ strerror(errno));
+ if (err == ETIMEDOUT)
continue;
break;
}
@@ -218,7 +219,7 @@ static void read_task_proc(void *arg)
nr++;
} else if (rd < 0 ) {
printf(RTASK_PREFIX "error on read, code %s\n",
- strerror(-err));
+ strerror(errno));
break;
} else {
printf(RTASK_PREFIX "only %d / %zd byte received \n",
@@ -245,7 +246,7 @@ int main(int argc, char* argv[])
write_fd = open( WRITE_FILE, 0);
if (write_fd < 0) {
printf(MAIN_PREFIX "can't open %s (write), %s\n", WRITE_FILE,
- strerror(-write_fd));
+ strerror(errno));
goto error;
}
write_state |= STATE_FILE_OPENED;
@@ -255,7 +256,7 @@ int main(int argc, char* argv[])
err = ioctl(write_fd, RTSER_RTIOC_SET_CONFIG, &write_config);
if (err) {
printf(MAIN_PREFIX "error while RTSER_RTIOC_SET_CONFIG, %s\n",
- strerror(-err));
+ strerror(errno));
goto error;
}
printf(MAIN_PREFIX "write-config written\n");
@@ -264,7 +265,7 @@ int main(int argc, char* argv[])
read_fd = open( READ_FILE, 0 );
if (read_fd < 0) {
printf(MAIN_PREFIX "can't open %s (read), %s\n", READ_FILE,
- strerror(-read_fd));
+ strerror(errno));
goto error;
}
read_state |= STATE_FILE_OPENED;
@@ -274,7 +275,7 @@ int main(int argc, char* argv[])
err = ioctl(read_fd, RTSER_RTIOC_SET_CONFIG, &read_config);
if (err) {
printf(MAIN_PREFIX "error while ioctl, %s\n",
- strerror(-err));
+ strerror(errno));
goto error;
}
printf(MAIN_PREFIX "read-config written\n");
--
2.1.4
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [Xenomai] [PATCH] demo/alchemy/cross-link: Properly handle syscall errors
2016-02-22 23:42 [Xenomai] [PATCH] demo/alchemy/cross-link: Properly handle syscall errors Michael Welling
@ 2016-02-22 23:49 ` Gilles Chanteperdrix
2016-02-22 23:51 ` Michael Welling
2016-02-22 23:50 ` Michael Welling
1 sibling, 1 reply; 4+ messages in thread
From: Gilles Chanteperdrix @ 2016-02-22 23:49 UTC (permalink / raw)
To: Michael Welling; +Cc: Jan Kiszka, xenomai
On Mon, Feb 22, 2016 at 05:42:28PM -0600, Michael Welling wrote:
> Update cross link demo to properly handle errors returned from syscalls.
>
> Signed-off-by: Michael Welling <mwelling@ieee.org>
> ---
> demo/alchemy/cobalt/cross-link.c | 25 +++++++++++++------------
> 1 file changed, 13 insertions(+), 12 deletions(-)
>
> diff --git a/demo/alchemy/cobalt/cross-link.c b/demo/alchemy/cobalt/cross-link.c
> index 8c0f53f..dceb928 100644
> --- a/demo/alchemy/cobalt/cross-link.c
> +++ b/demo/alchemy/cobalt/cross-link.c
> @@ -23,6 +23,7 @@
> #include <stdio.h>
> #include <signal.h>
> #include <unistd.h>
> +#include <errno.h>
> #include <sys/mman.h>
> #include <alchemy/task.h>
> #include <alchemy/timer.h>
> @@ -78,8 +79,8 @@ static int close_file( int fd, char *name)
> do {
> i++;
> err = close(fd);
> - switch (err) {
> - case -EAGAIN:
> + switch (errno) {
> + case EAGAIN:
This looks incorrect. errno has a meaningful value only if err is
-1. You could get away with setting errno to 0 before calling close,
this would probably work, but for a more complex service which calls
several syscalls under the hoold, this would not even work.
So, you should probably just add:
err = err < 0 ? -errno : 0;
--
Gilles.
https://click-hack.org
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [Xenomai] [PATCH] demo/alchemy/cross-link: Properly handle syscall errors
2016-02-22 23:49 ` Gilles Chanteperdrix
@ 2016-02-22 23:51 ` Michael Welling
0 siblings, 0 replies; 4+ messages in thread
From: Michael Welling @ 2016-02-22 23:51 UTC (permalink / raw)
To: Gilles Chanteperdrix; +Cc: Jan Kiszka, xenomai
On Tue, Feb 23, 2016 at 12:49:18AM +0100, Gilles Chanteperdrix wrote:
> On Mon, Feb 22, 2016 at 05:42:28PM -0600, Michael Welling wrote:
> > Update cross link demo to properly handle errors returned from syscalls.
> >
> > Signed-off-by: Michael Welling <mwelling@ieee.org>
> > ---
> > demo/alchemy/cobalt/cross-link.c | 25 +++++++++++++------------
> > 1 file changed, 13 insertions(+), 12 deletions(-)
> >
> > diff --git a/demo/alchemy/cobalt/cross-link.c b/demo/alchemy/cobalt/cross-link.c
> > index 8c0f53f..dceb928 100644
> > --- a/demo/alchemy/cobalt/cross-link.c
> > +++ b/demo/alchemy/cobalt/cross-link.c
> > @@ -23,6 +23,7 @@
> > #include <stdio.h>
> > #include <signal.h>
> > #include <unistd.h>
> > +#include <errno.h>
> > #include <sys/mman.h>
> > #include <alchemy/task.h>
> > #include <alchemy/timer.h>
> > @@ -78,8 +79,8 @@ static int close_file( int fd, char *name)
> > do {
> > i++;
> > err = close(fd);
> > - switch (err) {
> > - case -EAGAIN:
> > + switch (errno) {
> > + case EAGAIN:
>
> This looks incorrect. errno has a meaningful value only if err is
> -1. You could get away with setting errno to 0 before calling close,
> this would probably work, but for a more complex service which calls
> several syscalls under the hoold, this would not even work.
>
> So, you should probably just add:
> err = err < 0 ? -errno : 0;
Okay I will fix that up in v2 along with the other things that I missed.
>
> --
> Gilles.
> https://click-hack.org
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Xenomai] [PATCH] demo/alchemy/cross-link: Properly handle syscall errors
2016-02-22 23:42 [Xenomai] [PATCH] demo/alchemy/cross-link: Properly handle syscall errors Michael Welling
2016-02-22 23:49 ` Gilles Chanteperdrix
@ 2016-02-22 23:50 ` Michael Welling
1 sibling, 0 replies; 4+ messages in thread
From: Michael Welling @ 2016-02-22 23:50 UTC (permalink / raw)
To: xenomai, Gilles Chanteperdrix, Jan Kiszka, Lowell Gilbert
On Mon, Feb 22, 2016 at 05:42:28PM -0600, Michael Welling wrote:
> Update cross link demo to properly handle errors returned from syscalls.
>
> Signed-off-by: Michael Welling <mwelling@ieee.org>
> ---
> demo/alchemy/cobalt/cross-link.c | 25 +++++++++++++------------
> 1 file changed, 13 insertions(+), 12 deletions(-)
>
> diff --git a/demo/alchemy/cobalt/cross-link.c b/demo/alchemy/cobalt/cross-link.c
> index 8c0f53f..dceb928 100644
> --- a/demo/alchemy/cobalt/cross-link.c
> +++ b/demo/alchemy/cobalt/cross-link.c
> @@ -23,6 +23,7 @@
> #include <stdio.h>
> #include <signal.h>
> #include <unistd.h>
> +#include <errno.h>
> #include <sys/mman.h>
> #include <alchemy/task.h>
> #include <alchemy/timer.h>
> @@ -78,8 +79,8 @@ static int close_file( int fd, char *name)
> do {
> i++;
> err = close(fd);
> - switch (err) {
> - case -EAGAIN:
> + switch (errno) {
> + case EAGAIN:
> printf(MAIN_PREFIX "%s -> EAGAIN (%d times)\n",
> name, i);
> rt_task_sleep(50000); /* wait 50us */
> @@ -89,10 +90,10 @@ static int close_file( int fd, char *name)
> break;
> default:
> printf(MAIN_PREFIX "%s -> %s\n", name,
> - strerror(-err));
> + strerror(errno));
> break;
> }
> - } while (err == -EAGAIN && i < 10);
> + } while (errno == EAGAIN && i < 10);
>
> return err;
Missed the return code here.
> }
> @@ -158,7 +159,7 @@ static void write_task_proc(void *arg)
> written = write(write_fd, &write_time, sz);
> if (written < 0 ) {
> printf(WTASK_PREFIX "error on write, %s\n",
> - strerror(-err));
> + strerror(errno));
> break;
> } else if (written != sz) {
> printf(WTASK_PREFIX "only %d / %zd byte transmitted\n",
> @@ -201,8 +202,8 @@ static void read_task_proc(void *arg)
> if (err) {
> printf(RTASK_PREFIX
> "error on RTSER_RTIOC_WAIT_EVENT, %s\n",
> - strerror(-err));
> - if (err == -ETIMEDOUT)
> + strerror(errno));
> + if (err == ETIMEDOUT)
This should be if (errno == ETIMEDOUT)
> continue;
> break;
> }
> @@ -218,7 +219,7 @@ static void read_task_proc(void *arg)
> nr++;
> } else if (rd < 0 ) {
> printf(RTASK_PREFIX "error on read, code %s\n",
> - strerror(-err));
> + strerror(errno));
> break;
> } else {
> printf(RTASK_PREFIX "only %d / %zd byte received \n",
> @@ -245,7 +246,7 @@ int main(int argc, char* argv[])
> write_fd = open( WRITE_FILE, 0);
> if (write_fd < 0) {
> printf(MAIN_PREFIX "can't open %s (write), %s\n", WRITE_FILE,
> - strerror(-write_fd));
> + strerror(errno));
> goto error;
> }
> write_state |= STATE_FILE_OPENED;
> @@ -255,7 +256,7 @@ int main(int argc, char* argv[])
> err = ioctl(write_fd, RTSER_RTIOC_SET_CONFIG, &write_config);
> if (err) {
> printf(MAIN_PREFIX "error while RTSER_RTIOC_SET_CONFIG, %s\n",
> - strerror(-err));
> + strerror(errno));
> goto error;
Seems I forgot to consider the return code after the jump.
Here comes v2.
> }
> printf(MAIN_PREFIX "write-config written\n");
> @@ -264,7 +265,7 @@ int main(int argc, char* argv[])
> read_fd = open( READ_FILE, 0 );
> if (read_fd < 0) {
> printf(MAIN_PREFIX "can't open %s (read), %s\n", READ_FILE,
> - strerror(-read_fd));
> + strerror(errno));
> goto error;
> }
> read_state |= STATE_FILE_OPENED;
> @@ -274,7 +275,7 @@ int main(int argc, char* argv[])
> err = ioctl(read_fd, RTSER_RTIOC_SET_CONFIG, &read_config);
> if (err) {
> printf(MAIN_PREFIX "error while ioctl, %s\n",
> - strerror(-err));
> + strerror(errno));
> goto error;
> }
> printf(MAIN_PREFIX "read-config written\n");
> --
> 2.1.4
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-02-22 23:51 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-22 23:42 [Xenomai] [PATCH] demo/alchemy/cross-link: Properly handle syscall errors Michael Welling
2016-02-22 23:49 ` Gilles Chanteperdrix
2016-02-22 23:51 ` Michael Welling
2016-02-22 23:50 ` Michael Welling
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.