1c0ff6aa23
Later, the aports folder will probably get split up in its own repository. But right now this is simply convenient.
106 lines
2.1 KiB
C
106 lines
2.1 KiB
C
/*
|
|
* Copyright (C) 2008 Natanael Copa <natanael.copa@gmail.com>
|
|
* All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 as published
|
|
* by the Free Software Foundation. See http://www.gnu.org/ for details.
|
|
*
|
|
*/
|
|
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
|
|
#include <libgen.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#define BBSUID_PATH "/bin/bbsuid"
|
|
|
|
const static char * applets[] = {
|
|
"/bin/mount",
|
|
"/bin/umount",
|
|
"/usr/bin/crontab",
|
|
"/usr/bin/passwd",
|
|
"/usr/bin/su",
|
|
"/usr/bin/traceroute",
|
|
"/usr/bin/traceroute6",
|
|
"/usr/bin/vlock",
|
|
NULL
|
|
};
|
|
|
|
|
|
static const char *applet_from_path(const char *str)
|
|
{
|
|
const char *p = strrchr(str, '/');
|
|
if (p == NULL)
|
|
p = str;
|
|
else
|
|
p++;
|
|
return p;
|
|
}
|
|
|
|
static int is_valid_applet(const char *str)
|
|
{
|
|
int i;
|
|
for (i = 0; applets[i] != NULL; i++) {
|
|
const char *a = applet_from_path(applets[i]);
|
|
if (strcmp(applet_from_path(str), a) == 0)
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int exec_busybox(const char *app, int argc, char **argv)
|
|
{
|
|
char **newargv = malloc((argc + 2) * sizeof(char *));
|
|
int i;
|
|
newargv[0] = "/bin/busybox";
|
|
newargv[1] = (char *)app;
|
|
for (i = 1; i < argc; i++)
|
|
newargv[i+1] = argv[i];
|
|
newargv[argc+1] = NULL;
|
|
execv(newargv[0], newargv);
|
|
perror(newargv[0]);
|
|
free(newargv);
|
|
return 1;
|
|
}
|
|
|
|
static int install_links(void)
|
|
{
|
|
int i, r = 0;
|
|
/* we don't want others than root to install the symlinks */
|
|
if (getuid() != 0)
|
|
errx(1, "Only root can install symlinks");
|
|
|
|
for (i = 0; applets[i] != NULL; i++) {
|
|
const char *a = applets[i];
|
|
struct stat st;
|
|
if (lstat(a, &st) == 0 && S_ISLNK(st.st_mode))
|
|
unlink(a);
|
|
if (symlink(BBSUID_PATH, a) < 0)
|
|
r++;
|
|
}
|
|
|
|
return r;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
const char *app = applet_from_path(argv[0]);
|
|
|
|
if (strcmp(app, "bbsuid") == 0) {
|
|
if (argc == 2 && strcmp(argv[1], "--install") == 0)
|
|
return install_links();
|
|
errx(1, "Use --install to install symlinks");
|
|
}
|
|
|
|
if (is_valid_applet(app))
|
|
return exec_busybox(app, argc, argv);
|
|
|
|
errx(1, "%s is not a valid applet", app);
|
|
return 1;
|
|
}
|
|
|