最初コミット

このコミットが含まれているのは:
守矢諏訪子 2024-06-17 22:41:46 +09:00
コミット cf13f2d8c1
15個のファイルの変更441行の追加0行の削除

2
.gitignore vendored ノーマルファイル
ファイルの表示

@ -0,0 +1,2 @@
farfetch
*.core

2
CHANGELOG.md ノーマルファイル
ファイルの表示

@ -0,0 +1,2 @@
# 0.0.1
* 開始

14
LICENSE.txt ノーマルファイル
ファイルの表示

@ -0,0 +1,14 @@
Copyright © 2004-2011 by Internet Systems Consortium, Inc. ("ISC")
Copyright © 2018-2024 by 076.moe
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.

81
Makefile ノーマルファイル
ファイルの表示

@ -0,0 +1,81 @@
UNAME_S != uname -s
UNAME_M != uname -m
NAME != cat main.c | grep "const char \*sofname" | awk '{print $$5}' | \
sed "s/\"//g" | sed "s/;//"
VERSION != cat main.c | grep "const char \*version" | awk '{print $$5}' | \
sed "s/\"//g" | sed "s/;//"
PREFIX = /usr/local
.if ${UNAME_S} == "Linux"
PREFIX = /usr
.endif
MANPREFIX = ${PREFIX}/share/man
.if ${UNAME_S} == "OpenBSD"
MANPREFIX = ${PREFIX}/man
.endif
CC = cc
FILES = main.c src/*.c
CFLAGS = -Wall -Wextra -O3 -I${PREFIX}/include -L${PREFIX}/lib
.if ${UNAME_S} == "NetBSD"
CFLAGS += -I/usr/pkg/include -L/usr/pkg/lib -I/usr/include -L/usr/lib
.endif
LDFLAGS =
all:
${CC} ${CFLAGS} -o ${NAME} ${FILES} ${LDFLAGS}
strip ${NAME}
clean:
rm -f ${NAME}
dist: clean
mkdir -p dist
mkdir -p ${NAME}-${VERSION}
cp -R LICENSE.txt Makefile README.md CHANGELOG.md \
${NAME}-completion.zsh ${NAME}.1 main.c src ${NAME}-${VERSION}
tar zcfv dist/${NAME}-${VERSION}.tar.gz ${NAME}-${VERSION}
rm -rf ${NAME}-${VERSION}
depend:
${DEPS}
release-openbsd:
mkdir -p release
${CC} ${CFLAGS} -o release/${NAME}-${VERSION}-openbsd-${UNAME_M} ${FILES} \
-static ${LDFLAGS} -lc
strip release/${NAME}-${VERSION}-openbsd-${UNAME_M}
release-freebsd:
mkdir -p release
${CC} ${CFLAGS} -o release/${NAME}-${VERSION}-freebsd-${UNAME_M} ${FILES} \
-static ${LDFLAGS} -lc
strip release/${NAME}-${VERSION}-freebsd-${UNAME_M}
release-netbsd:
mkdir -p release
export LD_LIBRARY_PATH=/usr/pkg/lib:/usr/local/lib:$LD_LIBRARY_PATH
${CC} ${CFLAGS} -o release/${NAME}-${VERSION}-netbsd-${UNAME_M} ${FILES} \
-static ${LDFLAGS} -lc
strip release/${NAME}-${VERSION}-netbsd-${UNAME_M}
release-linux:
mkdir -p release
${CC} ${CFLAGS} -o release/${NAME}-${VERSION}-linux-${UNAME_M} ${FILES} \
-static ${LDFLAGS} -lc
strip release/${NAME}-${VERSION}-linux-${UNAME_M}
install: all
mkdir -p ${DESTDIR}${PREFIX}/bin
cp -f ${NAME} ${DESTDIR}${PREFIX}/bin
chmod 755 ${DESTDIR}${PREFIX}/bin/${NAME}
mkdir -p ${DESTDIR}${MANPREFIX}/man1
sed "s/VERSION/${VERSION}/g" < ${NAME}.1 > ${DESTDIR}${MANPREFIX}/man1/${NAME}.1
chmod 644 ${DESTDIR}${MANPREFIX}/man1/${NAME}.1
uninstall:
rm -f ${DESTDIR}${PREFIX}/bin/${NAME}
.PHONY: all clean dist install uninstall

28
README.md ノーマルファイル
ファイルの表示

@ -0,0 +1,28 @@
# farfetch
## インストールする方法 | Installation
### CRUX
```sh
doas prt-get bmake
bmake
doas bmake install
```
### Artix
```sh
doas pacman -S base-devel bmake
bmake
doas bmake install
```
### OpenBSD
```sh
make
doas make install
```
### FreeBSD
```sh
make
doas make install
```

3
farfetch.conf ノーマルファイル
ファイルの表示

@ -0,0 +1,3 @@
logo "default"
show cpu
hide gpu

53
main.c ノーマルファイル
ファイルの表示

@ -0,0 +1,53 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "src/user.h"
#include "src/os.h"
#include "src/host.h"
#if defined(__linux__)
#include "src/distro.h"
#endif
const char *sofname = "farfetch";
const char *version = "0.0.1";
int main() {
display_user_name();
printf("@");
display_user_host();
puts("------------------");
printf("OS: ");
display_os_name();
printf(" ");
display_os_vers();
printf(" ");
display_os_arch();
printf("\n");
printf("Host: ");
display_host_model();
printf("\n");
#if defined(__linux__)
printf("Distro: ");
display_distro();
printf("\n");
#endif
// TODO:
// * ロゴ
// * カーネル(LinuxとIllumosのみ)
// * 起動時間
// * パッケージ
// * libc
// * シェル
// * 解像度
// * 端末
// * CPU
// * GPU
// * メモリー
// * ストレージ
return 0;
}

48
src/distro.c ノーマルファイル
ファイルの表示

@ -0,0 +1,48 @@
#if defined(__linux__)
#include "distro.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void display_distro() {
char buf[64];
const char *cmd;
if (access("/bedrock/etc/bedrock-release", F_OK) != -1) {
cmd = "cat /bedrock/etc/bedrock-release";
} else if (access("/etc/redstar-release", F_OK) != -1) {
cmd = "echo \"Red Star OS\" && cat /etc/redstar-release | awk -F'[^0-9]' '$0=$2'";
} else if (access("/etc/siduction-version", F_OK) != -1) {
cmd = "echo \"Siduction\" && lsb_release -sic";
} else if (access("/etc/mcst_version", F_OK) != -1) {
cmd = "echo \"OS Elbrus\" && cat /etc/mcst_version";
} else if (access("/etc/GoboLinuxVersion", F_OK) != -1) {
cmd = "echo \"GoboLinux\" && cat /etc/GoboLinuxVersion";
} else if (access("/etc/os-release", F_OK) != -1) {
cmd = "cat /etc/os-release";
} else if (access("/usr/lib/os-release", F_OK) != -1) {
cmd = "cat /usr/lib/os-release";
} else if (access("/etc/openwrt_release", F_OK) != -1) {
cmd = "cat /etc/openwrt_release";
} else if (access("/etc/lsb-release", F_OK) != -1) {
cmd = "cat /etc/lsb-release";
} else {
perror("不明なディストリビューション。");
}
FILE *p = popen(cmd, "r");
if (!p) {
fprintf(stderr, "ディストロを見つけられるコマンドを実効に失敗: %s", cmd);
return;
}
while (fgets(buf, sizeof(buf), p) != NULL) {
buf[strcspn(buf, "\n")] = '\0';
printf("%s", buf);
}
pclose(p);
}
#endif

8
src/distro.h ノーマルファイル
ファイルの表示

@ -0,0 +1,8 @@
#if defined(__linux__)
#ifndef DISTRO_H
#define DISTRO_H
void display_distro();
#endif
#endif

77
src/host.c ノーマルファイル
ファイルの表示

@ -0,0 +1,77 @@
#include "host.h"
#include <stdio.h>
#include <string.h>
#if defined(__linux__)
#include <unistd.h>
#elif defined(__APPLE__)
#include <stdlib.h>
#endif
void run_command(const char *command) {
char buf[64];
FILE *p = popen(command, "r");
if (!p) {
fprintf(stderr, "ホストコマンドを実効に失敗: %s", command);
return;
}
while (fgets(buf, sizeof(buf), p) != NULL) {
buf[strcspn(buf, "\n")] = '\0';
printf("%s", buf);
}
pclose(p);
}
void display_host_model() {
#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__minix)
run_command("sysctl -n hw.vendor hw.product");
#elif defined(__sun)
run_command("prtconf -b | awk -F':' '/banner-name/ {printf $2}'");
#elif defined(__linux__)
const char *cmd1, *cmd2;
if (access("/system/app/", F_OK) != -1) {
cmd1 = "getprop ro.product.brand";
cmd2 = "getprop ro.product.model";
} else if (
access("/sys/devices/virtual/dmi/id/product_name", F_OK) != -1 ||
access("/sys/devices/virtual/dmi/id/product_version", F_OK) != 1
) {
cmd1 = "cat /sys/devices/virtual/dmi/id/product_name";
cmd2 = "cat /sys/devices/virtual/dmi/id/product_version";
} else if (access("/sys/firmware/base/model", F_OK) != -1) {
cmd1 = "cat /sys/firmware/devicetree/base/model";
} else if (access("/tmp/sysinfo/model", F_OK) != 1) {
cmd1 = "cat /tmp/sysinfo/model";
}
if (!cmd1) {
printf("Unknown");
} else {
run_command(cmd1);
}
if (cmd2) {
printf(" ");
run_command(cmd2);
}
#elif defined(__APPLE__)
run_command("sysctl -n hw.model");
FILE *p = popen("kextstat | grep -F -e \"FakeSMC\" -e \"VirtualSMC\"", "r");
if (!p) {
fprintf(stderr, "ホストコマンドを実効に失敗");
return;
}
while (fgets(buf, sizeof(buf), p) != NULL) {
buf[strcspn(buf, "\n")] = '\0';
printf("%s", buf);
}
pclose(p);
#endif
}

6
src/host.h ノーマルファイル
ファイルの表示

@ -0,0 +1,6 @@
#ifndef HOST_H
#define HOST_H
void display_host_model();
#endif

52
src/os.c ノーマルファイル
ファイルの表示

@ -0,0 +1,52 @@
#include "os.h"
#include <stdio.h>
#include <string.h>
void display_os_name() {
char buf[64];
FILE *p = popen("uname -s", "r");
if (!p) {
fprintf(stderr, "「uname」コマンドを実効に失敗");
return;
}
while (fgets(buf, sizeof(buf), p) != NULL) {
buf[strcspn(buf, "\n")] = '\0';
printf("%s", buf);
}
pclose(p);
}
void display_os_vers() {
char buf[16];
FILE *p = popen("uname -r", "r");
if (!p) {
fprintf(stderr, "「uname」コマンドを実効に失敗");
return;
}
while (fgets(buf, sizeof(buf), p) != NULL) {
buf[strcspn(buf, "\n")] = '\0';
printf("%s", buf);
}
pclose(p);
}
void display_os_arch() {
char buf[16];
FILE *p = popen("uname -m", "r");
if (!p) {
fprintf(stderr, "「uname」コマンドを実効に失敗");
return;
}
while (fgets(buf, sizeof(buf), p) != NULL) {
buf[strcspn(buf, "\n")] = '\0';
printf("%s", buf);
}
pclose(p);
}

8
src/os.h ノーマルファイル
ファイルの表示

@ -0,0 +1,8 @@
#ifndef OS_H
#define OS_H
void display_os_name();
void display_os_vers();
void display_os_arch();
#endif

52
src/user.c ノーマルファイル
ファイルの表示

@ -0,0 +1,52 @@
#include "user.h"
#include <stdio.h>
#include <string.h>
void display_user_name() {
char buf[128];
FILE *p = popen("whoami", "r");
if (!p) {
fprintf(stderr, "「whoami」コマンドを実効に失敗");
return;
}
while (fgets(buf, sizeof(buf), p) != NULL) {
buf[strcspn(buf, "\n")] = '\0';
printf("%s", buf);
}
pclose(p);
}
void display_user_host() {
char buf[64];
const char *filename;
#ifdef __OpenBSD__
filename = "/etc/myname";
#else
filename = "/etc/hostname";
#endif
FILE *f = fopen(filename, "r");
if (!f) {
snprintf(buf, sizeof(buf), "「%s」を見つけられません。", filename);
perror(buf);
return;
}
while (fgets(buf, sizeof(buf), f) != NULL) {
printf("%s", buf);
}
/* char hostname[128]; */
/* int cnt = 0; */
/* for (int i = 0; i < 128; i++) { */
/* unsigned char key; */
/* fread(&key, sizeof(key), 1, f); */
/* hostname[i] = key; */
/* cnt += 1; */
/* } */
/* hostname[cnt] = '\0'; */
fclose(f);
}

7
src/user.h ノーマルファイル
ファイルの表示

@ -0,0 +1,7 @@
#ifndef USER_H
#define USER_H
void display_user_name();
void display_user_host();
#endif