Print this page
3687 fopen() O_CLOEXEC support via the "e" flag

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libc/port/stdio/_endopen.c
          +++ new/usr/src/lib/libc/port/stdio/_endopen.c
↓ open down ↓ 19 lines elided ↑ open up ↑
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
  25   25   */
  26   26  
  27   27  /*      Copyright (c) 1988 AT&T */
  28   28  /*        All Rights Reserved   */
  29   29  
  30      -#pragma ident   "%Z%%M% %I%     %E% SMI"
       30 +/* Copyright (c) 2013 OmniTI Computer Consulting, Inc. All rights reserved. */
  31   31  
  32   32  /*
  33   33   *      This routine is a special case, in that it is aware of
  34   34   *      both small and large file interfaces. It must be built
  35   35   *      in the small compilation environment.
  36   36   */
  37   37  
  38   38  #include "lint.h"
  39   39  #include "file64.h"
  40   40  #include <mtlib.h>
↓ open down ↓ 7 lines elided ↑ open up ↑
  48   48  #include "stdiom.h"
  49   49  #include <errno.h>
  50   50  
  51   51  /*
  52   52   * open UNIX file name, associate with iop
  53   53   */
  54   54  
  55   55  FILE *
  56   56  _endopen(const char *name, const char *type, FILE *iop, int largefile)
  57   57  {
  58      -        int oflag, fd, fflag;
  59      -        char plus;
       58 +        int oflag, fd, fflag, eflag, plusflag;
       59 +        const char *echr;
  60   60  
  61   61          if (iop == NULL)
  62   62                  return (NULL);
  63   63          switch (type[0]) {
  64   64          default:
  65   65                  errno = EINVAL;
  66   66                  return (NULL);
  67   67          case 'r':
  68   68                  oflag = O_RDONLY;
  69   69                  fflag = _IOREAD;
  70   70                  break;
  71   71          case 'w':
  72   72                  oflag = O_WRONLY | O_TRUNC | O_CREAT;
  73   73                  fflag = _IOWRT;
  74   74                  break;
  75   75          case 'a':
  76   76                  oflag = O_WRONLY | O_APPEND | O_CREAT;
  77   77                  fflag = _IOWRT;
  78   78                  break;
  79   79          }
  80      -        /* UNIX ignores 'b' and treats text and binary the same */
  81      -        if ((plus = type[1]) == 'b')
  82      -                plus = type[2];
  83      -        if (plus == '+') {
       80 +
       81 +        plusflag = 0;
       82 +        eflag = 0;
       83 +        for (echr = type + 1; *echr != '\0'; echr++) {
       84 +                switch (*echr) {
       85 +                /* UNIX ignores 'b' and treats text and binary the same */
       86 +                default:
       87 +                        break;
       88 +                case '+':
       89 +                        plusflag = 1;
       90 +                        break;
       91 +                case 'e':
       92 +                        eflag = 1;
       93 +                        break;
       94 +                }
       95 +        }
       96 +        if (eflag) {
       97 +                /* Subsequent to a mode flag, 'e' indicates O_CLOEXEC */
       98 +                oflag = oflag | O_CLOEXEC;
       99 +        }
      100 +        if (plusflag) {
  84  101                  oflag = (oflag & ~(O_RDONLY | O_WRONLY)) | O_RDWR;
  85  102                  fflag = _IORW;
  86  103          }
  87  104  
  88  105          /* select small or large file open based on flag */
  89  106          if (largefile) {
  90  107                  fd = open64(name, oflag, 0666);
  91  108          } else {
  92  109                  fd = open(name, oflag, 0666);
  93  110          }
↓ open down ↓ 27 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX