2 * Copyright (c) 2013 Vojtech Horky
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #include "libiberty.h"
35 #include "pex-common.h"
37 #include <libc/task.h>
45 * Implementation of the individual operations.
48 static int pex_helenos_open_read(struct pex_obj
*obj ATTRIBUTE_UNUSED
,
49 const char *name
, int binary ATTRIBUTE_UNUSED
)
51 return open(name
, O_RDONLY
);
54 static int pex_helenos_open_write(struct pex_obj
*obj ATTRIBUTE_UNUSED
,
55 const char *name
, int binary ATTRIBUTE_UNUSED
)
57 return open(name
, O_WRONLY
| O_CREAT
| O_TRUNC
);
60 static int pex_helenos_close(struct pex_obj
*obj ATTRIBUTE_UNUSED
, int fd
)
65 static pid_t
pex_helenos_exec_child(struct pex_obj
*obj ATTRIBUTE_UNUSED
,
66 int flags ATTRIBUTE_UNUSED
,
67 const char *executable
, char * const * argv
,
68 char * const * env ATTRIBUTE_UNUSED
,
69 int in
, int out
, int errdes
,
70 int toclose ATTRIBUTE_UNUSED
,
71 const char **errmsg
, int *err
)
79 task_id_t task_id
= 0;
81 // FIXME: decide on paths
82 snprintf(full_path
, 1023, "/app/%s", executable
);
83 int rc
= task_spawnvf(&task_id
, full_path
, argv
, files
);
87 *errmsg
= "task_spawnvf";
91 return (pid_t
) task_id
;
94 static int pex_helenos_wait(struct pex_obj
*obj ATTRIBUTE_UNUSED
,
95 pid_t pid
, int *status
,
96 struct pex_time
*time
, int done
,
97 const char **errmsg
, int *err
)
100 * If @c done is set, we are cleaning-up. Kill the process
104 task_kill( (task_id_t
) pid
);
108 memset(time
, 0, sizeof(*time
));
111 task_exit_t task_exit
;
113 int rc
= task_wait((task_id_t
) pid
, &task_exit
, &task_retval
);
116 *errmsg
= "task_wait";
120 if (task_exit
== TASK_EXIT_UNEXPECTED
) {
124 *status
= task_retval
;
132 * PEX initialization.
135 const struct pex_funcs funcs
= {
136 pex_helenos_open_read
,
137 pex_helenos_open_write
,
138 pex_helenos_exec_child
,
147 struct pex_obj
*pex_init(int flags
, const char *pname
, const char *tempbase
)
149 return pex_init_common(flags
, pname
, tempbase
, &funcs
);