mirror of https://github.com/cutefishos/appmotor
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.5 KiB
C
106 lines
2.5 KiB
C
/***************************************************************************
|
|
**
|
|
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
** All rights reserved.
|
|
** Contact: Nokia Corporation (directui@nokia.com)
|
|
**
|
|
** This file is part of applauncherd
|
|
**
|
|
** If you have questions regarding the use of this file, please contact
|
|
** Nokia at directui@nokia.com.
|
|
**
|
|
** This library is free software; you can redistribute it and/or
|
|
** modify it under the terms of the GNU Lesser General Public
|
|
** License version 2.1 as published by the Free Software Foundation
|
|
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
** of this file.
|
|
**
|
|
****************************************************************************/
|
|
|
|
#define _GNU_SOURCE
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
|
|
#include "report.h"
|
|
#include "search.h"
|
|
|
|
static char* merge_paths(const char *base_path, const char *rel_path)
|
|
{
|
|
char *path;
|
|
|
|
if (asprintf(&path, "%s%s%s", base_path,
|
|
(base_path[strlen(base_path) - 1] == '/' ? "" : "/"),
|
|
rel_path) < 0)
|
|
{
|
|
die(1, "allocating merge path buffer");
|
|
}
|
|
return path;
|
|
}
|
|
|
|
char* search_program(const char *progname)
|
|
{
|
|
char *launch = NULL;
|
|
char *cwd;
|
|
|
|
if (progname[0] == '/')
|
|
{
|
|
launch = strdup(progname);
|
|
if (!launch)
|
|
{
|
|
die(1, "allocating program name buffer");
|
|
}
|
|
}
|
|
else if (strchr(progname, '/') != NULL)
|
|
{
|
|
cwd = get_current_dir_name();
|
|
launch = merge_paths(cwd, progname);
|
|
free(cwd);
|
|
}
|
|
else
|
|
{
|
|
char *path = getenv("PATH");
|
|
char *saveptr = NULL;
|
|
char *token;
|
|
|
|
if (path == NULL)
|
|
{
|
|
die(1, "could not get PATH environment variable");
|
|
}
|
|
path = strdup(path);
|
|
|
|
for (token = strtok_r(path, ":", &saveptr); token != NULL; token = strtok_r(NULL, ":", &saveptr))
|
|
{
|
|
launch = merge_paths(token, progname);
|
|
|
|
if (access(launch, X_OK) == 0)
|
|
break;
|
|
|
|
free(launch);
|
|
launch = NULL;
|
|
}
|
|
|
|
free(path);
|
|
|
|
if (launch == NULL)
|
|
{
|
|
die(1, "could not locate program \"%s\" to launch \n", progname);
|
|
}
|
|
|
|
if (launch[0] != '/')
|
|
{
|
|
char *relative = launch;
|
|
|
|
cwd = get_current_dir_name();
|
|
launch = merge_paths(cwd, relative);
|
|
|
|
free(cwd);
|
|
free(relative);
|
|
}
|
|
}
|
|
return launch;
|
|
}
|
|
|