1/* $NetBSD: citrus_lc_template.h,v 1.1.2.2 2009/01/04 17:02:18 christos Exp $ */ 2 3/*- 4 * Copyright (c)2008 Citrus Project, 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29#ifndef _CITRUS_LC_TEMPLATE_H_ 30#define _CITRUS_LC_TEMPLATE_H_ 31 32static __inline int 33_PREFIX(create_impl)(const char * __restrict root, 34 const char * __restrict name, _CATEGORY_TYPE ** __restrict pdata) 35{ 36 char path[PATH_MAX + 1]; 37 int ret; 38 struct _region file; 39 struct _citrus_db *db; 40 struct _memstream ms; 41 _CATEGORY_TYPE *data; 42 43 snprintf(path, sizeof(path), 44 "%s/%s/" _CATEGORY_DB, root, name); 45 ret = _map_file(&file, path); 46 if (ret) { 47 ret = ENOENT; 48 } else { 49 data = malloc(sizeof(*data)); 50 if (!data) { 51 ret = ENOMEM; 52 } else { 53 ret = _db_open(&db, &file, _CATEGORY_MAGIC, 54 &_db_hash_std, NULL); 55 if (!ret) { 56 ret = _PREFIX(init_normal)(data, db); 57 _db_close(db); 58 } else { 59 _memstream_bind(&ms, &file); 60 ret = _PREFIX(init_fallback)(data, &ms); 61 } 62 if (!ret) 63 *pdata = data; 64 else 65 free(data); 66 } 67 _unmap_file(&file); 68 } 69 return ret; 70} 71 72#include "nb_lc_template.h" 73 74#endif /* _CITRUS_LC_TEMPLATE_H_ */ 75