* [PATCH] compat/mingw.[ch]: Change return type of exec functions to int
@ 2012-04-05 17:48 Ramsay Jones
2012-04-05 18:16 ` Jonathan Nieder
0 siblings, 1 reply; 8+ messages in thread
From: Ramsay Jones @ 2012-04-05 17:48 UTC (permalink / raw)
To: Jeff King; +Cc: Junio C Hamano, GIT Mailing-list
The POSIX standard specifies a return type of int for all six exec
functions. In addition, all exec functions return -1 on error, and
simply do not return on success. However, the current emulation of
the exec functions on mingw are declared with a void return type.
This would cause a problem should any code attempt to call the
exec function in a non-void context. In particular, if an exec
function were used in a conditional it would fail to compile.
In order to improve the fidelity of the emulation, we change the
return type of the mingw_execv[p] functions to int and return -1
on error.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
---
Hi Jeff,
Since commit b0984f82 ("run-command: treat inaccessible directories
as ENOENT", 30-03-2012), the mingw build fails as follows:
CC run-command.o
run-command.c: In function 'sane_execvp':
run-command.c:124: error: invalid use of void expression
make: *** [run-command.o] Error 1
My first reaction was to simply remove the conditional since, if execvp()
returns at all, the result will always be -1 and so the condition will
always be false. ie. the conditional is pointless.
However, I found the incorrect return type of the mingw_execv[p]() to be
a gratuitous incompatibility, so ... :-P
Could you (or Junio?) add this patch prior to your patch on this branch ?
Thanks in advance!
I will let you decide if you want to remove the conditional as well ...
ATB,
Ramsay Jones
compat/mingw.c | 6 ++++--
compat/mingw.h | 4 ++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index a0ac487..afc892d 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1003,7 +1003,7 @@ static void mingw_execve(const char *cmd, char *const *argv, char *const *env)
}
}
-void mingw_execvp(const char *cmd, char *const *argv)
+int mingw_execvp(const char *cmd, char *const *argv)
{
char **path = get_path_split();
char *prog = path_lookup(cmd, path, 0);
@@ -1015,11 +1015,13 @@ void mingw_execvp(const char *cmd, char *const *argv)
errno = ENOENT;
free_path_split(path);
+ return -1;
}
-void mingw_execv(const char *cmd, char *const *argv)
+int mingw_execv(const char *cmd, char *const *argv)
{
mingw_execve(cmd, argv, environ);
+ return -1;
}
int mingw_kill(pid_t pid, int sig)
diff --git a/compat/mingw.h b/compat/mingw.h
index 0ff1e04..ef5b150 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -274,9 +274,9 @@ int mingw_utime(const char *file_name, const struct utimbuf *times);
pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env,
const char *dir,
int fhin, int fhout, int fherr);
-void mingw_execvp(const char *cmd, char *const *argv);
+int mingw_execvp(const char *cmd, char *const *argv);
#define execvp mingw_execvp
-void mingw_execv(const char *cmd, char *const *argv);
+int mingw_execv(const char *cmd, char *const *argv);
#define execv mingw_execv
static inline unsigned int git_ntohl(unsigned int x)
--
1.7.9
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] compat/mingw.[ch]: Change return type of exec functions to int
2012-04-05 17:48 [PATCH] compat/mingw.[ch]: Change return type of exec functions to int Ramsay Jones
@ 2012-04-05 18:16 ` Jonathan Nieder
2012-04-05 22:06 ` Jeff King
0 siblings, 1 reply; 8+ messages in thread
From: Jonathan Nieder @ 2012-04-05 18:16 UTC (permalink / raw)
To: Ramsay Jones; +Cc: Jeff King, Junio C Hamano, GIT Mailing-list
Ramsay Jones wrote:
> CC run-command.o
> run-command.c: In function 'sane_execvp':
> run-command.c:124: error: invalid use of void expression
> make: *** [run-command.o] Error 1
>
> My first reaction was to simply remove the conditional since, if execvp()
> returns at all, the result will always be -1 and so the condition will
> always be false. ie. the conditional is pointless.
>
> However, I found the incorrect return type of the mingw_execv[p]() to be
> a gratuitous incompatibility, so ... :-P
My bad. I agree that in addition to making the return type fix,
squashing the following into jk/run-command-eacces would be a good
idea.
diff --git i/run-command.c w/run-command.c
index 04f0190d..fcd7e192 100644
--- i/run-command.c
+++ w/run-command.c
@@ -59,8 +59,7 @@ static int exists_in_PATH(const char *file)
int sane_execvp(const char *file, char * const argv[])
{
- if (!execvp(file, argv))
- return 0;
+ execvp(file, argv);
/*
* When a command can't be found because one of the directories
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] compat/mingw.[ch]: Change return type of exec functions to int
2012-04-05 18:16 ` Jonathan Nieder
@ 2012-04-05 22:06 ` Jeff King
2012-04-05 22:34 ` Jonathan Nieder
0 siblings, 1 reply; 8+ messages in thread
From: Jeff King @ 2012-04-05 22:06 UTC (permalink / raw)
To: Jonathan Nieder; +Cc: Ramsay Jones, Junio C Hamano, GIT Mailing-list
On Thu, Apr 05, 2012 at 01:16:01PM -0500, Jonathan Nieder wrote:
> Ramsay Jones wrote:
>
> > CC run-command.o
> > run-command.c: In function 'sane_execvp':
> > run-command.c:124: error: invalid use of void expression
> > make: *** [run-command.o] Error 1
> >
> > My first reaction was to simply remove the conditional since, if execvp()
> > returns at all, the result will always be -1 and so the condition will
> > always be false. ie. the conditional is pointless.
> >
> > However, I found the incorrect return type of the mingw_execv[p]() to be
> > a gratuitous incompatibility, so ... :-P
Yeah, it is just asking for trouble to #define a new execvp that does
not match the declaration of the existing one, so I think Ramsay's patch
is good.
> My bad. I agree that in addition to making the return type fix,
> squashing the following into jk/run-command-eacces would be a good
> idea.
>
> diff --git i/run-command.c w/run-command.c
> index 04f0190d..fcd7e192 100644
> --- i/run-command.c
> +++ w/run-command.c
> @@ -59,8 +59,7 @@ static int exists_in_PATH(const char *file)
>
> int sane_execvp(const char *file, char * const argv[])
> {
> - if (!execvp(file, argv))
> - return 0;
> + execvp(file, argv);
I don't have a strong opinion. The "return 0" is a little misleading,
since it will never be called, but I think we should at least have a
comment like:
diff --git a/run-command.c b/run-command.c
index 7123436..5b6a368 100644
--- a/run-command.c
+++ b/run-command.c
@@ -117,8 +117,11 @@ static int exists_in_PATH(const char *file)
int sane_execvp(const char *file, char * const argv[])
{
- if (!execvp(file, argv))
- return 0;
+ /*
+ * No need to check the return value; if it returns at all, an error
+ * occurred.
+ */
+ execvp(file, argv);
/*
* When a command can't be found because one of the directories
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] compat/mingw.[ch]: Change return type of exec functions to int
2012-04-05 22:06 ` Jeff King
@ 2012-04-05 22:34 ` Jonathan Nieder
2012-04-06 0:24 ` Jeff King
0 siblings, 1 reply; 8+ messages in thread
From: Jonathan Nieder @ 2012-04-05 22:34 UTC (permalink / raw)
To: Jeff King; +Cc: Ramsay Jones, Junio C Hamano, GIT Mailing-list
Jeff King wrote:
> I don't have a strong opinion. The "return 0" is a little misleading,
> since it will never be called, but I think we should at least have a
> comment like:
[...]
> --- a/run-command.c
> +++ b/run-command.c
> @@ -117,8 +117,11 @@ static int exists_in_PATH(const char *file)
>
> int sane_execvp(const char *file, char * const argv[])
> {
> - if (!execvp(file, argv))
> - return 0;
> + /*
> + * No need to check the return value; if it returns at all, an error
> + * occurred.
> + */
> + execvp(file, argv);
>
I'd rather have the "return 0" then. Such a comment that focuses on C
library details rather than providing additional information for
understanding the sane_execvp function is distracting.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] compat/mingw.[ch]: Change return type of exec functions to int
2012-04-05 22:34 ` Jonathan Nieder
@ 2012-04-06 0:24 ` Jeff King
2012-04-06 0:42 ` Jonathan Nieder
0 siblings, 1 reply; 8+ messages in thread
From: Jeff King @ 2012-04-06 0:24 UTC (permalink / raw)
To: Jonathan Nieder; +Cc: Ramsay Jones, Junio C Hamano, GIT Mailing-list
On Thu, Apr 05, 2012 at 05:34:36PM -0500, Jonathan Nieder wrote:
> > --- a/run-command.c
> > +++ b/run-command.c
> > @@ -117,8 +117,11 @@ static int exists_in_PATH(const char *file)
> >
> > int sane_execvp(const char *file, char * const argv[])
> > {
> > - if (!execvp(file, argv))
> > - return 0;
> > + /*
> > + * No need to check the return value; if it returns at all, an error
> > + * occurred.
> > + */
> > + execvp(file, argv);
> >
>
> I'd rather have the "return 0" then. Such a comment that focuses on C
> library details rather than providing additional information for
> understanding the sane_execvp function is distracting.
I think both (attempt to) document the same thing: that if we get past
execvp, we know are in error-checking mode. Which is not explicitly said
anywhere. So maybe:
diff --git a/run-command.c b/run-command.c
index 7123436..e6ece79 100644
--- a/run-command.c
+++ b/run-command.c
@@ -117,10 +117,12 @@ static int exists_in_PATH(const char *file)
int sane_execvp(const char *file, char * const argv[])
{
- if (!execvp(file, argv))
- return 0;
+ execvp(file, argv);
/*
+ * If we are still running, we know an error occurred; let's try to
+ * diagnose it more specifically.
+ *
* When a command can't be found because one of the directories
* listed in $PATH is unsearchable, execvp reports EACCES, but
* careful usability testing (read: analysis of occasional bug
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] compat/mingw.[ch]: Change return type of exec functions to int
2012-04-06 0:24 ` Jeff King
@ 2012-04-06 0:42 ` Jonathan Nieder
2012-04-06 0:44 ` Jeff King
0 siblings, 1 reply; 8+ messages in thread
From: Jonathan Nieder @ 2012-04-06 0:42 UTC (permalink / raw)
To: Jeff King; +Cc: Ramsay Jones, Junio C Hamano, GIT Mailing-list
Jeff King wrote:
> I think both (attempt to) document the same thing: that if we get past
> execvp, we know are in error-checking mode. Which is not explicitly said
> anywhere. So maybe:
>
> diff --git a/run-command.c b/run-command.c
> index 7123436..e6ece79 100644
> --- a/run-command.c
> +++ b/run-command.c
> @@ -117,10 +117,12 @@ static int exists_in_PATH(const char *file)
>
> int sane_execvp(const char *file, char * const argv[])
> {
> - if (!execvp(file, argv))
> - return 0;
> + execvp(file, argv);
>
> /*
> + * If we are still running, we know an error occurred; let's try to
> + * diagnose it more specifically.
> + *
> * When a command can't be found because one of the directories
Looks fine to me. :)
Thanks for your patience.
Jonathan
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] compat/mingw.[ch]: Change return type of exec functions to int
2012-04-06 0:42 ` Jonathan Nieder
@ 2012-04-06 0:44 ` Jeff King
2012-04-06 1:00 ` Junio C Hamano
0 siblings, 1 reply; 8+ messages in thread
From: Jeff King @ 2012-04-06 0:44 UTC (permalink / raw)
To: Jonathan Nieder; +Cc: Ramsay Jones, Junio C Hamano, GIT Mailing-list
On Thu, Apr 05, 2012 at 07:42:26PM -0500, Jonathan Nieder wrote:
> > /*
> > + * If we are still running, we know an error occurred; let's try to
> > + * diagnose it more specifically.
> > + *
> > * When a command can't be found because one of the directories
>
> Looks fine to me. :)
Thanks. Junio, do you mind squashing this onto the tip of
jk/run-command-eaccess? Patch repeated below for your convenience.
This should fix Ramsay's problem, but I think his patch is worth
applying, anyway.
---
diff --git a/run-command.c b/run-command.c
index 7123436..e6ece79 100644
--- a/run-command.c
+++ b/run-command.c
@@ -117,10 +117,12 @@ static int exists_in_PATH(const char *file)
int sane_execvp(const char *file, char * const argv[])
{
- if (!execvp(file, argv))
- return 0;
+ execvp(file, argv);
/*
+ * If we are still running, we know an error occurred; let's try to
+ * diagnose it more specifically.
+ *
* When a command can't be found because one of the directories
* listed in $PATH is unsearchable, execvp reports EACCES, but
* careful usability testing (read: analysis of occasional bug
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] compat/mingw.[ch]: Change return type of exec functions to int
2012-04-06 0:44 ` Jeff King
@ 2012-04-06 1:00 ` Junio C Hamano
0 siblings, 0 replies; 8+ messages in thread
From: Junio C Hamano @ 2012-04-06 1:00 UTC (permalink / raw)
To: Jeff King; +Cc: Jonathan Nieder, Ramsay Jones, Junio C Hamano, GIT Mailing-list
Jeff King <peff@peff.net> writes:
> On Thu, Apr 05, 2012 at 07:42:26PM -0500, Jonathan Nieder wrote:
>
>> > /*
>> > + * If we are still running, we know an error occurred; let's try to
>> > + * diagnose it more specifically.
>> > + *
>> > * When a command can't be found because one of the directories
>>
>> Looks fine to me. :)
>
> Thanks. Junio, do you mind squashing this onto the tip of
> jk/run-command-eaccess? Patch repeated below for your convenience.
Thanks. I've pushed out today's round already, so maybe later.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2012-04-06 1:00 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-05 17:48 [PATCH] compat/mingw.[ch]: Change return type of exec functions to int Ramsay Jones
2012-04-05 18:16 ` Jonathan Nieder
2012-04-05 22:06 ` Jeff King
2012-04-05 22:34 ` Jonathan Nieder
2012-04-06 0:24 ` Jeff King
2012-04-06 0:42 ` Jonathan Nieder
2012-04-06 0:44 ` Jeff King
2012-04-06 1:00 ` Junio C Hamano
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.