On Mon, Jul 23, 2012 at 2:24 PM, Glenn Fowler <[email protected]> wrote:
>
> On Mon, 23 Jul 2012 12:24:10 +0200 Michal Hlavinka wrote:
>> On 07/23/2012 04:45 AM, Glenn Fowler wrote:
>> >
>> > I'm finally caught up with the ast-* posts from the last 3 weeks
>> > the posix_spawn thread inspired a new iffe C code test feature
>> > that allows the tests to annotate reasons for test failure
>> > (besides the test not compiling at all, which can be a valid test too)
>> > NOTE("reason text");
>> > can be called (preferably once per failure) and "reason text" will appear
>> > in the iffe --verbose (-v) output on stderr
>> >
>> > the new version of iffe will be posted later on Monday
>> ...
>> ...
>> >
>> > here is the annotated posix_spawn test
>> > --
>> > linux fails with "ENOEXEC invokes sh"
>
>> It was fixed in glibc upstream:
>> http://sourceware.org/bugzilla/show_bug.cgi?id=13134
>> It works in all active Fedora releases. It'll work in rhel7. I'll check
>> what I can do about present rhel releases.
>
> thanks Michal
> I should have added that I also read the "fixed" part of the issue
Erm... it's still not working in ast-ksh.2012-09-11. The iffe probe
still prints an error:
-- snip --
iffe: test: posix_spawn exists and it works and its worth using ...
ENOEXEC produces exit status 127 (GOOD) ... yes
-- snip --
... the "GOOD" may be a bit misleading ("GOOD" means "working" ... but
the iffe probe must return "BEST" to reflect that the
|posix_spawn()|-implementatoin is fully POSIX/SUS-conformant...).
Below is a testcase which should exit with an exit code of 2 and
stdout something matching to *BEST*:
-- snip --
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <spawn.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define NOTE(x) fprintf(stderr, x "\n")
/* if it uses fork() why bother? */
#undef fork
pid_t fork (void) { NOTE("uses fork()"); return -1; }
pid_t _fork (void) { NOTE("uses _fork()"); return -1; }
pid_t __fork (void) { NOTE("uses __fork()"); return -1; }
int
main(int argc, char** argv)
{
char* s;
pid_t pid;
posix_spawnattr_t attr;
int n;
int status;
char* cmd[3];
char tmp[1024];
if (argv[1])
exit(signal(SIGHUP, SIG_DFL) != SIG_IGN);
signal(SIGHUP, SIG_IGN);
if (posix_spawnattr_init(&attr))
{
NOTE("posix_spawnattr_init() FAILED");
exit(0);
}
if (posix_spawnattr_setpgroup(&attr, 0))
{
NOTE("posix_spawnattr_setpgroup() FAILED");
exit(0);
}
if (posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETPGROUP))
{
NOTE("posix_spawnattr_setflags() FAILED");
exit(0);
}
/* first try an a.out and verify that SIGHUP is ignored */
cmd[0] = argv[0];
cmd[1] = "test";
cmd[2] = 0;
if (posix_spawn(&pid, cmd[0], 0, &attr, cmd, 0))
{
NOTE("posix_spawn() FAILED");
exit(0);
}
status = 1;
if (wait(&status) < 0)
{
NOTE("wait() FAILED");
exit(0);
}
if (status != 0)
{
NOTE("SIGHUP ignored in parent not ignored in child");
exit(0);
}
/* must return exec-type errors or its useless to us *unless* there
is no [v]fork() */
n = strlen(cmd[0]);
if (n >= (sizeof(tmp) - 3))
{
NOTE("test executable path too long");
exit(0);
}
strcpy(tmp, cmd[0]);
tmp[n] = '.';
tmp[n+1] = 's';
tmp[n+2] = 'h';
tmp[n+3] = 0;
if ((n = open(tmp, O_CREAT|O_WRONLY, S_IRWXU|S_IRWXG|S_IRWXO)) < 0 ||
chmod(tmp, S_IRWXU|S_IRWXG|S_IRWXO) < 0 ||
write(n, "exit 99\n", 8) != 8 ||
close(n) < 0)
{
NOTE("test script create FAILED");
exit(0);
}
cmd[0] = tmp;
n = 0; /* 0 means reject */
pid = -1;
if (posix_spawn(&pid, cmd[0], 0, &attr, cmd, 0))
{
n = 2;
NOTE("ENOEXEC produces posix_spawn() error (BEST)");
}
else if (pid == -1)
NOTE("ENOEXEC returns pid == -1");
else if (wait(&status) != pid)
NOTE("ENOEXEC produces no child process");
else if (!WIFEXITED(status))
NOTE("ENOEXEC produces signal exit");
else
{
status = WEXITSTATUS(status);
if (status == 127)
{
n = 1;
NOTE("ENOEXEC produces exit status 127");
}
else if (status == 99)
NOTE("ENOEXEC invokes sh");
else if (status == 0)
NOTE("ENOEXEC reports no error");
}
exit(n);
}
-- snip --
Solaris 11FCS and AIX pass this test...
----
Bye,
Roland
--
__ . . __
(o.\ \/ /.o) [email protected]
\__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer
/O /==\ O\ TEL +49 641 3992797
(;O/ \/ \O;)
_______________________________________________
ast-developers mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/ast-developers