~vcs-imports/gawk/master

« back to all changes in this revision

Viewing changes to io.c

  • Committer: Arnold D. Robbins
  • Date: 2010-07-16 09:27:41 UTC
  • Revision ID: git-v1:61bb57af53ebe916d2db6e3585d4fc7ac1d99b92
Tags: gawk-2.15.3
Move to gawk-2.15.3.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
 * the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24
24
 */
25
25
 
 
26
#if !defined(VMS) && !defined(VMS_POSIX) && !defined(_MSC_VER)
 
27
#include <sys/param.h>
 
28
#endif
26
29
#include "awk.h"
27
30
 
28
31
#ifndef O_RDONLY
39
42
#define INVALID_HANDLE  (__SMALLEST_VALID_HANDLE - 1)
40
43
#endif
41
44
 
42
 
#if defined(MSDOS) || defined(atarist)
 
45
#if defined(MSDOS) || defined(OS2) || defined(atarist)
43
46
#define PIPES_SIMULATED
44
47
#endif
45
48
 
56
59
static IOBUF *iop_open P((char *file, char *how));
57
60
static int gawk_pclose P((struct redirect *rp));
58
61
static int do_pathopen P((char *file));
 
62
static int str2mode P((char *mode));
 
63
static void spec_setup P((IOBUF *iop, int len, int allocate));
 
64
static int specfdopen P((IOBUF *iop, char *name, char *mode));
 
65
static int pidopen P((IOBUF *iop, char *name, char *mode));
 
66
static int useropen P((IOBUF *iop, char *name, char *mode));
59
67
 
60
68
extern FILE     *fdopen();
 
69
 
 
70
#if defined (MSDOS)
 
71
#include "popen.h"
 
72
#define popen(c,m)      os_popen(c,m)
 
73
#define pclose(f)               os_pclose(f)
 
74
#elif defined (OS2)     /* OS/2, but not family mode */
 
75
#if defined (_MSC_VER)
 
76
#define popen(c,m)   _popen(c,m)
 
77
#define pclose(f)    _pclose(f)
 
78
#endif
 
79
#else
61
80
extern FILE     *popen();
 
81
#endif
62
82
 
63
83
static struct redirect *red_head = NULL;
64
84
 
87
107
        static int i = 1;
88
108
        static int files = 0;
89
109
        NODE *arg;
90
 
        int fd = INVALID_HANDLE;
91
110
        static IOBUF *curfile = NULL;
92
111
 
93
112
        if (skipping) {
121
140
                                /* NOTREACHED */
122
141
                        /* This is a kludge.  */
123
142
                        unref(FILENAME_node->var_value);
124
 
                        FILENAME_node->var_value =
125
 
                                dupnode(arg);
 
143
                        FILENAME_node->var_value = dupnode(arg);
126
144
                        FNR = 0;
127
145
                        i++;
128
146
                        break;
131
149
        if (files == 0) {
132
150
                files++;
133
151
                /* no args. -- use stdin */
134
 
                /* FILENAME is init'ed to "-" */
135
152
                /* FNR is init'ed to 0 */
 
153
                FILENAME_node->var_value = make_string("-", 1);
136
154
                curfile = iop_alloc(fileno(stdin));
137
155
        }
138
156
        return curfile;
544
562
        int status = 0;
545
563
 
546
564
        errno = 0;
547
 
        if (fclose(stdout)) {
548
 
                warning("error writing standard output (%s).", strerror(errno));
549
 
                status++;
550
 
        }
551
 
        if (fclose(stderr)) {
552
 
                warning("error writing standard error (%s).", strerror(errno));
553
 
                status++;
554
 
        }
555
565
        for (rp = red_head; rp != NULL; rp = next) {
556
566
                next = rp->next;
 
567
                /* close_redir() will print a message if needed */
557
568
                if (close_redir(rp))
558
569
                        status++;
559
570
                rp = NULL;
560
571
        }
 
572
        /*
 
573
         * Some of the non-Unix os's have problems doing an fclose
 
574
         * on stdout and stderr.  Since we don't really need to close
 
575
         * them, we just flush them, and do that across the board.
 
576
         */
 
577
        if (fflush(stdout)) {
 
578
                warning("error writing standard output (%s).", strerror(errno));
 
579
                status++;
 
580
        }
 
581
        if (fflush(stderr)) {
 
582
                warning("error writing standard error (%s).", strerror(errno));
 
583
                status++;
 
584
        }
561
585
        return status;
562
586
}
563
587
 
647
671
 
648
672
/* spec_setup --- setup an IOBUF for a special internal file */
649
673
 
650
 
void
 
674
static void
651
675
spec_setup(iop, len, allocate)
652
676
IOBUF *iop;
653
677
int len;
674
698
 
675
699
/* specfdopen --- open a fd special file */
676
700
 
677
 
int
 
701
static int
678
702
specfdopen(iop, name, mode)
679
703
IOBUF *iop;
680
704
char *name, *mode;
694
718
        return 0;
695
719
}
696
720
 
 
721
/*
 
722
 * Following mess will improve in 2.16; this is written to avoid
 
723
 * long lines, avoid splitting #if with backslash, and avoid #elif
 
724
 * to maximize portability.
 
725
 */
 
