/*
- Copyright 2015 IoT.bzh
+ Copyright 2015, 2016, 2017 IoT.bzh
author: José Bollo <jose.bollo@iot.bzh>
*/
static const int ready_timeout = 1500;
+#if defined(DUMP_LAUNCHERS)
/*
* dump all the known launchers to the 'file'
*/
fprintf(file, "\n");
}
}
+#endif
/*
* update 'cread' to point the the next token
static int next_token(struct confread *cread)
{
int idx = cread->index + cread->length;
- cread->index = idx + strspn(&cread->buffer[idx], separators);
- cread->length = strcspn(&cread->buffer[cread->index], separators);
+ cread->index = idx + (int)strspn(&cread->buffer[idx], separators);
+ cread->length = (int)strcspn(&cread->buffer[cread->index], separators);
return cread->length;
}
{
while (fgets(cread->buffer, sizeof cread->buffer, cread->file) != NULL) {
cread->lineno++;
- cread->index = strspn(cread->buffer, separators);
+ cread->index = (int)strspn(cread->buffer, separators);
if (cread->buffer[cread->index]
&& cread->buffer[cread->index] != '#') {
- cread->length = strcspn(&cread->buffer[cread->index],
- separators);
+ cread->length = (int)strcspn(
+ &cread->buffer[cread->index], separators);
assert(cread->length > 0);
return cread->length;
}
int index0, length0;
const char **vector;
char *args;
- int count, length;
+ unsigned count, length;
/* record origin */
index0 = cread->index;
length = 0;
while(cread->length) {
count++;
- length += cread->length;
+ length += (unsigned)cread->length;
next_token(cread);
}
count = 0;
while(cread->length) {
vector[count++] = args;
- memcpy(args, &cread->buffer[cread->index], cread->length);
+ memcpy(args, &cread->buffer[cread->index],
+ (unsigned)cread->length);
args += cread->length;
*args++ = 0;
next_token(cread);
}
/* allocate structure */
- result = malloc(sizeof(struct type_list) + length);
+ result = malloc(sizeof(struct type_list) + (unsigned)length);
if (result == NULL) {
ERROR("%s:%d: out of memory", cread->filepath, cread->lineno);
errno = ENOMEM;
}
/* fill the structure */
- memcpy(result->type, &cread->buffer[index], length);
+ memcpy(result->type, &cread->buffer[index], (unsigned)length);
result->type[length] = 0;
return result;
}
/*
%% %
%a appid desc->appid
+%b bindings desc->bindings
%c content desc->content
%D datadir params->datadir
%H height desc->height
%I icondir FWK_ICON_DIR
%m mime-type desc->type
%n name desc->name
-%p plugins desc->plugins
%P port params->port
%r rootdir desc->path
%R readyfd params->readyfd
const char * const *iter;
const char *p, *v;
char *data, c, sep;
- int n, s;
+ unsigned n, s;
union arguments result;
char port[20], width[20], height[20], readyfd[20], mini[3];
c = *p++;
switch (c) {
case 'a': v = desc->appid; break;
+ case 'b':
+ v = "" /*TODO:desc->bindings*/;
+ break;
case 'c': v = desc->content; break;
case 'D': v = params->datadir; break;
case 'H':
params->port);
v = port;
break;
- case 'p':
- v = "" /*TODO:desc->plugins*/;
- break;
case 'R':
if(!data)
sprintf(readyfd, "%d",
break;
case '%':
c = 0;
+ /*@fallthrough@*/
default:
mini[1] = c;
v = mini;
if (data)
data = stpcpy(data, v);
else
- s += strlen(v);
+ s += (unsigned)strlen(v);
}
}
/* terminate the argument */
)
{
int rc;
- char **args;
+ char **args, **env;
pid_t pid;
int rpipe[2];
struct pollfd pfd;
/* instanciate the arguments */
params->readyfd = rpipe[1];
args = instantiate_arguments(exec->args, desc, params, 1).vector;
- if (args == NULL) {
+ env = instantiate_arguments((const char * const*)environ,
+ desc, params, 1).vector;
+ if (args == NULL || env == NULL) {
close(rpipe[0]);
close(rpipe[1]);
+ free(args);
+ free(env);
ERROR("out of memory in master");
errno = ENOMEM;
return -1;
close(rpipe[0]);
close(rpipe[1]);
free(args);
+ free(env);
ERROR("master fork failed: %m");
return -1;
}
close(rpipe[1]);
free(args);
+ free(env);
pfd.fd = rpipe[0];
pfd.events = POLLIN;
close(rpipe[0]);
+ /* set name by appid */
+ verbose_set_name(desc->appid, 0);
+
/* avoid set-gid effect */
setresgid(groupid, groupid, groupid);
}
/* executes the process */
- rc = execve(args[0], args, environ);
+ rc = execve(args[0], args, env);
+ access(args[0], X_OK);
ERROR("failed to exec master %s: %m", args[0]);
_exit(1);
return -1;
for (dl = launchers ; dl ; dl = dl->next)
if (dl->mode == mode)
for (tl = dl->types ; tl != NULL ; tl = tl->next)
- if (!strcmp(tl->type, type))
+ if (!strcasecmp(tl->type, type))
return dl;
return NULL;
}
/* prepare paths */
rc = snprintf(datadir, sizeof datadir, "%s/%s",
desc->home, desc->appid);
- if (rc < 0 || rc >= sizeof datadir) {
+ if (rc < 0 || rc >= (int)sizeof datadir) {
ERROR("overflow for datadir");
errno = EINVAL;
return -1;
if (s && s != e)
groupid = s; /* the original groupid is used */
else
- groupid = -1;
+ groupid = (gid_t)-1;
+ /* reads the configuration file */
rc = read_configuration_file(FWK_LAUNCH_CONF);
- /* dump_launchers(stderr); */
+#if defined(DUMP_LAUNCHERS)
+ if (!rc)
+ dump_launchers(stderr);
+#endif
+
return rc;
}