tee
This commit is contained in:
parent
688fdd9285
commit
7c4e4402f9
11
TODO
11
TODO
|
@ -1,13 +1,8 @@
|
||||||
PlainOs
|
|
||||||
With "micro-" prefix
|
With "micro-" prefix
|
||||||
|
|
||||||
*Todo:
|
*Todo:
|
||||||
**ls
|
**ls (mc print)
|
||||||
**chmod
|
|
||||||
**chgrp
|
|
||||||
**chown
|
|
||||||
**dmesg (portable)
|
**dmesg (portable)
|
||||||
tee
|
|
||||||
tail
|
tail
|
||||||
expr
|
expr
|
||||||
uniq
|
uniq
|
||||||
|
@ -32,7 +27,6 @@ tar
|
||||||
|
|
||||||
Other:
|
Other:
|
||||||
kill
|
kill
|
||||||
top
|
|
||||||
ps
|
ps
|
||||||
mount
|
mount
|
||||||
umount
|
umount
|
||||||
|
@ -74,6 +68,3 @@ Shell:
|
||||||
|
|
||||||
Init:
|
Init:
|
||||||
sinit - Simple init
|
sinit - Simple init
|
||||||
|
|
||||||
Libs:
|
|
||||||
readline
|
|
||||||
|
|
|
@ -4,16 +4,12 @@
|
||||||
const char *objects[] = {
|
const char *objects[] = {
|
||||||
"console-tools",
|
"console-tools",
|
||||||
"coreutils",
|
"coreutils",
|
||||||
"sysutils",
|
|
||||||
"networking",
|
"networking",
|
||||||
"procps",
|
"procps",
|
||||||
"shell"
|
"shell"
|
||||||
};
|
/* "sysutils" */
|
||||||
|
|
||||||
const char *libs[] = {
|
|
||||||
"readline"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CFLAGS "-Wall", "-Werror", "-Wextra", "-pedantic", "-flto", "-Os", "-s", "-I", "../libmu"
|
#define CFLAGS "-Wall", "-Werror", "-Wextra", "-pedantic", "-flto", "-Os", "-s", "-I", "../libmu"
|
||||||
#define CC "tcc"
|
#define CC "cc"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -135,11 +135,11 @@ int cptree(const char *src, const char *dst) {
|
||||||
if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, "..") || !strcmp(dst, ep->d_name))
|
if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, "..") || !strcmp(dst, ep->d_name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
char *src_path = mu_make_path("cp", src, ep->d_name);
|
char *src_path = mu_make_path((s_flag) ? NULL : "cp", src, ep->d_name);
|
||||||
if (src_path == NULL)
|
if (src_path == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
char *dst_path = mu_make_path("cp", dst, ep->d_name);
|
char *dst_path = mu_make_path((s_flag) ? NULL : "cp", dst, ep->d_name);
|
||||||
if (dst_path == NULL) {
|
if (dst_path == NULL) {
|
||||||
free(src_path);
|
free(src_path);
|
||||||
continue;
|
continue;
|
||||||
|
@ -188,7 +188,7 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
else {
|
else {
|
||||||
for (int i = 1; i < argc - 1; i++) {
|
for (int i = 1; i < argc - 1; i++) {
|
||||||
char *new_path = mu_make_path("cp", argv[argc - 1], basename(argv[i]));
|
char *new_path = mu_make_path((s_flag) ? NULL : "cp", argv[argc - 1], basename(argv[i]));
|
||||||
if (new_path == NULL)
|
if (new_path == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ unsigned int F_flag;
|
||||||
unsigned int p_flag;
|
unsigned int p_flag;
|
||||||
|
|
||||||
struct d_node {
|
struct d_node {
|
||||||
/* basename() */
|
/* basename */
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
/* For free */
|
/* For free */
|
||||||
|
@ -155,7 +155,6 @@ void print(const struct d_node *node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int ls(const char *dir_name, int label, struct winsize w) {
|
int ls(const char *dir_name, int label, struct winsize w) {
|
||||||
(void)w;
|
|
||||||
|
|
||||||
size_t files = 0;
|
size_t files = 0;
|
||||||
struct d_node **dir = list(dir_name, &files);
|
struct d_node **dir = list(dir_name, &files);
|
||||||
|
@ -173,12 +172,7 @@ int ls(const char *dir_name, int label, struct winsize w) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Todo: sort and print */
|
/* Todo: sort and print */
|
||||||
else {
|
else {}
|
||||||
for (size_t i = 0; i < files; i++)
|
|
||||||
print(dir[i]);
|
|
||||||
|
|
||||||
putchar('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
dfree(dir);
|
dfree(dir);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
50
coreutils/tee.c
Normal file
50
coreutils/tee.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
int flag = O_TRUNC;
|
||||||
|
|
||||||
|
int opt;
|
||||||
|
while ((opt = getopt(argc, argv, "ai")) != -1) {
|
||||||
|
switch (opt) {
|
||||||
|
case 'a':
|
||||||
|
flag = O_APPEND;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("tee [file]\n\t[-a Append]\n\t[-i Ignore interrupt signals]\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
argv += optind;
|
||||||
|
argc -= optind;
|
||||||
|
if (argc == 0) {
|
||||||
|
fprintf(stderr, "tee: missing operand\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fd = open(argv[0], O_WRONLY | flag | O_CREAT, 0666);
|
||||||
|
if (fd < 0) {
|
||||||
|
fprintf(stderr, "tee: %s\n", strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char in[4096];
|
||||||
|
off_t bytes = 0;
|
||||||
|
while ((bytes = read(STDIN_FILENO, in, sizeof(in)))) {
|
||||||
|
write(STDOUT_FILENO, in, bytes);
|
||||||
|
write(fd, in, bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -21,7 +21,7 @@ unsigned int tlines;
|
||||||
|
|
||||||
void count(const int fd) {
|
void count(const int fd) {
|
||||||
char buf[4096];
|
char buf[4096];
|
||||||
ssize_t n = 0;
|
off_t n = 0;
|
||||||
|
|
||||||
int in_word = 1;
|
int in_word = 1;
|
||||||
while ((n = read(fd, buf, sizeof(buf))) > 0) {
|
while ((n = read(fd, buf, sizeof(buf))) > 0) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user