From owner-svn-src-user@FreeBSD.ORG Fri Nov 21 19:13:56 2014 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id ADC3B6AE; Fri, 21 Nov 2014 19:13:56 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 80828D07; Fri, 21 Nov 2014 19:13:56 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id sALJDtGS046088; Fri, 21 Nov 2014 19:13:55 GMT (envelope-from marcel@FreeBSD.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id sALJDtHm046087; Fri, 21 Nov 2014 19:13:55 GMT (envelope-from marcel@FreeBSD.org) Message-Id: <201411211913.sALJDtHm046087@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: marcel set sender to marcel@FreeBSD.org using -f From: Marcel Moolenaar Date: Fri, 21 Nov 2014 19:13:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r274809 - user/marcel/libvdsk/libvdsk X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Nov 2014 19:13:56 -0000 Author: marcel Date: Fri Nov 21 19:13:54 2014 New Revision: 274809 URL: https://svnweb.freebsd.org/changeset/base/274809 Log: Improve vdsk_open(): 1. Use calloc(3) instead of malloc(3) so that the user context is always pre-initialized. 2. Wrap the sequence of steps in a `do { ... } while (0)' block so that we can use break to exit. Introduce ctx as the variable to return and use it to determine success or failure. With a single entry and a single exit, we can more easily add some kind of tracing or logging in the future. Modified: user/marcel/libvdsk/libvdsk/vdsk.c Modified: user/marcel/libvdsk/libvdsk/vdsk.c ============================================================================== --- user/marcel/libvdsk/libvdsk/vdsk.c Fri Nov 21 18:35:50 2014 (r274808) +++ user/marcel/libvdsk/libvdsk/vdsk.c Fri Nov 21 19:13:54 2014 (r274809) @@ -52,37 +52,50 @@ vdskctx vdsk_open(const char *path, int flags, size_t size) { struct stat sb; + vdskctx ctx; struct vdsk *vdsk; - size += sizeof(struct vdsk); - vdsk = malloc(size); - if (vdsk == NULL) - return (NULL); - - vdsk->fd = open(path, flags); - if (vdsk->fd == -1) { - free(vdsk); - return (NULL); - } + ctx = NULL; - if (fstat(vdsk->fd, &sb) == -1) { - close(vdsk->fd); - free(vdsk); - return (NULL); - } + do { + size += sizeof(struct vdsk); + vdsk = calloc(1, size); + if (vdsk == NULL) + break; + + vdsk->fd = open(path, flags); + if (vdsk->fd == -1) + break; + + if (fstat(vdsk->fd, &sb) == -1) + break; + + if (S_ISCHR(sb.st_mode)) { + if (ioctl(vdsk->fd, DIOCGMEDIASIZE, + &vdsk->capacity) < 0) + break; + if (ioctl(vdsk->fd, DIOCGSECTORSIZE, + &vdsk->sectorsize) < 0) + break; + } else { + vdsk->capacity = sb.st_size; + vdsk->sectorsize = DEV_BSIZE; + } - if (S_ISCHR(sb.st_mode)) { - if (ioctl(vdsk->fd, DIOCGMEDIASIZE, &vdsk->capacity) < 0 || - ioctl(vdsk->fd, DIOCGSECTORSIZE, &vdsk->sectorsize) < 0) { - close(vdsk->fd); + /* Complete... */ + ctx = vdsk + 1; + } while (0); + + if (ctx == NULL) { + if (vdsk != NULL) { + if (vdsk->fd != -1) + close(vdsk->fd); free(vdsk); - return (NULL); + vdsk = NULL; } - } else { - vdsk->capacity = sb.st_size; - vdsk->sectorsize = DEV_BSIZE; } - return (vdsk + 1); + + return (ctx); } int