VirtualBox

Changeset 615 in kBuild for trunk/src/gmake/kmkbuiltin/setmode.c


Ignore:
Timestamp:
Nov 26, 2006 6:33:40 AM (18 years ago)
Author:
bird
Message:

NetBSD: /setmode.c/1.30/Thu Aug 7 16:42:56 2003

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gmake/kmkbuiltin/setmode.c

    r370 r615  
     1/*      $NetBSD: setmode.c,v 1.30 2003/08/07 16:42:56 agc Exp $ */
     2
    13/*
    24 * Copyright (c) 1989, 1993, 1994
     
    1416 *    notice, this list of conditions and the following disclaimer in the
    1517 *    documentation and/or other materials provided with the distribution.
    16  * 3. All advertising materials mentioning features or use of this software
    17  *    must display the following acknowledgement:
    18  *      This product includes software developed by the University of
    19  *      California, Berkeley and its contributors.
    20  * 4. Neither the name of the University nor the names of its contributors
     18 * 3. Neither the name of the University nor the names of its contributors
    2119 *    may be used to endorse or promote products derived from this software
    2220 *    without specific prior written permission.
     
    3533 */
    3634
     35#include <sys/cdefs.h>
    3736#if defined(LIBC_SCCS) && !defined(lint)
     37#if 0
    3838static char sccsid[] = "@(#)setmode.c   8.2 (Berkeley) 3/25/94";
    39 #include <sys/cdefs.h>
    40 //__FBSDID("$FreeBSD: src/lib/libc/gen/setmode.c,v 1.9 2003/02/23 00:24:03 mikeh Exp $");
     39#else
     40__RCSID("$NetBSD: setmode.c,v 1.30 2003/08/07 16:42:56 agc Exp $");
     41#endif
    4142#endif /* LIBC_SCCS and not lint */
    4243
    43 //#include "namespace.h"
     44#include "namespace.h"
    4445#include <sys/types.h>
    4546#include <sys/stat.h>
    4647
     48#include <assert.h>
    4749#include <ctype.h>
     50#include <errno.h>
    4851#include <signal.h>
    49 #include <stddef.h>
    5052#include <stdlib.h>
    51 #ifndef _MSC_VER
    5253#include <unistd.h>
    53 #else
    54 #include "mscfakes.h"
    55 #endif
    5654
    5755#ifdef SETMODE_DEBUG
    5856#include <stdio.h>
    5957#endif
    60 //#include "un-namespace.h"
     58
     59#ifdef __weak_alias
     60__weak_alias(getmode,_getmode)
     61__weak_alias(setmode,_setmode)
     62#endif
    6163
    6264#define SET_LEN 6               /* initial # of bitcmd struct to malloc */
     
    7577#define CMD2_UBITS      0x10
    7678
    77 static BITCMD   *addcmd(BITCMD *, int, int, int, u_int);
    78 static void      compress_mode(BITCMD *);
    79 #ifdef SETMODE_DEBUG
    80 static void      dumpmode(BITCMD *);
    81 #endif
    82 
    83 #ifndef S_ISTXT
    84 #ifdef S_ISVTX
    85 #define S_ISTXT S_ISVTX
    86 #else
    87 #define S_ISTXT 0
    88 #endif
    89 #endif /* !S_ISTXT */
     79static BITCMD   *addcmd __P((BITCMD *, int, int, int, u_int));
     80static void      compress_mode __P((BITCMD *));
     81#ifdef SETMODE_DEBUG
     82static void      dumpmode __P((BITCMD *));
     83#endif
    9084
    9185/*
     
    10296        const BITCMD *set;
    10397        mode_t clrval, newmode, value;
     98
     99        _DIAGASSERT(bbox != NULL);
    104100
    105101        set = (const BITCMD *)bbox;
     
    165161}
    166162
    167 #define ADDCMD(a, b, c, d)                                              \
     163#define ADDCMD(a, b, c, d) do {                                         \
    168164        if (set >= endset) {                                            \
    169165                BITCMD *newset;                                         \
    170166                setlen += SET_LEN_INCR;                                 \
    171167                newset = realloc(saveset, sizeof(BITCMD) * setlen);     \
    172                 if (!newset) {                                          \
    173                         if (saveset)                                    \
    174                                 free(saveset);                          \
    175                         saveset = NULL;                                 \
     168                if (newset == NULL) {                                   \
     169                        free(saveset);                                  \
    176170                        return (NULL);                                  \
    177171                }                                                       \
     
    180174                endset = newset + (setlen - 2);                         \
    181175        }                                                               \
    182         set = addcmd(set, (a), (b), (c), (d))
     176        set = addcmd(set, (a), (b), (c), (d));                          \
     177} while (/*CONSTCOND*/0)
    183178
    184179#define STANDARD_BITS   (S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO)
     
    191186        char op, *ep;
    192187        BITCMD *set, *saveset, *endset;
    193 #ifndef _MSC_VER
    194         sigset_t sigset, sigoset;
    195 #endif
     188        sigset_t signset, sigoset;
    196189        mode_t mask;
    197         int equalopdone=0, permXbits, setlen;
    198         long perml;
     190        int equalopdone = 0;    /* pacify gcc */
     191        int permXbits, setlen;
    199192
    200193        if (!*p)
     
    207200         * as best we can.
    208201         */
    209 #ifndef _MSC_VER
    210         sigfillset(&sigset);
    211         (void)sigprocmask(SIG_BLOCK, &sigset, &sigoset);
    212 #endif
     202        sigfillset(&signset);
     203        (void)sigprocmask(SIG_BLOCK, &signset, &sigoset);
    213204        (void)umask(mask = umask(0));
    214205        mask = ~mask;
    215 #ifndef _MSC_VER
    216         (void)sigprocmask(SIG_SETMASK, &sigoset, NULL);
    217 #endif
     206        (void)sigprocmask(SIG_SETMASK, &sigoset, NULL);
    218207
    219208        setlen = SET_LEN + 2;
    220 
     209       
    221210        if ((set = malloc((u_int)(sizeof(BITCMD) * setlen))) == NULL)
    222211                return (NULL);
     
    229218         */
    230219        if (isdigit((unsigned char)*p)) {
    231                 perml = strtol(p, &ep, 8);
    232                 if (*ep || perml < 0 || perml & ~(STANDARD_BITS|S_ISTXT)) {
     220                perm = (mode_t)strtol(p, &ep, 8);
     221                if (*ep || perm & ~(STANDARD_BITS|S_ISTXT)) {
    233222                        free(saveset);
    234223                        return (NULL);
    235224                }
    236                 perm = (mode_t)perml;
    237225                ADDCMD('=', (STANDARD_BITS|S_ISTXT), perm, mask);
    238226                set->cmd = 0;
     
    279267                                break;
    280268                        case 's':
    281                                 /* If only "other" bits ignore set-id. */
    282                                 if (!who || who & ~S_IRWXO)
     269                                /*
     270                                 * If specific bits where requested and
     271                                 * only "other" bits ignore set-id.
     272                                 */
     273                                if (who == 0 || (who & ~S_IRWXO))
    283274                                        perm |= S_ISUID|S_ISGID;
    284275                                break;
    285276                        case 't':
    286                                 /* If only "other" bits ignore sticky. */
    287                                 if (!who || who & ~S_IRWXO) {
     277                                /*
     278                                 * If specific bits where requested and
     279                                 * only "other" bits ignore set-id.
     280                                 */
     281                                if (who == 0 || (who & ~S_IRWXO)) {
    288282                                        who |= S_ISTXT;
    289283                                        perm |= S_ISTXT;
     
    365359        u_int mask;
    366360{
     361
     362        _DIAGASSERT(set != NULL);
     363
    367364        switch (op) {
    368365        case '=':
     
    393390                        set->bits = mask;
    394391                }
    395 
     392       
    396393                if (oparg == '+')
    397394                        set->cmd2 |= CMD2_SET;
     
    410407        BITCMD *set;
    411408{
     409
     410        _DIAGASSERT(set != NULL);
     411
    412412        for (; set->cmd; ++set)
    413413                (void)printf("cmd: '%c' bits %04o%s%s%s%s%s%s\n",
     
    424424 * Given an array of bitcmd structures, compress by compacting consecutive
    425425 * '+', '-' and 'X' commands into at most 3 commands, one of each.  The 'u',
    426  * 'g' and 'o' commands continue to be separate.  They could probably be
     426 * 'g' and 'o' commands continue to be separate.  They could probably be 
    427427 * compacted, but it's not worth the effort.
    428428 */
     
    433433        BITCMD *nset;
    434434        int setbits, clrbits, Xbits, op;
     435
     436        _DIAGASSERT(set != NULL);
    435437
    436438        for (nset = set;;) {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette