diff --git a/defs.h b/defs.h
index fe863cd0f8e374677db5196bac82334c2caa0cfe..cb47716375dced2fcd187c084bfb3e3005f7a13b 100644
--- a/defs.h
+++ b/defs.h
@@ -94,6 +94,7 @@ int             pipewrite(struct pipe*, char*, int);
 // proc.c
 struct proc*    copyproc(struct proc*);
 void            exit(void);
+int             fork(void);
 int             growproc(int);
 int             kill(int);
 void            pinit(void);
@@ -146,9 +147,9 @@ void            tvinit(void);
 extern struct spinlock tickslock;
 
 // uart.c
-void		uartinit(void);
-void		uartintr(void);
-void		uartputc(int);
+void            uartinit(void);
+void            uartintr(void);
+void            uartputc(int);
 
 
 // number of elements in fixed-size array
diff --git a/proc.c b/proc.c
index 20f4be978c70c133155d971c0ec814410dbb8a18..a2aeab2884906b4c06ce6878d071be426c4fae03 100644
--- a/proc.c
+++ b/proc.c
@@ -130,34 +130,40 @@ usegment(void)
 // Create a new process copying p as the parent.
 // Sets up stack to return as if from system call.
 // Caller must set state of returned proc to RUNNABLE.
-struct proc*
-copyproc(struct proc *p)
+int
+fork(void)
 {
-  int i;
+  int i, pid;
   struct proc *np;
 
   // Allocate process.
   if((np = allocproc()) == 0)
-    return 0;
+    return -1;
 
   // Copy process state from p.
-  np->sz = p->sz;
+  np->sz = cp->sz;
   if((np->mem = kalloc(np->sz)) == 0){
     kfree(np->kstack, KSTACKSIZE);
     np->kstack = 0;
     np->state = UNUSED;
-    return 0;
+    return -1;
   }
-  memmove(np->mem, p->mem, np->sz);
-  np->parent = p;
-  *np->tf = *p->tf;
+  memmove(np->mem, cp->mem, np->sz);
+  np->parent = cp;
+  *np->tf = *cp->tf;
 
-  for(i = 0; i < NOFILE; i++)
-    if(p->ofile[i])
-      np->ofile[i] = filedup(p->ofile[i]);
-  np->cwd = idup(p->cwd);
+  // Clear %eax so that fork returns 0 in the child.
+  np->tf->eax = 0;
 
-  return np;
+  for(i = 0; i < NOFILE; i++)
+    if(cp->ofile[i])
+      np->ofile[i] = filedup(cp->ofile[i]);
+  np->cwd = idup(cp->cwd);
+ 
+  pid = np->pid;
+  np->state = RUNNABLE;
+
+  return pid;
 }
 
 // Set up first user process.
diff --git a/sysproc.c b/sysproc.c
index da01b5b363114ed27914a4b40304e8a12aeb3101..5ecbf2b7aca17d2849757c6199332bfbfaa296d8 100644
--- a/sysproc.c
+++ b/sysproc.c
@@ -8,17 +8,7 @@
 int
 sys_fork(void)
 {
-  int pid;
-  struct proc *np;
-
-  if((np = copyproc(cp)) == 0)
-    return -1;
-  pid = np->pid;
-
-  // Clear %eax so that fork returns 0 in the child.
-  np->tf->eax = 0;
-  np->state = RUNNABLE;
-  return pid;
+  return fork();
 }
 
 int