Integrate 'sofar' into sized_allocs
[akaros.git] / kern / drivers / dev / proc.c
index 4672bb6..c6479fc 100644 (file)
@@ -17,8 +17,6 @@
  * rather than excise code that won't work, I'm bracketing it with
  * #if 0 until we know we don't want it
  */
-#include <vfs.h>
-#include <kfs.h>
 #include <slab.h>
 #include <kmalloc.h>
 #include <kref.h>
@@ -391,9 +389,8 @@ static void nonone(struct proc *p)
 }
 
 struct bm_helper {
-       void                                            *buf;
+       struct sized_alloc                      *sza;
        size_t                                          buflen;
-       size_t                                          sofar;
 };
 
 static void get_needed_sz_cb(struct vm_region *vmr, void *arg)
@@ -407,6 +404,7 @@ static void get_needed_sz_cb(struct vm_region *vmr, void *arg)
 static void build_maps_cb(struct vm_region *vmr, void *arg)
 {
        struct bm_helper *bmh = (struct bm_helper*)arg;
+       struct sized_alloc *sza = bmh->sza;
        size_t old_sofar;
        char path_buf[MAX_FILENAME_SZ];
        char *path;
@@ -421,39 +419,33 @@ static void build_maps_cb(struct vm_region *vmr, void *arg)
                inode_nr = 0;
        }
 
-       old_sofar = bmh->sofar;
-       bmh->sofar += snprintf(bmh->buf + bmh->sofar, bmh->buflen - bmh->sofar,
-                              "%08lx-%08lx %c%c%c%c %08x %02d:%02d %d ",
-                              vmr->vm_base, vmr->vm_end,
-                              vmr->vm_prot & PROT_READ    ? 'r' : '-',
-                              vmr->vm_prot & PROT_WRITE   ? 'w' : '-',
-                              vmr->vm_prot & PROT_EXEC    ? 'x' : '-',
-                              vmr->vm_flags & MAP_PRIVATE ? 'p' : 's',
-                              vmr_has_file(vmr) ? vmr->vm_foff : 0,
-                              vmr_has_file(vmr) ? 1 : 0,       /* VFS == 1 for major */
-                              0,
-                              inode_nr);
+       old_sofar = sza->sofar;
+       sza_printf(sza, "%08lx-%08lx %c%c%c%c %08x %02d:%02d %d ",
+                       vmr->vm_base, vmr->vm_end,
+                       vmr->vm_prot & PROT_READ    ? 'r' : '-',
+                       vmr->vm_prot & PROT_WRITE   ? 'w' : '-',
+                       vmr->vm_prot & PROT_EXEC    ? 'x' : '-',
+                       vmr->vm_flags & MAP_PRIVATE ? 'p' : 's',
+                       vmr_has_file(vmr) ? vmr->vm_foff : 0,
+                       vmr_has_file(vmr) ? 1 : 0,      /* VFS == 1 for major */
+                       0,
+                       inode_nr);
        /* Align the filename to the 74th char, like Linux (73 chars so far) */
-       bmh->sofar += snprintf(bmh->buf + bmh->sofar, bmh->buflen - bmh->sofar,
-                              "%*s", 73 - (bmh->sofar - old_sofar), "");
-       bmh->sofar += snprintf(bmh->buf + bmh->sofar, bmh->buflen - bmh->sofar,
-                              "%s\n", path);
+       sza_printf(sza, "%*s", 73 - (sza->sofar - old_sofar), "");
+       sza_printf(sza, "%s\n", path);
 }
 
 static struct sized_alloc *build_maps(struct proc *p)
 {
        struct bm_helper bmh[1];
-       struct sized_alloc *sza;
 
        /* Try to figure out the size needed: start with extra space, then add a bit
         * for each VMR */
        bmh->buflen = 150;
        enumerate_vmrs(p, get_needed_sz_cb, bmh);
-       sza = sized_kzmalloc(bmh->buflen, MEM_WAIT);
-       bmh->buf = sza->buf;
-       bmh->sofar = 0;
+       bmh->sza = sized_kzmalloc(bmh->buflen, MEM_WAIT);
        enumerate_vmrs(p, build_maps_cb, bmh);
-       return sza;
+       return bmh->sza;
 }
 
 static struct chan *procopen(struct chan *c, int omode)
@@ -1042,7 +1034,7 @@ static size_t procread(struct chan *c, void *va, size_t n, off64_t off)
                        return i;
                case Qmaps:
                        sza = c->aux;
-                       i = readmem(off, va, n, sza->buf, sza->size);
+                       i = readstr(off, va, n, sza->buf);
                        proc_decref(p);
                        return i;
        }
@@ -1276,20 +1268,8 @@ void procstopwait(struct proc *p, int ctl)
 static void procctlcloseone(struct proc *p, int fd)
 {
 // TODO: resolve this and sys_close
-       struct file *file = get_file_from_fd(&p->open_files, fd);
-       int retval = 0;
-       printd("%s %d\n", __func__, fd);
-       /* VFS */
-       if (file) {
-               put_file_from_fd(&p->open_files, fd);
-               kref_put(&file->f_kref);        /* Drop the ref from get_file */
-               return;
-       }
-       /* 9ns, should also handle errors (bad FD, etc) */
-       retval = sysclose(fd);
+       sysclose(fd);
        return;
-
-       //sys_close(p, fd);
 }
 
 void procctlclosefiles(struct proc *p, int all, int fd)