Headers and libraries also archived
[harbours.git] / gcc / pex-helenos.c
blob5e7afa5e8732262ad62cff8e6534ba55503fe616
1 /*
2 * Copyright (c) 2013 Vojtech Horky
3 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
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.
29 #ifndef __helenos__
30 #include "pex-unix.c"
31 #else
33 #include "config.h"
34 #include "libiberty.h"
35 #include "pex-common.h"
37 #include <libc/task.h>
38 #include <string.h>
39 #include <fcntl.h>
40 #include <unistd.h>
41 #include <stdio.h>
42 #include <limits.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)
62 return close(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)
73 int *files[4];
74 files[0] = &in;
75 files[1] = &out;
76 files[2] = &errdes;
77 files[3] = NULL;
79 task_id_t task_id = 0;
80 char full_path[1024];
81 // FIXME: decide on paths
82 snprintf(full_path, 1023, "/app/%s", executable);
83 int rc = task_spawnvf(&task_id, full_path, argv, files);
85 if (rc != 0) {
86 *err = rc;
87 *errmsg = "task_spawnvf";
88 return (pid_t) -1;
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
101 * mercilessly.
103 if (done) {
104 task_kill( (task_id_t) pid);
107 if (time != NULL) {
108 memset(time, 0, sizeof(*time));
111 task_exit_t task_exit;
112 int task_retval;
113 int rc = task_wait((task_id_t) pid, &task_exit, &task_retval);
114 if (rc != 0) {
115 *err = -rc;
116 *errmsg = "task_wait";
117 *status = -rc;
118 return -1;
119 } else {
120 if (task_exit == TASK_EXIT_UNEXPECTED) {
121 *status = INT_MIN;
122 return -1;
123 } else {
124 *status = task_retval;
125 return 0;
132 * PEX initialization.
135 const struct pex_funcs funcs = {
136 pex_helenos_open_read,
137 pex_helenos_open_write,
138 pex_helenos_exec_child,
139 pex_helenos_close,
140 pex_helenos_wait,
141 NULL,
142 NULL,
143 NULL,
144 NULL
147 struct pex_obj *pex_init(int flags, const char *pname, const char *tempbase)
149 return pex_init_common(flags, pname, tempbase, &funcs);
152 #endif