diff --git a/Kernel/sync.sh b/Kernel/sync.sh index 57dc880f507..ed72b7a0f63 100755 --- a/Kernel/sync.sh +++ b/Kernel/sync.sh @@ -54,14 +54,13 @@ cp -v ../Terminal/Terminal mnt/bin/Terminal cp -v ../FontEditor/FontEditor mnt/bin/FontEditor cp -v ../Launcher/Launcher mnt/bin/Launcher cp -v ../Clock/Clock mnt/bin/Clock -ln -s FontEditor mnt/bin/ff -ln -s Clock mnt/bin/cl +cp -v ../Userland/pape mnt/bin/pape cp -v ../Userland/dmesg mnt/bin/dmesg cp -v ../Userland/chmod mnt/bin/chmod cp -v ../Userland/top mnt/bin/top -sh sync-local.sh cp -v kernel.map mnt/ ln -s dir_a mnt/dir_cur ln -s nowhere mnt/bad_link +sh sync-local.sh umount mnt sync diff --git a/Userland/.gitignore b/Userland/.gitignore index bb5127117b5..e557abe617a 100644 --- a/Userland/.gitignore +++ b/Userland/.gitignore @@ -31,3 +31,4 @@ rmdir dmesg top chmod +pape diff --git a/Userland/Makefile b/Userland/Makefile index a21cbe96109..04ea1dbe980 100644 --- a/Userland/Makefile +++ b/Userland/Makefile @@ -22,6 +22,7 @@ OBJS = \ guitest.o \ guitest2.o \ sysctl.o \ + pape.o \ cp.o \ rmdir.o \ dmesg.o \ @@ -54,6 +55,7 @@ APPS = \ guitest \ guitest2 \ sysctl \ + pape \ cp \ rmdir \ dmesg \ @@ -154,6 +156,9 @@ guitest2: guitest2.o sysctl: sysctl.o $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a +pape: pape.o + $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a + cp: cp.o $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a diff --git a/Userland/pape.cpp b/Userland/pape.cpp new file mode 100644 index 00000000000..dd7f5961403 --- /dev/null +++ b/Userland/pape.cpp @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static bool flag_show_all = false; +static int show_all(); +static int show_current(); +static int set_pape(const char*); + +static void usage() +{ + printf("usage: pape [-a] [name]\n"); +} + +int main(int argc, char** argv) +{ + int opt; + while ((opt = getopt(argc, argv, "a")) != -1) { + switch (opt) { + case 'a': + flag_show_all = true; + break; + default: + usage(); + return 0; + } + } + + if (flag_show_all) + return show_all(); + + if (argc == 1) { + show_current(); + return 0; + } + + if (optind >= argc) { + usage(); + return 0; + } + + return set_pape(argv[optind]); +} + +int show_all() +{ + DIR* dirp = opendir("/res/wallpapers"); + if (!dirp) { + perror("opendir"); + return 1; + } + while (auto* de = readdir(dirp)) { + if (de->d_name[0] == '.') + continue; + printf("%s\n", de->d_name); + } + closedir(dirp); + return 0; +} + +static String read_var(const String& name) +{ + StringBuilder builder; + builder.append("/proc/sys/"); + builder.append(name); + auto path = builder.to_string(); + int fd = open(path.characters(), O_RDONLY); + if (fd < 0) { + perror("open"); + exit(1); + } + char buffer[BUFSIZ]; + int nread = read(fd, buffer, sizeof(buffer)); + close(fd); + if (nread < 0) { + perror("read"); + exit(1); + } + return String(buffer, nread, Chomp); +} + +static void write_var(const String& name, const String& value) +{ + StringBuilder builder; + builder.append("/proc/sys/"); + builder.append(name); + auto path = builder.to_string(); + int fd = open(path.characters(), O_WRONLY); + if (fd < 0) { + perror("open"); + exit(1); + } + int nwritten = write(fd, value.characters(), value.length()); + if (nwritten < 0) { + perror("read"); + exit(1); + } + close(fd); +} + +int show_current() +{ + FileSystemPath path(read_var("wm_wallpaper")); + printf("%s\n", path.basename().characters()); + return 0; +} + +int set_pape(const char* name) +{ + StringBuilder builder; + builder.append("/res/wallpapers/"); + builder.append(name); + + write_var("wm_wallpaper", builder.to_string()); + return 0; +}