Skip to content
Snippets Groups Projects
Commit 1b789e1d authored by rsc's avatar rsc
Browse files

Remove puts in favor of printf.
Allow multiple arguments to ls.
parent 8e88f9e2
No related branches found
No related tags found
No related merge requests found
......@@ -2,19 +2,17 @@
#include "stat.h"
#include "user.h"
char buf[513];
char buf[512];
void
rfile(int fd)
{
int cc;
int n;
while((cc = read(fd, buf, sizeof(buf) - 1)) > 0){
buf[cc] = '\0';
puts(buf);
}
if(cc < 0){
puts("cat: read error\n");
while((n = read(fd, buf, sizeof(buf))) > 0)
write(1, buf, n);
if(n < 0){
printf(1, "cat: read error\n");
exit();
}
}
......@@ -26,19 +24,16 @@ main(int argc, char *argv[])
if(argc <= 1) {
rfile(0);
} else {
for(i = 1; i < argc; i++){
fd = open(argv[i], 0);
if(fd < 0){
puts("cat: cannot open ");
puts(argv[i]);
puts("\n");
exit();
}
rfile(fd);
close(fd);
}
exit();
}
for(i = 1; i < argc; i++){
if((fd = open(argv[i], 0)) < 0){
printf(1, "cat: cannot open %s\n", argv[i]);
exit();
}
rfile(fd);
close(fd);
}
exit();
}
......@@ -7,10 +7,7 @@ main(int argc, char *argv[])
{
int i;
for(i = 1; i < argc; i++){
puts(argv[i]);
puts(" ");
}
puts("\n");
for(i = 1; i < argc; i++)
printf(1, "%s%s", argv[i], i+1 < argc ? " " : "\n");
exit();
}
......@@ -21,18 +21,18 @@ main(void)
dup(0); // stderr
for(;;){
puts("init: starting sh\n");
printf(1, "init: starting sh\n");
pid = fork();
if(pid < 0){
puts("init: fork failed\n");
printf(1, "init: fork failed\n");
exit();
}
if(pid == 0){
exec("sh", sh_args);
puts("init: exec sh failed\n");
printf(1, "init: exec sh failed\n");
exit();
}
while((wpid=wait()) >= 0 && wpid != pid)
puts("zombie!\n");
printf(1, "zombie!\n");
}
}
......@@ -3,83 +3,83 @@
#include "user.h"
#include "fs.h"
void
pname(char *n)
char*
fmtname(char *path)
{
int i;
for(i = 0; (i < DIRSIZ) && (n[i] != '\0') ; i++) {
printf(1, "%c", n[i]);
}
for(; i < DIRSIZ; i++)
printf(1, " ");
static char buf[DIRSIZ+1];
char *p;
// Find first character after last slash.
for(p=path+strlen(path); p >= path && *p != '/'; p--)
;
p++;
// Return blank-padded name.
if(strlen(p) >= DIRSIZ)
return p;
memmove(buf, p, strlen(p));
memset(buf+strlen(p), ' ', DIRSIZ-strlen(p));
return buf;
}
int
main(int argc, char *argv[])
void
ls(char *path)
{
char buf[512], *p;
int fd;
uint off, sz;
struct dirent de;
struct stat st;
if(argc > 2){
puts("Usage: ls [dir]\n");
exit();
if((fd = open(path, 0)) < 0){
printf(2, "ls: cannot open %s\n", path);
return;
}
if(argc == 2) {
fd = open(argv[1], 0);
if(fd < 0){
printf(2, "ls: cannot open %s\n", argv[1]);
exit();
}
} else {
fd = open(".", 0);
if(fd < 0){
printf(2, "ls: cannot open .\n");
exit();
}
if(fstat(fd, &st) < 0){
printf(2, "ls: cannot stat %s\n", path);
close(fd);
return;
}
if(fstat(fd, &st) < 0) {
printf(2, "ls: cannot stat dir\n");
exit();
}
switch(st.type) {
switch(st.type){
case T_FILE:
pname(argv[1]);
printf(1, "%d %d %d\n", st.type, st.ino, st.size);
printf(1, "%s %d %d %d\n", fmtname(path), st.type, st.ino, st.size);
break;
case T_DIR:
sz = st.size;
for(off = 0; off < sz; off += sizeof(de)) {
if(read(fd, &de, sizeof(de)) != sizeof(de)) {
printf(1, "ls: read error\n");
break;
}
if(de.inum != 0) {
p = buf;
if(argc == 2) {
strcpy(p, argv[1]);
p += strlen(p);
if(*(p-1) != '/')
*p++ = '/';
}
memmove(p, de.name, DIRSIZ);
p[DIRSIZ] = 0;
if(stat(buf, &st) < 0) {
printf(1, "stat: failed %s\n", de.name);
continue;
}
pname(de.name);
printf(1, "%d %d %d\n", st.type, de.inum, st.size);
if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){
printf(1, "ls: path too long\n");
break;
}
strcpy(buf, path);
p = buf+strlen(buf);
*p++ = '/';
while(read(fd, &de, sizeof(de)) == sizeof(de)){
if(de.inum == 0)
continue;
memmove(p, de.name, DIRSIZ);
p[DIRSIZ] = 0;
if(stat(buf, &st) < 0){
printf(1, "ls: cannot stat %s\n", buf);
continue;
}
printf(1, "%s %d %d %d\n", fmtname(buf), st.type, st.ino, st.size);
}
break;
}
close(fd);
}
int
main(int argc, char *argv[])
{
int i;
if(argc < 2){
ls(".");
exit();
}
for(i=1; i<argc; i++)
ls(argv[i]);
exit();
}
......@@ -51,7 +51,7 @@ main(void)
int
getcmd(char *buf, int nbuf)
{
puts("$ ");
printf(2, "$ ");
memset(buf, 0, nbuf);
gets(buf, nbuf);
if(buf[0] == 0) // EOF
......
......@@ -3,12 +3,6 @@
#include "fcntl.h"
#include "user.h"
int
puts(char *s)
{
return write(1, s, strlen(s));
}
char*
strcpy(char *s, char *t)
{
......
......@@ -21,7 +21,6 @@ char* sbrk(int);
// ulib.c
int stat(char*, struct stat*);
int puts(char*);
char* strcpy(char*, char*);
void *memmove(void*, void*, int);
char* strchr(const char*, char c);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment