Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Oct 2001 12:32:06 -0400 (EDT)
From:      The Anarcat <anarcat@anarcat.dyndns.org>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/31201: [patch] add free_space(chunk) to libdisk
Message-ID:  <20011010163206.3258220B50@shall.anarcat.dyndns.org>

next in thread | raw e-mail | index | archive | help

>Number:         31201
>Category:       bin
>Synopsis:       [patch] add free_space(chunk) to libdisk
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Oct 10 09:40:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     The Anarcat
>Release:        FreeBSD 4.4-STABLE i386
>Organization:
Nada, Inc
>Environment:
System: FreeBSD shall.anarcat.dyndns.org 4.4-STABLE FreeBSD 4.4-STABLE #7: Sat Sep 15 00:41:38 EDT 2001 anarcat@shall.anarcat.dyndns.org:/usr/obj/usr/src/sys/SHALL i386

>Description:

There is no function available to see the "free space" available on a
given slice, where free space is defined as per
src/release/sysinstall/label.c:255 (free = size - sum of used parts)

>How-To-Repeat:

n/a

>Fix:

patch libdisk to include sysinstall' space_free. note that this makes
use of errno to signal an error, this might not be proper style since
size args are usually u_long and we're using plain long here to signal
the error (-1).

diff -c /usr/src/lib/libdisk/chunk.c.orig /usr/src/lib/libdisk/chunk.c
*** /usr/src/lib/libdisk/chunk.c.orig	Wed Oct 10 12:29:42 2001
--- /usr/src/lib/libdisk/chunk.c	Wed Oct 10 12:29:42 2001
***************
*** 16,21 ****
--- 16,22 ----
  #include <string.h>
  #include <sys/types.h>
  #include <err.h>
+ #include <errno.h>
  #include "libdisk.h"
  
  #define new_chunk() memset(malloc(sizeof(struct chunk)), 0, sizeof(struct chunk))
***************
*** 327,332 ****
--- 328,350 ----
  	if (c->flags & CHUNK_IS_ROOT)		ret[i++] = 'R';
  	ret[i++] = '\0';
  	return ret;
+ }
+ 
+ /* return free space of that chunk */
+ long
+ free_space(struct chunk *c)
+ {
+     struct chunk *c1;
+     int sz = c->size;
+     if (!c) {
+       errno = EFAULT;
+       return -1;
+     }
+     for (c1 = c->part; c1; c1 = c1->next) {
+ 	if (c1->type != unused)
+ 	    sz -= c1->size;
+     }
+     return sz;
  }
  
  void


diff -c /usr/src/lib/libdisk/libdisk.h.orig /usr/src/lib/libdisk/libdisk.h
*** /usr/src/lib/libdisk/libdisk.h.orig	Wed Oct 10 12:30:42 2001
--- /usr/src/lib/libdisk/libdisk.h	Wed Oct 10 12:30:43 2001
***************
*** 156,161 ****
--- 156,173 ----
  /* Create a chunk with the specified paramters
   */
  
+ long
+ free_space(struct chunk *c);
+ /* 
+  * return the free space available in this chunk
+  *
+  * free = total - sum "not unused" partitions
+  *
+  * returns the space or -1 if an error occured
+  *
+  * EFAULT: bad chunk pointer given
+  */
+ 
  void
  All_FreeBSD(struct disk *d, int force_all);
  /* Make one FreeBSD chunk covering the entire disk;
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20011010163206.3258220B50>