Compare commits
No commits in common. "77560bbc3e197ce95936b337be370fb44966fa44" and "9184bbfef634f518b41a1de6c3f6901902246ccf" have entirely different histories.
77560bbc3e
...
9184bbfef6
1
.gitignore
vendored
1
.gitignore
vendored
@ -6,4 +6,3 @@ env-local.sh
|
|||||||
initrd/bin/**
|
initrd/bin/**
|
||||||
initrd/tests/**
|
initrd/tests/**
|
||||||
base/
|
base/
|
||||||
.fakeroot
|
|
||||||
|
@ -1,24 +1,28 @@
|
|||||||
function(luna_app SOURCE_FILE APP_NAME)
|
function(luna_app SOURCE_FILE APP_NAME SETUID)
|
||||||
add_executable(${APP_NAME} ${SOURCE_FILE})
|
add_executable(${APP_NAME} ${SOURCE_FILE})
|
||||||
target_compile_options(${APP_NAME} PRIVATE -Os ${COMMON_FLAGS} -Wno-write-strings)
|
target_compile_options(${APP_NAME} PRIVATE -Os ${COMMON_FLAGS} -Wno-write-strings)
|
||||||
add_dependencies(${APP_NAME} libc)
|
add_dependencies(${APP_NAME} libc)
|
||||||
target_include_directories(${APP_NAME} PRIVATE ${LUNA_BASE}/usr/include)
|
target_include_directories(${APP_NAME} PRIVATE ${LUNA_BASE}/usr/include)
|
||||||
target_link_libraries(${APP_NAME} PRIVATE os)
|
target_link_libraries(${APP_NAME} PRIVATE os)
|
||||||
|
if(${SETUID})
|
||||||
|
install(TARGETS ${APP_NAME} DESTINATION ${LUNA_ROOT}/initrd/bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE SETUID)
|
||||||
|
else()
|
||||||
install(TARGETS ${APP_NAME} DESTINATION ${LUNA_ROOT}/initrd/bin)
|
install(TARGETS ${APP_NAME} DESTINATION ${LUNA_ROOT}/initrd/bin)
|
||||||
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
luna_app(init.cpp init)
|
luna_app(init.cpp init OFF)
|
||||||
luna_app(env.cpp env)
|
luna_app(env.cpp env OFF)
|
||||||
luna_app(su.cpp su)
|
luna_app(su.cpp su ON)
|
||||||
luna_app(sh.cpp sh)
|
luna_app(sh.cpp sh OFF)
|
||||||
luna_app(cat.cpp cat)
|
luna_app(cat.cpp cat OFF)
|
||||||
luna_app(date.cpp date)
|
luna_app(date.cpp date OFF)
|
||||||
luna_app(edit.cpp edit)
|
luna_app(edit.cpp edit OFF)
|
||||||
luna_app(ls.cpp ls)
|
luna_app(ls.cpp ls OFF)
|
||||||
luna_app(chown.cpp chown)
|
luna_app(chown.cpp chown OFF)
|
||||||
luna_app(chmod.cpp chmod)
|
luna_app(chmod.cpp chmod OFF)
|
||||||
luna_app(mkdir.cpp mkdir)
|
luna_app(mkdir.cpp mkdir OFF)
|
||||||
luna_app(rm.cpp rm)
|
luna_app(rm.cpp rm OFF)
|
||||||
luna_app(stat.cpp stat)
|
luna_app(stat.cpp stat OFF)
|
||||||
luna_app(uname.cpp uname)
|
luna_app(uname.cpp uname OFF)
|
||||||
luna_app(base64.cpp base64)
|
luna_app(base64.cpp base64 OFF)
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#include <grp.h>
|
|
||||||
#include <luna/String.h>
|
#include <luna/String.h>
|
||||||
#include <os/ArgumentParser.h>
|
#include <os/ArgumentParser.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
@ -32,15 +31,9 @@ Result<int> luna_main(int argc, char** argv)
|
|||||||
if (rc.has_value()) { gid = (u32)rc.value(); }
|
if (rc.has_value()) { gid = (u32)rc.value(); }
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct group* grp = getgrnam(group.chars());
|
fprintf(stderr, "FIXME: read entry from group file to determine GID for group %s\n", group.chars());
|
||||||
if (!grp)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s: unknown group %s!\n", argv[0], group.chars());
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
gid = grp->gr_gid;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (names.size() > 0)
|
if (names.size() > 0)
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
root:!:0:
|
|
||||||
users:!:1:
|
|
||||||
selene:!:1000:
|
|
@ -18,7 +18,7 @@ void InitRD::initialize()
|
|||||||
g_initrd.initialize((void*)virtual_initrd_address, bootboot.initrd_size);
|
g_initrd.initialize((void*)virtual_initrd_address, bootboot.initrd_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Result<void> vfs_create_dir_if_not_exists(const char* path, mode_t mode, uid_t uid, gid_t gid)
|
static Result<void> vfs_create_dir_if_not_exists(const char* path, mode_t mode)
|
||||||
{
|
{
|
||||||
auto rc = VFS::create_directory(path, Credentials {});
|
auto rc = VFS::create_directory(path, Credentials {});
|
||||||
if (rc.has_error())
|
if (rc.has_error())
|
||||||
@ -26,9 +26,7 @@ static Result<void> vfs_create_dir_if_not_exists(const char* path, mode_t mode,
|
|||||||
if (rc.error() == EEXIST) return {};
|
if (rc.error() == EEXIST) return {};
|
||||||
return rc.release_error();
|
return rc.release_error();
|
||||||
}
|
}
|
||||||
auto dir = rc.value();
|
rc.value()->chmod(mode & (mode_t)~S_IFMT);
|
||||||
dir->chmod(mode & (mode_t)~S_IFMT);
|
|
||||||
dir->chown(uid, gid);
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,11 +40,10 @@ Result<void> InitRD::populate_vfs()
|
|||||||
auto file = TRY(VFS::create_file(entry.name.chars(), Credentials {}));
|
auto file = TRY(VFS::create_file(entry.name.chars(), Credentials {}));
|
||||||
file->write(entry.data(), 0, entry.size);
|
file->write(entry.data(), 0, entry.size);
|
||||||
file->chmod(entry.mode & (mode_t)~S_IFMT);
|
file->chmod(entry.mode & (mode_t)~S_IFMT);
|
||||||
file->chown(entry.uid, entry.gid);
|
|
||||||
}
|
}
|
||||||
else if (entry.type == TarStream::EntryType::Directory)
|
else if (entry.type == TarStream::EntryType::Directory)
|
||||||
{
|
{
|
||||||
TRY(vfs_create_dir_if_not_exists(entry.name.chars(), entry.mode, entry.uid, entry.gid));
|
TRY(vfs_create_dir_if_not_exists(entry.name.chars(), entry.mode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@ set(SOURCES
|
|||||||
src/setjmp.cpp
|
src/setjmp.cpp
|
||||||
src/env.cpp
|
src/env.cpp
|
||||||
src/pwd.cpp
|
src/pwd.cpp
|
||||||
src/grp.cpp
|
|
||||||
src/sys/stat.cpp
|
src/sys/stat.cpp
|
||||||
src/sys/mman.cpp
|
src/sys/mman.cpp
|
||||||
src/sys/wait.cpp
|
src/sys/wait.cpp
|
||||||
|
@ -1,40 +0,0 @@
|
|||||||
/* grp.h: Group file parsing. */
|
|
||||||
|
|
||||||
#ifndef _GRP_H
|
|
||||||
#define _GRP_H
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
struct group
|
|
||||||
{
|
|
||||||
char* gr_name;
|
|
||||||
char* gr_passwd;
|
|
||||||
gid_t gr_gid;
|
|
||||||
char** gr_mem;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Read the next entry from the group file. */
|
|
||||||
struct group* getgrent(void);
|
|
||||||
|
|
||||||
/* Find the entry with a matching group name in the group file. */
|
|
||||||
struct group* getgrnam(const char* name);
|
|
||||||
|
|
||||||
/* Find the entry with a matching group ID in the group file. */
|
|
||||||
struct group* getgrgid(gid_t gid);
|
|
||||||
|
|
||||||
/* Rewind the group file. */
|
|
||||||
void setgrent(void);
|
|
||||||
|
|
||||||
/* End group file parsing. */
|
|
||||||
void endgrent(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
128
libc/src/grp.cpp
128
libc/src/grp.cpp
@ -1,128 +0,0 @@
|
|||||||
#include <errno.h>
|
|
||||||
#include <grp.h>
|
|
||||||
#include <luna/Vector.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
static struct group grp;
|
|
||||||
static FILE* f { nullptr };
|
|
||||||
static char buf[4096];
|
|
||||||
|
|
||||||
static Vector<char*> g_members;
|
|
||||||
|
|
||||||
extern char* _strtok_once(char* str, const char* delim);
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
static Result<struct group*> try_getgrent()
|
|
||||||
{
|
|
||||||
if (!f)
|
|
||||||
{
|
|
||||||
f = fopen("/etc/group", "r");
|
|
||||||
if (!f) return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
char* rc = fgets(buf, sizeof(buf), f);
|
|
||||||
if (!rc) return nullptr;
|
|
||||||
|
|
||||||
char* name = _strtok_once(rc, ":\n");
|
|
||||||
if (!name) continue;
|
|
||||||
|
|
||||||
char* passwd = _strtok_once(nullptr, ":\n");
|
|
||||||
if (!passwd) continue;
|
|
||||||
|
|
||||||
char* gid = _strtok_once(nullptr, ":\n");
|
|
||||||
if (!gid) continue;
|
|
||||||
|
|
||||||
char* members = _strtok_once(nullptr, ":\n");
|
|
||||||
if (!members) continue;
|
|
||||||
|
|
||||||
g_members.clear();
|
|
||||||
|
|
||||||
char* member = strtok(members, ",");
|
|
||||||
TRY(g_members.try_append(member));
|
|
||||||
|
|
||||||
if (member)
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
member = strtok(nullptr, ",");
|
|
||||||
TRY(g_members.try_append(member));
|
|
||||||
if (!member) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
grp.gr_name = name;
|
|
||||||
grp.gr_passwd = passwd;
|
|
||||||
grp.gr_gid = (gid_t)strtoul(gid, NULL, 10);
|
|
||||||
grp.gr_mem = g_members.data();
|
|
||||||
|
|
||||||
return &grp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct group* getgrent()
|
|
||||||
{
|
|
||||||
auto rc = try_getgrent();
|
|
||||||
if (rc.has_error())
|
|
||||||
{
|
|
||||||
errno = rc.error();
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return rc.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
struct group* getgrnam(const char* name)
|
|
||||||
{
|
|
||||||
setgrent();
|
|
||||||
|
|
||||||
struct group* entry;
|
|
||||||
|
|
||||||
while ((entry = getgrent()))
|
|
||||||
{
|
|
||||||
if (!strcmp(entry->gr_name, name))
|
|
||||||
{
|
|
||||||
endgrent();
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
endgrent();
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct group* getgrgid(gid_t gid)
|
|
||||||
{
|
|
||||||
setgrent();
|
|
||||||
|
|
||||||
struct group* entry;
|
|
||||||
|
|
||||||
while ((entry = getgrent()))
|
|
||||||
{
|
|
||||||
if (entry->gr_gid == gid)
|
|
||||||
{
|
|
||||||
endgrent();
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
endgrent();
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setgrent()
|
|
||||||
{
|
|
||||||
if (f) rewind(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
void endgrent()
|
|
||||||
{
|
|
||||||
if (f)
|
|
||||||
{
|
|
||||||
fclose(f);
|
|
||||||
f = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -11,7 +11,7 @@ static char buf[4096];
|
|||||||
// Example:
|
// Example:
|
||||||
// strtok("hello:world::!:", ":") -> "hello", "world", "!"
|
// strtok("hello:world::!:", ":") -> "hello", "world", "!"
|
||||||
// _strtok_once("hello:world::!:", ":") -> "hello", "world", "", "!"
|
// _strtok_once("hello:world::!:", ":") -> "hello", "world", "", "!"
|
||||||
char* _strtok_once(char* str, const char* delim)
|
static char* _strtok_once(char* str, const char* delim)
|
||||||
{
|
{
|
||||||
static char* s = nullptr;
|
static char* s = nullptr;
|
||||||
if (str) s = str;
|
if (str) s = str;
|
||||||
|
@ -19,8 +19,6 @@ class TarStream
|
|||||||
String name;
|
String name;
|
||||||
usize size;
|
usize size;
|
||||||
mode_t mode;
|
mode_t mode;
|
||||||
uid_t uid;
|
|
||||||
gid_t gid;
|
|
||||||
EntryType type;
|
EntryType type;
|
||||||
|
|
||||||
const u8* data() const
|
const u8* data() const
|
||||||
|
@ -44,8 +44,6 @@ Result<TarStream::Entry> TarStream::parse_header(const TarStream::TarHeader* hdr
|
|||||||
entry.size = parse_unsigned_integer(size, nullptr, 8);
|
entry.size = parse_unsigned_integer(size, nullptr, 8);
|
||||||
|
|
||||||
entry.mode = (mode_t)parse_unsigned_integer(hdr->mode, nullptr, 8);
|
entry.mode = (mode_t)parse_unsigned_integer(hdr->mode, nullptr, 8);
|
||||||
entry.uid = (mode_t)parse_unsigned_integer(hdr->uid, nullptr, 8);
|
|
||||||
entry.gid = (mode_t)parse_unsigned_integer(hdr->gid, nullptr, 8);
|
|
||||||
|
|
||||||
entry.m_data = (u8*)m_base + m_offset;
|
entry.m_data = (u8*)m_base + m_offset;
|
||||||
|
|
||||||
|
@ -9,11 +9,15 @@ function(luna_test SOURCE_FILE APP_NAME SETUID)
|
|||||||
add_dependencies(${APP_NAME} libc)
|
add_dependencies(${APP_NAME} libc)
|
||||||
target_include_directories(${APP_NAME} PRIVATE ${LUNA_BASE}/usr/include)
|
target_include_directories(${APP_NAME} PRIVATE ${LUNA_BASE}/usr/include)
|
||||||
target_link_libraries(${APP_NAME} PRIVATE test os)
|
target_link_libraries(${APP_NAME} PRIVATE test os)
|
||||||
|
if(${SETUID})
|
||||||
|
install(TARGETS ${APP_NAME} DESTINATION ${LUNA_ROOT}/initrd/tests PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE SETUID)
|
||||||
|
else()
|
||||||
install(TARGETS ${APP_NAME} DESTINATION ${LUNA_ROOT}/initrd/tests)
|
install(TARGETS ${APP_NAME} DESTINATION ${LUNA_ROOT}/initrd/tests)
|
||||||
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
if(BUILD_TESTS)
|
if(BUILD_TESTS)
|
||||||
luna_test(libluna/TestVector.cpp TestVector)
|
luna_test(libluna/TestVector.cpp TestVector OFF)
|
||||||
luna_test(libluna/TestBase64.cpp TestBase64)
|
luna_test(libluna/TestBase64.cpp TestBase64 OFF)
|
||||||
luna_test(libluna/TestUtf8.cpp TestUtf8)
|
luna_test(libluna/TestUtf8.cpp TestUtf8 OFF)
|
||||||
endif()
|
endif()
|
||||||
|
@ -13,5 +13,6 @@ tools/install-headers.sh
|
|||||||
|
|
||||||
cmake -S . -B $LUNA_BUILD_DIR -DLUNA_NO_OPTIMIZATIONS=ON -DMOON_DEBUG=ON -G "$LUNA_CMAKE_GENERATOR_NAME"
|
cmake -S . -B $LUNA_BUILD_DIR -DLUNA_NO_OPTIMIZATIONS=ON -DMOON_DEBUG=ON -G "$LUNA_CMAKE_GENERATOR_NAME"
|
||||||
cmake --build $LUNA_BUILD_DIR
|
cmake --build $LUNA_BUILD_DIR
|
||||||
|
cmake --install $LUNA_BUILD_DIR
|
||||||
|
|
||||||
tools/make-iso.sh
|
mkbootimg luna.json Luna.iso
|
||||||
|
@ -12,5 +12,6 @@ tools/install-headers.sh
|
|||||||
mkdir -p $LUNA_BUILD_DIR
|
mkdir -p $LUNA_BUILD_DIR
|
||||||
cmake -S . -B $LUNA_BUILD_DIR -G "$LUNA_CMAKE_GENERATOR_NAME"
|
cmake -S . -B $LUNA_BUILD_DIR -G "$LUNA_CMAKE_GENERATOR_NAME"
|
||||||
cmake --build $LUNA_BUILD_DIR
|
cmake --build $LUNA_BUILD_DIR
|
||||||
|
cmake --install $LUNA_BUILD_DIR
|
||||||
|
|
||||||
tools/make-iso.sh
|
mkbootimg luna.json Luna.iso
|
||||||
|
@ -5,24 +5,4 @@ source $(dirname $0)/env.sh
|
|||||||
|
|
||||||
cd $LUNA_ROOT
|
cd $LUNA_ROOT
|
||||||
|
|
||||||
if [ "$(id -u)" -ne "0" ]
|
|
||||||
then
|
|
||||||
echo "This script must be run under fakeroot."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$USER" == "root" ]
|
|
||||||
then
|
|
||||||
echo "This script must be run under fakeroot instead of as root."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
chown -R root:root initrd
|
|
||||||
|
|
||||||
cmake --install $LUNA_BUILD_DIR
|
cmake --install $LUNA_BUILD_DIR
|
||||||
|
|
||||||
chmod 400 initrd/boot/moon
|
|
||||||
chmod a+s initrd/bin/su
|
|
||||||
|
|
||||||
mkdir -p initrd/home/selene
|
|
||||||
chown 1000:1000 initrd/home/selene
|
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
source $(dirname $0)/env.sh
|
|
||||||
|
|
||||||
cd $LUNA_ROOT
|
|
||||||
|
|
||||||
fakeroot -u -s $LUNA_ROOT/.fakeroot -- tools/install.sh
|
|
||||||
|
|
||||||
fakeroot -u -i $LUNA_ROOT/.fakeroot -- mkbootimg luna.json Luna.iso
|
|
@ -1,15 +0,0 @@
|
|||||||
diff --git a/mkbootimg/tar.c b/mkbootimg/tar.c
|
|
||||||
index dc17e00..ed9d38d 100644
|
|
||||||
--- a/mkbootimg/tar.c
|
|
||||||
+++ b/mkbootimg/tar.c
|
|
||||||
@@ -49,8 +49,8 @@ void tar_add(struct stat *st, char *name, unsigned char *content, int size)
|
|
||||||
memset(end, 0, 512);
|
|
||||||
strncpy((char*)end, name, 99);
|
|
||||||
sprintf((char*)end + 100, "%07o", st->st_mode & 077777);
|
|
||||||
- sprintf((char*)end + 108, "%07o", 0);
|
|
||||||
- sprintf((char*)end + 116, "%07o", 0);
|
|
||||||
+ sprintf((char*)end + 108, "%07o", st->st_uid);
|
|
||||||
+ sprintf((char*)end + 116, "%07o", st->st_gid);
|
|
||||||
sprintf((char*)end + 124, "%011o", size);
|
|
||||||
sprintf((char*)end + 136, "%011o", 0);
|
|
||||||
sprintf((char*)end + 148, "%06o", 0);
|
|
@ -13,5 +13,6 @@ tools/install-headers.sh
|
|||||||
|
|
||||||
cmake -S . -B $LUNA_BUILD_DIR -G "$LUNA_CMAKE_GENERATOR_NAME"
|
cmake -S . -B $LUNA_BUILD_DIR -G "$LUNA_CMAKE_GENERATOR_NAME"
|
||||||
cmake --build $LUNA_BUILD_DIR
|
cmake --build $LUNA_BUILD_DIR
|
||||||
|
cmake --install $LUNA_BUILD_DIR
|
||||||
|
|
||||||
tools/make-iso.sh
|
mkbootimg luna.json Luna.iso
|
||||||
|
@ -11,8 +11,6 @@ cd toolchain
|
|||||||
|
|
||||||
git clone https://gitlab.com/bztsrc/bootboot.git
|
git clone https://gitlab.com/bztsrc/bootboot.git
|
||||||
|
|
||||||
patch -u -i $LUNA_ROOT/tools/mkbootimg.patch -p 1 -d bootboot
|
|
||||||
|
|
||||||
cd bootboot/mkbootimg
|
cd bootboot/mkbootimg
|
||||||
|
|
||||||
make -j$(nproc)
|
make -j$(nproc)
|
||||||
|
Loading…
Reference in New Issue
Block a user