726
#ifndef GETPGRP_NOARG
 
727
#if defined(__svr4__) || defined(BSD4_4) || defined(_POSIX_SOURCE)
 
728
#define GETPGRP_NOARG
 
729
#else
 
730
#if defined(i860) || defined(_AIX) || defined(hpux) || defined(VMS)
 
731
#define GETPGRP_NOARG
 
732
#else
 
733
#if defined(OS2) || defined(MSDOS) || defined(AMIGA) || defined(atarist)
 
734
#define GETPGRP_NOARG
 
735
#endif
 
736
#endif
 
737
#endif
 
738
#endif
 
739
 
 
740
#ifdef GETPGRP_NOARG
 
741
#define getpgrp_ARG /* nothing */
 
742
#else
 
743
#define getpgrp_ARG getpid()
 
744
#endif
 
745
 
697
746
/* pidopen --- "open" /dev/pid, /dev/ppid, and /dev/pgrpid */
698
747
 
699
 
int
 
748
static int
700
749
pidopen(iop, name, mode)
701
750
IOBUF *iop;
702
751
char *name, *mode;
705
754
        int i;
706
755
 
707
756
        if (name[6] == 'g')
708
 
/* following #if will improve in 2.16 */
709
 
#if defined(__svr4__) || defined(i860) || defined(_AIX) || defined(BSD4_4)
710
 
                sprintf(tbuf, "%d\n", getpgrp());
711
 
#else
712
 
                sprintf(tbuf, "%d\n", getpgrp(getpid()));
713
 
#endif
 
757
                sprintf(tbuf, "%d\n", getpgrp( getpgrp_ARG ));
714
758
        else if (name[6] == 'i')
715
759
                sprintf(tbuf, "%d\n", getpid());
716
760
        else
733
777
 * supplementary group set.
734
778
 */
735
779
 
736
 
int
 
780
static int
737
781
useropen(iop, name, mode)
738
782
IOBUF *iop;
739
783
char *name, *mode;
741
785
        char tbuf[BUFSIZ], *cp;
742
786
        int i;
743
787
#if defined(NGROUPS_MAX) && NGROUPS_MAX > 0
 
788
#if defined(atarist)
 
789
        gid_t groupset[NGROUPS_MAX];
 
790
#else
744
791
        int groupset[NGROUPS_MAX];
 
792
#endif
745
793
        int ngroups;
746
794
#endif
747
795
 
755
803
 
756
804
        for (i = 0; i < ngroups; i++) {
757
805
                *cp++ = ' ';
758
 
                sprintf(cp, "%d", groupset[i]);
 
806
                sprintf(cp, "%d", (int)groupset[i]);
759
807
                cp += strlen(cp);
760
808
        }
761
809
#endif
776
824
char *name, *mode;
777
825
{
778
826
        int openfd = INVALID_HANDLE;
779
 
        char *cp, *ptr;
780
827
        int flag = 0;
781
 
        int i;
782
828
        struct stat buf;
783
829
        IOBUF *iop;
784
830
        static struct internal {
939
985
 
940
986
#else   /* PIPES_SIMULATED */
941
987
        /* use temporary file rather than pipe */
 
988
        /* except if popen() provides real pipes too */
942
989
 
943
 
#ifdef VMS
 
990
#if defined(VMS) || defined(OS2) || defined (MSDOS)
944
991
static IOBUF *
945
992
gawk_popen(cmd, rp)
946
993
char *cmd;
1160
1207
        if (strchr(file, ':') != strchr(file, ']')
1161
1208
         || strchr(file, '>') != strchr(file, '/'))
1162
1209
#else /*!VMS*/
1163
 
#ifdef MSDOS
 
1210
#if defined(MSDOS) || defined(OS2)
1164
1211
        if (strchr(file, '/') != strchr(file, '\\')
1165
1212
         || strchr(file, ':') != NULL)
1166
1213
#else
1169
1216
#endif  /*VMS*/
1170
1217
                return (devopen(file, "r"));
1171
1218
 
 
1219
#if defined(MSDOS) || defined(OS2)
 
1220
        _searchenv(file, "AWKPATH", trypath);
 
1221
        if (trypath[0] == '\0')
 
1222
                _searchenv(file, "PATH", trypath);
 
1223
        return (trypath[0] == '\0') ? 0 : devopen(trypath, "r");
 
1224
#else
1172
1225
        do {
1173
1226
                trypath[0] = '\0';
1174
1227
                /* this should take into account limits on size of trypath */
1180
1233
#ifdef VMS
1181
1234
                        if (strchr(":]>/", *(cp-1)) == NULL)
1182
1235
#else
1183
 
#ifdef MSDOS
 
1236
#if defined(MSDOS) || defined(OS2)
1184
1237
                        if (strchr(":\\/", *(cp-1)) == NULL)
1185
1238
#else
1186
1239
                        if (*(cp-1) != '/')
1204
1257
         * Therefore try to open the file in the current directory.
1205
1258
         */
1206
1259
        return (devopen(file, "r"));
 
1260
#endif
1207
1261
}