head add, uname fix

This commit is contained in:
Your Name 2023-11-17 15:29:29 +03:00
parent e40d161b9c
commit 6b9edb2946
3 changed files with 138 additions and 58 deletions

View File

@ -7,6 +7,9 @@
/* Random source for shred */
#define RAND_SOURCE "/dev/urandom"
/* format for printf (head) */
#define HEAD_FMT "==> %s <==\n"
/* Options: To disable, comment line */
/* Add escape-char support in echo */
#define ECHO_FANCY

93
coreutils/head.c Normal file
View File

@ -0,0 +1,93 @@
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include "config.h"
unsigned int v_flag;
unsigned int c_flag;
long parse_long(const char *str) {
char *ptr;
long ret = strtol(str, &ptr, 0);
if (*ptr) {
fprintf(stderr, "head: %s invalid number\n", ptr);
exit(1);
}
return ret;
}
void print(const char *file, FILE *fp, long lines, long bytes) {
if (v_flag)
printf(HEAD_FMT, file);
long lcount = 0;
long bcount = 0;
while (1) {
int c = getc(fp);
if (c == EOF || lcount == lines || (c_flag && bcount == bytes))
break;
if (c == '\n')
lcount++;
bcount++;
putchar(c);
}
}
int main(int argc, char **argv) {
long lines = 10;
long bytes = 0;
int opt;
while ((opt = getopt(argc, argv, "n:c:v")) != -1) {
switch (opt) {
case 'n':
lines = parse_long(optarg);
break;
case 'c':
c_flag = 1;
bytes = parse_long(optarg);
break;
case 'v':
v_flag = 1;
break;
default:
printf("head [file1 file2...]\n\t[-n Print N lines] [-c Print N bytes]\n\t[-v Print headers]\n");
return 0;
}
}
argv += optind;
argc -= optind;
if (argc == 0)
print("-", stdin, lines, bytes);
for (int i = 0; i < argc; i++) {
FILE *fp = NULL;
if (argv[i][0] == '-')
fp = stdin;
else
fp = fopen(argv[i], "r");
if (fp == NULL) {
fprintf(stderr, "head: %s: %s\n", argv[i], strerror(errno));
return 1;
}
print(argv[i], fp, lines, bytes);
fclose(fp);
}
return 0;
}

View File

@ -4,72 +4,56 @@
#include <unistd.h>
#include <sys/utsname.h>
/* sys node release version machine */
int flags[] = {0, 0, 0, 0, 0};
enum {
O_SYS,
O_NODE,
O_RELEASE,
O_VERSION,
O_MACHINE,
O_ALL
};
int main(int argc, char **argv) {
int opt;
while ((opt = getopt(argc, argv, "ashrvm")) != -1) {
switch (opt) {
case 'a':
for (int i = 0; i < O_ALL; i++)
flags[i] = 1;
break;
case 's':
flags[O_SYS] = 1;
break;
case 'n':
flags[O_NODE] = 1;
break;
case 'r':
flags[O_RELEASE] = 1;
break;
case 'v':
flags[O_VERSION] = 1;
break;
case 'm':
flags[O_MACHINE] = 1;
break;
default:
printf("uname [-a All] [-s Sys] [-n Nodename] [-r Release] [-v Version] [-m Machine]\n");
return 0;
}
}
struct utsname uts;
if (uname(&uts)) {
fprintf(stderr, "uname: %s", strerror(errno));
return 1;
}
if (flags[O_SYS] || argc == 1)
unsigned int a_flag = 0;
int opt;
while ((opt = getopt(argc, argv, "ashrvm")) != -1) {
switch (opt) {
case 'a':
a_flag = 1;
/* fallthrough */
case 's':
printf("%s ", uts.sysname);
if (!a_flag)
break;
case 'n':
printf("%s ", uts.nodename);
if (!a_flag)
break;
case 'r':
printf("%s ", uts.release);
if (!a_flag)
break;
case 'v':
printf("%s ", uts.version);
if (!a_flag)
break;
case 'm':
printf("%s ", uts.machine);
break;
default:
printf("uname\n\t[-a All] [-s Sys]\n\t[-n Nodename] [-r Release]\n\t[-v Version] [-m Machine]\n");
return 0;
}
}
argc -= optind;
if (argc == 0)
printf("%s ", uts.sysname);
if (flags[O_NODE])
printf("%s ", uts.nodename);
if (flags[O_RELEASE])
printf("%s ", uts.release);
if (flags[O_VERSION])
printf("%s ", uts.version);
if (flags[O_MACHINE])
printf("%s ", uts.machine);
putchar('\n');
}