and use them in the example programs.
Add comments to syscall.h.
15 files changed:
int
main (int argc, char *argv[])
{
int
main (int argc, char *argv[])
{
int i;
for (i = 1; i < argc; i++)
int i;
for (i = 1; i < argc; i++)
if (fd < 0)
{
printf ("%s: open failed\n", argv[i]);
if (fd < 0)
{
printf ("%s: open failed\n", argv[i]);
+ return success ? EXIT_SUCCESS : EXIT_FAILURE;
if (argc != 3)
{
printf ("usage: cmp A B\n");
if (argc != 3)
{
printf ("usage: cmp A B\n");
if (fd[0] < 0)
{
printf ("%s: open failed\n", argv[1]);
if (fd[0] < 0)
{
printf ("%s: open failed\n", argv[1]);
}
fd[1] = open (argv[2]);
if (fd[1] < 0)
{
printf ("%s: open failed\n", argv[1]);
}
fd[1] = open (argv[2]);
if (fd[1] < 0)
{
printf ("%s: open failed\n", argv[1]);
pos + i,
buffer[0][i], buffer[0][i], argv[1],
buffer[1][i], buffer[1][i], argv[2]);
pos + i,
buffer[0][i], buffer[0][i], argv[1],
buffer[1][i], buffer[1][i], argv[2]);
}
if (min_read < bytes_read[1])
}
if (min_read < bytes_read[1])
printf ("%s and %s are identical\n", argv[1], argv[2]);
printf ("%s and %s are identical\n", argv[1], argv[2]);
if (argc != 3)
{
printf ("usage: cp OLD NEW\n");
if (argc != 3)
{
printf ("usage: cp OLD NEW\n");
if (in_fd < 0)
{
printf ("%s: open failed\n", argv[1]);
if (in_fd < 0)
{
printf ("%s: open failed\n", argv[1]);
}
/* Create and open output file. */
if (!create (argv[2], filesize (in_fd)))
{
printf ("%s: create failed\n", argv[2]);
}
/* Create and open output file. */
if (!create (argv[2], filesize (in_fd)))
{
printf ("%s: create failed\n", argv[2]);
}
out_fd = open (argv[2]);
if (out_fd < 0)
{
printf ("%s: open failed\n", argv[2]);
}
out_fd = open (argv[2]);
if (out_fd < 0)
{
printf ("%s: open failed\n", argv[2]);
if (write (out_fd, buffer, bytes_read) != bytes_read)
{
printf ("%s: write failed\n", argv[2]);
if (write (out_fd, buffer, bytes_read) != bytes_read)
{
printf ("%s: write failed\n", argv[2]);
int
main (int argc, char **argv)
int
main (int argc, char **argv)
printf ("%s ", argv[i]);
printf ("\n");
printf ("%s ", argv[i]);
printf ("\n");
int
main (int argc, char *argv[])
{
int
main (int argc, char *argv[])
{
int i;
for (i = 1; i < argc; i++)
int i;
for (i = 1; i < argc; i++)
if (fd < 0)
{
printf ("%s: open failed\n", argv[i]);
if (fd < 0)
{
printf ("%s: open failed\n", argv[i]);
+ return success ? EXIT_SUCCESS : EXIT_FAILURE;
if (handle < 0)
{
printf ("%s: open failed\n", argv[i]);
if (handle < 0)
{
printf ("%s: open failed\n", argv[i]);
if (file_flag)
close (handle);
if (file_flag)
close (handle);
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <string.h>
list_dir (const char *dir, bool verbose)
{
int dir_fd = open (dir);
if (dir_fd == -1)
{
printf ("%s: not found\n", dir);
list_dir (const char *dir, bool verbose)
{
int dir_fd = open (dir);
if (dir_fd == -1)
{
printf ("%s: not found\n", dir);
}
else
printf ("%s: not a directory\n", dir);
}
else
printf ("%s: not a directory\n", dir);
+ close (dir_fd);
+ return true;
}
int
main (int argc, char *argv[])
{
}
int
main (int argc, char *argv[])
{
if (argc > 1 && !strcmp (argv[1], "-l"))
{
verbose = true;
if (argc > 1 && !strcmp (argv[1], "-l"))
{
verbose = true;
- list_dir (".", verbose);
+ success = list_dir (".", verbose);
else
{
int i;
for (i = 1; i < argc; i++)
else
{
int i;
for (i = 1; i < argc; i++)
- list_dir (argv[i], verbose);
+ if (!list_dir (argv[i], verbose))
+ success = false;
+ return success ? EXIT_SUCCESS : EXIT_FAILURE;
if (fd < 0)
{
printf ("%s: open failed\n", argv[i]);
if (fd < 0)
{
printf ("%s: open failed\n", argv[i]);
if (map == MAP_FAILED)
{
printf ("%s: mmap failed\n", argv[i]);
if (map == MAP_FAILED)
{
printf ("%s: mmap failed\n", argv[i]);
}
/* Write file to console. */
}
/* Write file to console. */
/* Unmap files (optional). */
munmap (map);
}
/* Unmap files (optional). */
munmap (map);
}
if (argc != 3)
{
printf ("usage: cp OLD NEW\n");
if (argc != 3)
{
printf ("usage: cp OLD NEW\n");
if (in_fd < 0)
{
printf ("%s: open failed\n", argv[1]);
if (in_fd < 0)
{
printf ("%s: open failed\n", argv[1]);
}
size = filesize (in_fd);
}
size = filesize (in_fd);
if (!create (argv[2], size))
{
printf ("%s: create failed\n", argv[2]);
if (!create (argv[2], size))
{
printf ("%s: create failed\n", argv[2]);
}
out_fd = open (argv[2]);
if (out_fd < 0)
{
printf ("%s: open failed\n", argv[2]);
}
out_fd = open (argv[2]);
if (out_fd < 0)
{
printf ("%s: open failed\n", argv[2]);
if (in_map == MAP_FAILED)
{
printf ("%s: mmap failed\n", argv[1]);
if (in_map == MAP_FAILED)
{
printf ("%s: mmap failed\n", argv[1]);
}
out_map = mmap (out_fd, out_data);
if (out_map == MAP_FAILED)
{
printf ("%s: mmap failed\n", argv[2]);
}
out_map = mmap (out_fd, out_data);
if (out_map == MAP_FAILED)
{
printf ("%s: mmap failed\n", argv[2]);
munmap (in_map);
munmap (out_map);
munmap (in_map);
munmap (out_map);
int
main (int argc, char *argv[])
{
int
main (int argc, char *argv[])
{
- if (argc != 2)
- PANIC ("usage: %s DIRECTORY\n", argv[0]);
+ if (argc != 2)
+ {
+ printf ("usage: %s DIRECTORY\n", argv[0]);
+ return EXIT_FAILURE;
+ }
- if (!mkdir (argv[1]))
- PANIC ("%s: mkdir failed\n", argv[1]);
-
- return 0;
+ if (!mkdir (argv[1]))
+ {
+ printf ("%s: mkdir failed\n", argv[1]);
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
if (getcwd (cwd, sizeof cwd))
{
printf ("%s\n", cwd);
if (getcwd (cwd, sizeof cwd))
{
printf ("%s\n", cwd);
}
else
{
printf ("error\n");
}
else
{
printf ("error\n");
int
main (int argc, char *argv[])
{
int
main (int argc, char *argv[])
{
int i;
for (i = 1; i < argc; i++)
int i;
for (i = 1; i < argc; i++)
- if (!remove (argv[i]))
- printf ("%s: remove failed\n", argv[i]);
- return 0;
+ if (!remove (argv[i]))
+ {
+ printf ("%s: remove failed\n", argv[i]);
+ success = false;
+ }
+ return success ? EXIT_SUCCESS : EXIT_FAILURE;
}
printf ("Shell exiting.");
}
printf ("Shell exiting.");
}
/* Reads a line of input from the user into LINE, which has room
}
/* Reads a line of input from the user into LINE, which has room
#include <stdbool.h>
#include <debug.h>
#include <stdbool.h>
#include <debug.h>
+/* Process identifier. */
typedef int pid_t;
#define PID_ERROR ((pid_t) -1)
typedef int pid_t;
#define PID_ERROR ((pid_t) -1)
+/* Map region identifier. */
typedef int mapid_t;
#define MAP_FAILED ((mapid_t) -1)
typedef int mapid_t;
#define MAP_FAILED ((mapid_t) -1)
+/* Maximum characters in a filename written by readdir(). */
#define READDIR_MAX_LEN 14
#define READDIR_MAX_LEN 14
+/* Typical return values from main() and arguments to exit(). */
+#define EXIT_SUCCESS 0 /* Successful execution. */
+#define EXIT_FAILURE 1 /* Unsuccessful execution. */
+
+/* Projects 2 and later. */
void halt (void) NO_RETURN;
void exit (int status) NO_RETURN;
pid_t exec (const char *file);
void halt (void) NO_RETURN;
void exit (int status) NO_RETURN;
pid_t exec (const char *file);
void seek (int fd, unsigned position);
unsigned tell (int fd);
void close (int fd);
void seek (int fd, unsigned position);
unsigned tell (int fd);
void close (int fd);
+
+/* Project 3 and optionally project 4. */
mapid_t mmap (int fd, void *addr);
void munmap (mapid_t);
mapid_t mmap (int fd, void *addr);
void munmap (mapid_t);
bool chdir (const char *dir);
bool mkdir (const char *dir);
bool readdir (int fd, char name[READDIR_MAX_LEN + 1]);
bool chdir (const char *dir);
bool mkdir (const char *dir);
bool readdir (int fd, char name[READDIR_MAX_LEN + 1]);