This commit is contained in:
Your Name 2024-03-22 20:33:38 +03:00
parent e33ad2a512
commit 2a914caec3
7 changed files with 154 additions and 78 deletions

View File

@ -47,10 +47,8 @@ char *INIT_START[] = {"/etc/rc.init", NULL};
/* #define OS_NAME "unknow" */
/* Options: To disable, comment line */
/* Add escape-char support in echo */
#define ECHO_FANCY
/* getloadavg() unavailable in android os */
/* getloadavg() unavailable in android */
#ifndef __ANDROID__
#define UPTIME_LOADAVG
#endif

View File

@ -2,78 +2,85 @@
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"
char n_flag = 0;
char e_flag = 0;
void format(char *str) {
#ifdef ECHO_FANCY
for (size_t i = 0; i < strlen(str); i++) {
unsigned int c = str[i];
if (c == '\\') {
switch (str[i + 1]) {
case 'a':
c = '\a';
break;
if (e_flag) {
for (size_t i = 0; i < strlen(str); i++) {
unsigned int c = str[i];
if (c == '\\') {
switch (str[i + 1]) {
case 'a':
c = '\a';
break;
case 'n':
c = '\n';
break;
case 'n':
c = '\n';
break;
case 't':
c = '\t';
break;
case 't':
c = '\t';
break;
case 'c':
exit(0);
case 'c':
exit(0);
case 'v':
c = '\v';
break;
case 'v':
c = '\v';
break;
case 'r':
c = '\r';
break;
case 'r':
c = '\r';
break;
case 'f':
c = '\f';
break;
case 'f':
c = '\f';
break;
case 'e':
c = '\033';
break;
case 'e':
c = '\033';
break;
case 'b':
c = '\b';
break;
case 'b':
c = '\b';
break;
default:
c = '\\';
default:
c = '\\';
}
i++;
}
i++;
putchar(c);
}
putchar(c);
}
#else
fputs(str, stdout);
#endif
else
fputs(str, stdout);
}
int main(int argc, char **argv) {
unsigned int n_flag = 0;
int i;
for (i = 1; i < argc; i++) {
if (argv[i][0] != '-')
break;
argv++;
argc--;
else if (!strcmp(argv[i], "-n"))
n_flag = 1;
for (int i = 0; i < argc; i++) {
if (argv[i][0] == '-') {
if (strstr(argv[i] + 1, "n"))
n_flag = 1;
else if (strstr(argv[i] + 1, "e"))
e_flag = 1;
argc--;
argv++;
}
}
for (; i < argc; i++) {
for (int i = 0; i < argc; i++) {
format(argv[i]);
if (i < argc - 1)
putchar(' ');

View File

@ -129,22 +129,24 @@ struct d_node **list_one(const char *path, int *ret) {
}
char *new_path = strdup(path);
if (new_path == NULL) {
free(dir);
return NULL;
}
if (new_path == NULL)
goto ERROR;
dir[0] = stat_file(new_path, 1);
if (dir[0] == NULL) {
free(dir);
free(new_path);
*ret = 1;
return NULL;
}
if (dir[0] == NULL)
goto ERROR_PATH;
dir[1] = NULL;
return dir;
ERROR_PATH:
*ret = 1;
free(new_path);
ERROR:
free(dir);
return NULL;
}
void dfree(struct d_node **dir, size_t files) {
@ -158,7 +160,9 @@ void dfree(struct d_node **dir, size_t files) {
char *get_date(time_t mtime) {
static char time[100];
strftime(time, sizeof(time), "%b %d %H:%M", localtime(&mtime));
return time;
}
@ -300,11 +304,11 @@ int sortt(const void *p1, const void *p2) {
}
int sorts(const void *p1, const void *p2) {
return (*(struct d_node **)p2)->stats.st_size - (*(struct d_node **)p1)->stats.st_size;
return (*(struct d_node **)p2)->stats.st_size - (*(struct d_node **)p1)->stats.st_size <= 10;
}
int sortd(const void *p1, const void *p2) {
return (*(struct d_node **)p1)->stats.st_nlink - (*(struct d_node **)p2)->stats.st_nlink;
return strcmp((*(struct d_node **)p1)->full_name, (*(struct d_node **)p2)->full_name);
}
int ls(const char *dir_name, int label, struct winsize w) {
@ -328,8 +332,7 @@ int ls(const char *dir_name, int label, struct winsize w) {
if (dir == NULL)
return 1;
if (sorter != NULL)
qsort(dir, files, sizeof(struct d_node *), sorter);
qsort(dir, files, sizeof(struct d_node *), sorter);
if ((label || R_flag) && !d_flag && !its_file)
printf("%s:\n", dir_name);

View File

@ -84,14 +84,14 @@ int main(int argc, char **argv) {
}
}
if (argv[optind] == NULL) {
argc -= optind;
argv += optind;
if (argc == 0) {
fprintf(stderr, "rm: missing operand\n");
return 1;
}
argv += optind;
argc -= optind;
int ret = 0;
for (int i = 0; i < argc; i++) {
if (!strcmp(argv[i], ".") || !strcmp(argv[i], "..")){

View File

@ -12,15 +12,15 @@ typedef struct {
} SIG;
SIG signals[] = {
{"HUP", SIGHUP},
{"INT", SIGINT},
{"HUP", SIGHUP},
{"INT", SIGINT},
{"QUIT", SIGQUIT},
{"ILL", SIGILL},
{"ILL", SIGILL},
{"TRAP", SIGTRAP},
{"ABRT", SIGABRT},
{"IOT", SIGIOT},
{"BUS", SIGBUS},
{"FPE", SIGFPE},
{"IOT", SIGIOT},
{"BUS", SIGBUS},
{"FPE", SIGFPE},
{"KILL", SIGKILL},
{"USR1", SIGUSR1},
{"SEGV", SIGSEGV},
@ -35,10 +35,9 @@ SIG signals[] = {
int parse_sig(char *arg) {
int sig = atoi(arg);
if (sig >= 0 && sig >= NSIG)
if (sig >= 0 && sig <= NSIG)
return sig;
if (!strncasecmp(arg, "SIG", 3))
arg += 3;

3
src/procps/ps/build.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/sh
project_dir=$(pwd)
echo ./*.c $CFLAGS -o $OUTPUT$(basename $project_dir) | xargs $CC

66
src/procps/ps/ps.c Normal file
View File

@ -0,0 +1,66 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
int open_file(const char *path) {
int fd = open(path, O_RDONLY);
if (fd < 0) {
fprintf(stderr, "ps: %s: %s\n", path, strerror(errno));
return -1;
}
return fd;
}
int pscan(const char *pid) {
char path[PATH_MAX + 1];
char cmdline[PATH_MAX + 1];
/* Arguments */
snprintf(path, sizeof(path), "/proc/%s/cmdline", pid);
int fd = open_file(path);
if (fd == -1)
return 1;
read(fd, cmdline, sizeof(cmdline));
close(fd);
printf("%5s %5s\n", pid, cmdline);
return 0;
}
int main(int argc, char **argv) {
int opt;
while ((opt = getopt(argc, argv, "o:")) != -1) {
switch (opt) {
case 'o':
break;
default:
printf("ps [o] [PID]\n\t-o Options (nice, tty, cmd, pid, nice)\n");
return 0;
}
}
DIR *dp = opendir("/proc");
if (dp == NULL) {
fprintf(stderr, "ps: /proc: %s\n", strerror(errno));
return 1;
}
printf("PID CMD\n");
int ret = 0;
struct dirent *ep;
while ((ep = readdir(dp)) != NULL)
if (atoi(ep->d_name))
if (pscan(ep->d_name))
ret = 1;
closedir(dp);
return ret;
}