11.8Sdbj/*	$NetBSD: getmode.c,v 1.8 2008/11/04 23:31:32 dbj Exp $	*/
21.1Stv
31.1Stv/*-
41.1Stv * Copyright (c) 2001 The NetBSD Foundation, Inc.
51.1Stv * All rights reserved.
61.1Stv *
71.1Stv * This code is derived from software contributed to The NetBSD Foundation
81.1Stv * by Todd Vierling.
91.1Stv *
101.1Stv * Redistribution and use in source and binary forms, with or without
111.1Stv * modification, are permitted provided that the following conditions
121.1Stv * are met:
131.1Stv * 1. Redistributions of source code must retain the above copyright
141.1Stv *    notice, this list of conditions and the following disclaimer.
151.1Stv * 2. Redistributions in binary form must reproduce the above copyright
161.1Stv *    notice, this list of conditions and the following disclaimer in the
171.1Stv *    documentation and/or other materials provided with the distribution.
181.1Stv *
191.1Stv * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
201.1Stv * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
211.1Stv * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
221.1Stv * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
231.1Stv * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
241.1Stv * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
251.1Stv * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
261.1Stv * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
271.1Stv * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
281.1Stv * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
291.1Stv * POSSIBILITY OF SUCH DAMAGE.
301.1Stv */
311.1Stv
321.3Slukem#include "nbtool_config.h"
331.1Stv#include <stdlib.h>
341.8Sdbj#include <unistd.h>
351.1Stv
361.4Ssimonbvoid *
371.4Ssimonbsetmode(const char *str)
381.4Ssimonb{
391.1Stv	mode_t *mp = malloc(sizeof(mode_t));
401.1Stv
411.1Stv	*mp = strtoul(str, NULL, 8);
421.1Stv
431.1Stv	return mp;
441.1Stv}
451.1Stv
461.4Ssimonbmode_t
471.4Ssimonbgetmode(const void *mp, mode_t mode)
481.4Ssimonb{
491.6Ssimonb	mode_t m;
501.4Ssimonb
511.5Ssimonb	m = *((const mode_t *)mp);
521.5Ssimonb
531.5Ssimonb	mode &= ~ALLPERMS;	/* input mode less RWX permissions */
541.5Ssimonb	m &= ALLPERMS;		/* new RWX permissions */
551.5Ssimonb
561.5Ssimonb	return m | mode;
571.1Stv}
58