00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #include <sys/types.h>
00048 #include <mutex.h>
00049 #include <sys/stat.h>
00050 #include <cmplrs/fio.h>
00051 #include "err.h"
00052 #include "open.h"
00053 #include "fio_direct_io.h"
00054 #include "util.h"
00055 #include "close.h"
00056 #include <stdlib.h>
00057 #include <limits.h>
00058 #include <errno.h>
00059 #include <string.h>
00060 #include <unistd.h>
00061 #include <stdio.h>
00062 #include <cmplrs/f_errno.h>
00063
00064 #ifndef ultrix
00065
00066 #include "isam.h"
00067 #endif
00068
00069 #define ASSOCV 12
00070
00071 #include "iomode.h"
00072 #include "vmsflags.h"
00073 #include "bcompat.h"
00074 #include "idxio.h"
00075 #include "uio.h"
00076
00077 unsigned long io_lock;
00078
00079 static int
00080 #if 11
00081 f_open_com (olist64 *a, ftnint *mask, char **mode_, char **buf_, unit **fu)
00082 #else
00083 f_open_com (olist *a, ftnint *mask, char **mode_, char **buf_, unit **fu)
00084 #endif
00085 {
00086 unit *b;
00087 ino_t inod;
00088 int n, org;
00089 char *mode = "r";
00090 char *abuf, c, *cbuf, errstr[80];
00091 char buf[PATH_MAX];
00092 char ubuf[PATH_MAX];
00093 unsigned int need;
00094 #if 00
00095 cllist64 x;
00096 #else
00097 cllist x;
00098 #endif
00099 struct stat sbuf;
00100 static char seed[] = "aa";
00101 char *q = seed;
00102 char ch;
00103 unit *dupunit;
00104 int dupopen;
00105 int istty = 0;
00106
00107
00108
00109
00110
00111 struct stat stat_struct;
00112 unit *ftnunit;
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 if (a->ofnm)
00125 istty = !strncmp ("/dev/tty", a->ofnm, 8);
00126 need = a->odfnm ? a->odfnmlen : 0;
00127 need += a->ofnm ? a->ofnmlen : 0;
00128 need += 40;
00129 if ((*fu = ftnunit = b = map_luno (a->ounit)) == NULL)
00130 err(a->oerr, 101, "open");
00131 while (fu != &f77curunit && test_and_set( &ftnunit->lock_unit, 1L )) {
00132 sginap(0);
00133 }
00134
00135
00136 while (test_and_set( &io_lock, 1L ))
00137 sginap(0);
00138 * buf_ = buf;
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 if (!istty) {
00167 if (dupopen = f_duped (a, ftnunit, &dupunit))
00168 if (!a->oshared)
00169 return(dupopen);
00170 }
00171 else
00172 dupopen = 0;
00173
00174 if (a->odfnm) {
00175 g_char (a->odfnm, a->odfnmlen, buf);
00176 abuf = &buf[strlen(buf)];
00177 } else
00178 abuf = buf;
00179 if (b->uconn > 0 && (!a->osta || up_low (*a->osta) != 's')) {
00180 if (a->ofnm == 0) {
00181 same:if (a->oblnk != 0)
00182 b->ublnk = up_low (*a->oblnk) == 'z' ? 1 : 0;
00183
00184
00185
00186 if ((b->ufd == stdin || b->ufd == stdout || b->ufd == stderr)
00187 && b->ufnm == NULL)
00188 dupopen = 1;
00189 else
00190 return (0);
00191 }
00192 if (a->ofnm) {
00193 g_char (a->ofnm, a->ofnmlen, abuf);
00194 if (b->uacc == KEYED)
00195 mkidxname (buf, buf);
00196 f77inode (buf, &inod);
00197 if ((inod == b->uinode) && inod)
00198 goto same;
00199 buf[a->ofnmlen] = '\0';
00200 }
00201 x.cunit = a->ounit;
00202 x.csta = 0;
00203 x.cerr = a->oerr;
00204
00205
00206
00207
00208
00209
00210 if (b->ufd == stdin || b->ufd == stdout || b->ufd == stderr) {
00211 if (!dupopen) {
00212 b->uconn = 0;
00213 b->ufd = NULL;
00214 }
00215 #if 00
00216 #define NAMEf_clos f_clos64
00217 #else
00218 #define NAMEf_clos f_clos
00219 #endif
00220 } else if ((n = NAMEf_clos (&x)) != 0)
00221 return (n);
00222 b->luno = a->ounit;
00223 #undef NAMEf_clos
00224 }
00225
00226 org = a->oorg ? up_low (*a->oorg) : 0;
00227 b->umask = *mask;
00228 if (a->oacc == 0)
00229 switch (org) {
00230 case 'r':
00231 b->uacc = DIRECT;
00232 break;
00233 case 'i':
00234 if (dupopen)
00235 err(a->oerr, 186, "open")
00236 b->uacc = KEYED;
00237 break;
00238 default:
00239 b->uacc = SEQUENTIAL;
00240 }
00241 else
00242 switch (up_low (*a->oacc)) {
00243 case 'd':
00244 b->uacc = DIRECT;
00245 if (org == 'i')
00246 err(a->oerr, 149, "open")
00247 break;
00248 case 'k':
00249 b->uacc = KEYED;
00250 if (org == 's')
00251 err(a->oerr, 150, "open")
00252 if (org == 'r')
00253 err(a->oerr, 151, "open")
00254 break;
00255 case 'a':
00256 b->uacc = APPEND;
00257 if (org == 'i')
00258 err(a->oerr, 152, "open")
00259 break;
00260
00261
00262
00263
00264
00265
00266
00267
00268 case 's':
00269 b->uacc = org == 'i' ? KEYED : SEQUENTIAL;
00270 break;
00271 default:
00272 err(a->oerr, 130, "open");
00273 }
00274 if (a->oassocv && b->uacc == DIRECT)
00275 set_var ((ftnintu *)(b->uassocv = a->oassocv), b->umask, ASSOCV, 1);
00276 else
00277 b->uassocv = NULL;
00278 if (a->omaxrec && b->uacc == DIRECT)
00279 b->umaxrec = a->omaxrec;
00280 else
00281 b->umaxrec = 0;
00282 if (cbuf = a->odisp)
00283 switch (up_low (*cbuf++)) {
00284 case 'd':
00285 b->udisp = DELETE;
00286 break;
00287 case 'p':
00288 b->udisp = PRINT;
00289 goto checkdelete;
00290 case 's':
00291 if (up_low (*cbuf) == 'a')
00292 goto keep;
00293 b->udisp = SUBMIT;
00294 checkdelete:
00295 while (c = (*cbuf++))
00296 if ((c == '/') && (c = (*cbuf)) && (up_low (c) == 'd'))
00297 b->udisp |= DELETE;
00298 break;
00299 keep:
00300 default:
00301 b->udisp = KEEP;
00302 }
00303 else
00304 b->udisp = KEEP;
00305
00306 b->ushared = a->oshared;
00307 b->ureadonly = a->oreadonly;
00308 if (a->oblnk && up_low (*a->oblnk) == 'z')
00309 b->ublnk = 1;
00310 else
00311 b->ublnk = 0;
00312 #ifdef I90
00313 b->uaction = b->ureadonly ? READONLY : READWRITE;
00314 b->unpad = 0;
00315 b->udelim = DELIM_NONE;
00316 #endif
00317 b->url = a->orl;
00318 if (a->ofm == 0) {
00319 if (b->uacc == DIRECT || b->uacc == KEYED) {
00320 b->ufmt = 0;
00321 if (!f77vms_flag_[OLD_RL])
00322 b->url *= sizeof (int);
00323 } else
00324 b->ufmt = 1;
00325 } else if (up_low (*a->ofm) == 'f')
00326 b->ufmt = 1;
00327 else if (up_low (*a->ofm) == 'b')
00328 b->ufmt = 2;
00329 else if (up_low (*a->ofm) == 's') {
00330
00331 b->ufmt = 0;
00332 b->url = 1;
00333 b->uacc = DIRECT;
00334 } else {
00335 b->ufmt = 0;
00336 if (!f77vms_flag_[OLD_RL])
00337 b->url *= sizeof (int);
00338
00339
00340
00341
00342 check_buflen( b, 1024 );
00343 }
00344 if (a->orectype)
00345 switch (up_low (*a->orectype)) {
00346 case 'f':
00347 if (b->uacc != DIRECT && b->uacc != KEYED)
00348 err(a->oerr, 156, "open")
00349 break;
00350 case 'v':
00351 if (b->uacc == DIRECT || b->uacc == KEYED ||
00352 b->ufmt == 1)
00353 err(a->oerr, 157, "open")
00354 break;
00355 case 's':
00356 if (b->uacc == DIRECT || b->uacc == KEYED ||
00357 b->ufmt != 1)
00358 err(a->oerr, 158, "open")
00359 default:
00360 break;
00361 }
00362 if (a->occ == 0)
00363 b->ucc = (char) (b->ufmt ? ((b->luno == 6 && f77vms_flag_[VMS_CC]) ?
00364 CC_FORTRAN : CC_LIST) : CC_NONE);
00365 else
00366 switch (up_low (*a->occ)) {
00367 case 'l':
00368 b->ucc = CC_LIST;
00369 break;
00370 case 'f':
00371 b->ucc = CC_FORTRAN;
00372 b->ucchar = '\0';
00373 break;
00374 case 'n':
00375 b->ucc = CC_NONE;
00376 break;
00377 default:
00378 b->ucc = (char) (b->ufmt ? ((b->luno == 6 && f77vms_flag_[VMS_CC]) ?
00379 CC_FORTRAN : CC_LIST) : CC_NONE);
00380 }
00381
00382 if (!b->ufmt && b->ucc != CC_NONE)
00383 err(a->oerr, 162, "open");
00384
00385 if (a->ofnm == 0)
00386 #ifdef SIZEOF_LUNO_IS_64
00387 (void) sprintf (abuf, "fort.%lld", a->ounit);
00388 #else
00389 (void) sprintf (abuf, "fort.%d", a->ounit);
00390 #endif
00391 else
00392 g_char (a->ofnm, a->ofnmlen, abuf);
00393
00394 {
00395 #define OPEN "open("
00396 #define RPAREN ")"
00397 #define ELLIPSES "...)"
00398 strcpy (errstr, OPEN);
00399 strncat (errstr, buf, (sizeof errstr) - (sizeof OPEN));
00400 if (strlen (errstr) + (sizeof RPAREN) < sizeof errstr)
00401 strcat (errstr, RPAREN);
00402 else
00403 strcat (errstr + (sizeof errstr) - (sizeof ELLIPSES), ELLIPSES);
00404 }
00405
00406
00407
00408 sbuf.st_mode = 0;
00409 if (stat (buf, &sbuf) >= 0 && (sbuf.st_mode & S_IFIFO))
00410 {
00411 mode = "a+";
00412 b->uwrt = WR_READY;
00413 }
00414 if (sbuf.st_mode & S_IFDIR) {
00415
00416 errno = F_EROPENDIR;
00417 err(a->oerr, F_EROPENDIR, errstr);
00418 }
00419 if (a->osta == 0)
00420 goto osta_unknown;
00421 switch (up_low (*a->osta)) {
00422 case 'o':
00423 if (absent (buf, b->uacc)) {
00424 err(a->oerr, errno, errstr)
00425 }
00426 osta_unknown:
00427 default:
00428 b->uscrtch = 0;
00429
00430
00431 if (absent (buf, b->uacc)) {
00432 if (a->oreadonly)
00433 err(a->oerr, 160, errstr);
00434
00435
00436 mode = "w";
00437 }
00438
00439
00440
00441
00442
00443 if (dupopen) {
00444
00445
00446
00447
00448
00449 if (b->uacc == DIRECT && b->ufmt == 0) {
00450 mode = (b->ufd == stdin) ? "r" : "w";
00451 b->ufd = (FILE *) fileno( b->ufd );
00452 if(_fio_du_open( buf, mode, 1, (int) b->ufd ) < 0)
00453 err(a->oerr, errno, buf);
00454 }
00455 return( 0 );
00456 }
00457
00458
00459
00460
00461 if (istty)
00462 mode = "r+";
00463 done:
00464 b->ufnm = (char *) malloc ((unsigned int) (strlen (buf) + 1));
00465 if (b->ufnm == NULL)
00466 err(a->oerr, 113, "no space");
00467 (void) strcpy (b->ufnm, buf);
00468 _I90_uppercase(buf, ubuf);
00469 b->uend = 0;
00470
00471
00472
00473 if (b->uacc == KEYED) {
00474 if (b->unkeys = a->onkeys)
00475 b->ukeys = (Keyspec *) malloc (sizeof (Keyspec) * a->onkeys);
00476 for (n = 0; n < a->onkeys; n++) {
00477 b->ukeys[n].e1 = a->okeys[n].e1;
00478 b->ukeys[n].e2 = a->okeys[n].e2;
00479 b->ukeys[n].dt = a->okeys[n].dt;
00480 }
00481 b->useek = b->uconn = 1;
00482 *mode_ = mode;
00483 return (0);
00484 } else if (!strcmp (ubuf, "SYS$INPUT")) {
00485
00486
00487
00488
00489
00490
00491 b->ufd = stdin;
00492 b->uconn = 1;
00493 b->uwrt = 0;
00494 } else if (!strcmp (ubuf, "SYS$OUTPUT")) {
00495 b->ufd = stdout;
00496 b->uconn = 1;
00497 b->uwrt = WR_READY;
00498 } else if (!strcmp (ubuf, "SYS$ERROR")) {
00499 b->ufd = stderr;
00500 b->uconn = 1;
00501 b->uwrt = WR_READY;
00502 } else if ((b->uacc == DIRECT) && (b->ufmt == 0)) {
00503
00504
00505
00506 if (b->url == 0) {
00507
00508 err(a->oerr, 153, "open");
00509 }
00510 if (!b->ureadonly)
00511 b->ufd = (FILE *) _fio_du_open (buf, "r+", 0, 0);
00512 if (b->ureadonly || (int)b->ufd == -1) {
00513 b->ufd =(FILE*)_fio_du_open (buf, "r", 0, 0);
00514
00515
00516
00517
00518
00519 b->ureadonly = 1;
00520 }
00521 if ((int)b->ufd == -1) {
00522 if (b->ureadonly)
00523 err(a->oerr, 160, errstr);
00524 b->ufd =(FILE*)_fio_du_open (buf, "w", 0, 0);
00525 }
00526
00527 if ((int) b->ufd < 0) {
00528 err(a->oerr, errno, buf);
00529 }
00530 b->uconn = 1;
00531 b->uwrt = WR_READY;
00532
00533
00534
00535
00536
00537
00538
00539 b->uistty = isatty ((int) b->ufd);
00540 if (sbuf.st_mode & S_IFIFO)
00541 b->uistty = 2;
00542 if (b->uistty && mode[1] == '\0') {
00543 if (-1 == _fio_du_close ((int) b->ufd))
00544 return (1);
00545 b->ufd = (FILE *) _fio_du_open (buf, "r+", 0, 0);
00546 if ((int) b->ufd == -1)
00547 return (1);
00548 }
00549 if (b->uacc == APPEND)
00550 lseek ((int) b->ufd, 0L, SEEK_SET);
00551
00552 a->ofnmlen = (int) strlen (buf);
00553
00554
00555 (void) fstat ((int) b->ufd, &stat_struct);
00556 if (stat_struct.st_nlink > 0 && !isatty ((int) b->ufd)) {
00557 b->useek = 1;
00558 } else {
00559 b->useek = 0;
00560 }
00561
00562 if (f77inode (buf, &b->uinode) == -1)
00563 err(a->oerr, 108, "open");
00564 return (0);
00565 } else {
00566 if (!dupopen) {
00567 b->ufd = fopen (buf, mode);
00568 }
00569 else {
00570 int dupfd, ufd;
00571 ufd = ((b->uacc == DIRECT) && (b->ufmt == 0)) ? (int) dupunit->ufd : fileno( dupunit->ufd );
00572 dupfd = dup( ufd );
00573 if (dupfd < 0)
00574 err(a->oerr, errno, buf)
00575 b->ufd = fdopen( dupfd, mode );
00576 }
00577 if (b->ufd == NULL) {
00578 err(a->oerr, errno, buf)
00579 } else {
00580 if (b->ushared && b->url)
00581 setvbuf( b->ufd, NULL, _IOFBF, (size_t) b->url);
00582 b->uconn = 1;
00583 if (!(sbuf.st_mode & S_IFIFO))
00584 b->uwrt = mode[1] == '+' ? WR_READY : (mode[0] == 'w') ? WR_ONLY : RD_ONLY;
00585 }
00586 }
00587
00588 if ((b->uacc == DIRECT) && (b->url == 0)) {
00589 err(a->oerr, 153, "open");
00590 }
00591 if (b->ufd != stdin && b->ufd != stdout && b->ufd != stderr
00592 && (b->uacc != DIRECT)) {
00593 b->uistty = isatty (fileno (b->ufd));
00594 if (sbuf.st_mode & S_IFIFO)
00595 b->uistty = 2;
00596 if (b->uistty && mode[1] == '\0') {
00597 b->ufd = freopen (buf, "r+", b->ufd);
00598 if (!b->ufd)
00599 return (1);
00600 b->uwrt = WR_READY;
00601 }
00602 if (b->uacc == APPEND)
00603 fseek (b->ufd, 0L, 2);
00604 }
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622 a->ofnmlen = (int) strlen (buf);
00623 if (b->uacc != KEYED)
00624 b->useek = f77canseek (b->ufd);
00625 else
00626 mkidxname (buf, buf);
00627
00628 if (f77inode (buf, &b->uinode) == -1)
00629 err(a->oerr, 108, "open");
00630 buf[a->ofnmlen] = '\0';
00631
00632
00633
00634 return (0);
00635
00636 case 's':
00637 if (a->oreadonly)
00638 err(a->oerr, 160, "open");
00639 b->uscrtch = 1;
00640
00641
00642 ch = buf[0];
00643
00644 newname:
00645 (void) strcpy (abuf, "tmp.FxxXXXXXX");
00646 abuf[5] = *seed;
00647 abuf[6] = *(seed + 1);
00648
00649
00650 (void) mktemp (buf);
00651 if (!buf[0]) {
00652
00653
00654 buf[0] = ch;
00655 if (++*q > 'z') {
00656 q++;
00657 if (*q == '\0')
00658
00659
00660
00661 seed[0] = 'a';
00662 seed[1] = 'a';
00663 q = seed;
00664 }
00665 goto newname;
00666 }
00667 mode = "w+";
00668 goto done;
00669 case 'n':
00670 if (a->oreadonly)
00671 err(a->oerr, 160, "open");
00672 b->uscrtch = 0;
00673
00674 if (absent (buf, b->uacc)) {
00675
00676
00677 mode = "w+";
00678 } else {
00679
00680 err(a->oerr, 126, buf)
00681 }
00682 goto done;
00683 }
00684 }
00685
00686 int
00687 f_open0 (olist *a, int *mask)
00688 {
00689
00690 char *mode;
00691 char *buf;
00692 int i;
00693 unit *ftnunit;
00694 #if 11
00695 olist64 dst;
00696 get_olist64(&dst, a);
00697 #define WORK_ARG (&dst)
00698 #else
00699 #define WORK_ARG a
00700 #endif
00701
00702 i = f_open_com(WORK_ARG, mask, &mode, &buf, &ftnunit);
00703 io_lock = 0;
00704 if (ftnunit->uacc == KEYED) {
00705 if (i) {
00706 ftnunit->lock_unit = 0;
00707 return (i);
00708 }
00709 i = idxopen (ftnunit, buf, *mode == 'w', WORK_ARG->oerr);
00710 ftnunit->lock_unit = 0;
00711 return (i);
00712 }
00713 ftnunit->lock_unit = 0;
00714 return (i);
00715 #undef WORK_ARG
00716 }
00717
00718 int
00719 f_open1 (olist *a, int *mask)
00720 {
00721 char *buf;
00722 char *mode;
00723 int n;
00724
00725 #if 11
00726 olist64 dst;
00727 get_olist64(&dst, a);
00728 #define WORK_ARG (&dst)
00729 #else
00730 #define WORK_ARG a
00731 #endif
00732 n = f_open_com (WORK_ARG, mask, &mode, &buf, &f77curunit);
00733 io_lock = 0;
00734 return (n);
00735 #undef WORK_ARG
00736 }
00737
00738 #if 11
00739
00740
00741 int
00742 f_open064 (olist64 *a, int *mask)
00743 {
00744
00745 char *mode;
00746 char *buf;
00747 int i;
00748 unit *ftnunit;
00749
00750 i = f_open_com(a, mask, &mode, &buf, &ftnunit);
00751 io_lock = 0;
00752 if (ftnunit->uacc == KEYED) {
00753 if (i) {
00754 ftnunit->lock_unit = 0;
00755 return (i);
00756 }
00757 i = idxopen (ftnunit, buf, *mode == 'w', a->oerr);
00758 ftnunit->lock_unit = 0;
00759 return (i);
00760 }
00761 ftnunit->lock_unit = 0;
00762 return (i);
00763 }
00764
00765 #pragma weak f_open064_mp = f_open064
00766
00767 #endif
00768
00769
00770
00771 int
00772 fk_open (int seq, int fmt, ftnint n)
00773 {
00774 char nbuf[10];
00775 int i = 0;
00776 static olist a_init ={
00777 1, 0, NULL, 0, NULL, NULL, NULL, 0, NULL, NULL, NULL,
00778 0, 0, 0, NULL, NULL, NULL, 0, NULL, 0, NULL,
00779 NULL, 0, 0, 0
00780 #ifdef I90
00781 ,NULL,0,NULL,0,NULL,0,NULL,0
00782 #endif
00783 };
00784
00785 olist a = a_init;
00786
00787 #ifdef SIZEOF_LUNO_IS_64
00788 (void) sprintf (nbuf, "fort.%lld", n);
00789 #else
00790 (void) sprintf (nbuf, "fort.%d", n);
00791 #endif
00792 a.ounit = n;
00793 a.ofnm = nbuf;
00794 a.ofnmlen = (int) strlen (nbuf);
00795 a.oacc = seq == SEQ ? "s" : "d";
00796 a.oorg = seq == SEQ ? "s" : seq == DIR ? "r" : "i";
00797 a.ofm = fmt == FMT ? "f" : "u";
00798 a.orl = seq == DIR ? 1 : 0;
00799
00800
00801
00802
00803
00804 return (f_open1 (&a, &i));
00805 }
00806
00807
00808
00809
00810
00811
00812 int
00813 f_df64x(olist64 *a, XINT xmask)
00814 {
00815 int mask = xmask;
00816 int rlflag = f77vms_flag_[OLD_RL];
00817 int n;
00818
00819 a->oacc = "d";
00820 a->oorg = "r";
00821 a->ofm = "u";
00822 a->occ = "n";
00823 a->orl = a->orl << 1;
00824
00825 f77vms_flag_[OLD_RL] = 1;
00826 n = f_open064 (a, &mask);
00827 f77vms_flag_[OLD_RL] = (unsigned short) rlflag;
00828 return ( n );
00829 }
00830
00831
00832 int
00833 f_dfnf (struct dfnf_struct *b)
00834 {
00835 static ftnint i = 0;
00836 return(f_dfnf1(b, &i));
00837 }
00838
00839 int
00840 f_dfnf1 (struct dfnf_struct *b, ftnint *mask)
00841 {
00842 char nbuf[10];
00843 olist a;
00844 int n, rlflag;
00845
00846 #if SIZEOF_LUNO_IS_64
00847 (void) sprintf (nbuf, "fort.%lld", b->unit);
00848 #else
00849 (void) sprintf (nbuf, "fort.%d", b->unit);
00850 #endif
00851 a.oerr = 0;
00852 a.ounit = b->unit;
00853 a.ofnm = nbuf;
00854 a.ofnmlen = (int) strlen (nbuf);
00855 a.osta = NULL;
00856 a.oacc = "d";
00857 a.oorg = "r";
00858 a.ofm = "u";
00859 a.occ = "n";
00860 a.orl = b->recl << 1;
00861 a.oblnk = NULL;
00862 a.oassocv = b->assocv;
00863 a.odisp = NULL;
00864 a.omaxrec = b->maxrec;
00865 a.orectype = NULL;
00866 a.odfnm = NULL;
00867
00868
00869
00870
00871
00872 a.oreadonly = 0;
00873
00874
00875 rlflag = f77vms_flag_[OLD_RL];
00876 f77vms_flag_[OLD_RL] = 1;
00877 n = f_open1 (&a, mask);
00878 f77vms_flag_[OLD_RL] = (unsigned short) rlflag;
00879 return(n);
00880 }
00881
00882
00883 void
00884 flush_connected_units ()
00885 {
00886 register int i;
00887 register unit *a;
00888
00889 for (i = 0, a = f77units; i < space_assigned; i++, a++)
00890 if (a->uconn > 0)
00891 if ((a->uacc != DIRECT) || (a->url == 0)) {
00892 (void) fflush (a->ufd);
00893 } else {
00894 (void) _fio_du_flush((int) a->ufd);
00895 }
00896 }
00897
00898 int absent(char *name, int acc)
00899 {
00900 int l, r;
00901 char ubuf[PATH_MAX];
00902
00903
00904
00905
00906
00907
00908
00909
00910 if (name[3] == '$' && _I90_uppercase(name, ubuf) &&
00911 (!strcmp (ubuf, "SYS$INPUT") || !strcmp (ubuf, "SYS$OUTPUT") ||
00912 !strcmp (ubuf, "SYS$ERROR")))
00913 return (0);
00914 if (acc == KEYED) {
00915 l = (int) strlen (name);
00916 mkidxname (name, name);
00917 if (r = access (name, 0))
00918 goto ret;
00919 name[l] = '\0';
00920 mkdatname (name, name);
00921 if (r = access (name, 0))
00922 goto ret;
00923 #ifndef SYSV
00924 name[l] = '\0';
00925 mklokname (name, name);
00926 r = access (name, 0);
00927 #endif
00928 ret: name[l] = '\0';
00929 return r;
00930 } else
00931 return access (name, 0);
00932 }
00933
00934 int
00935 inc_var (ftnintu *var, ftnint mask, int shift)
00936 {
00937 if (var)
00938 switch (((mask) >> shift) & 3) {
00939 case 1:
00940 (var->byte)++;
00941 break;
00942 case 2:
00943 (var->word++);
00944 break;
00945 default:
00946 (var->longword)++;
00947 }
00948 return(0);
00949 }
00950
00951 int
00952 set_var (ftnintu *var, ftnint mask, int shift, long long value)
00953 {
00954 switch (((mask) >> shift) & 3) {
00955 case 1:
00956 var->byte = (char) value;
00957 break;
00958 case 2:
00959 var->word = (short) value;
00960 break;
00961 case 3:
00962 var->longlongword = value;
00963 break;
00964 default:
00965 var->longword = (int) value;
00966 }
00967 return(0);
00968 }
00969
00970
00971 void
00972 f_dconn (luno)
00973 ftnint luno;
00974 {
00975 register int i;
00976 register unit *a;
00977
00978 for (i = 0, a = f77units; i < mxunit; i++, a++) {
00979 if (a->luno == luno) {
00980 a->ufd = 0;
00981 a->uconn = 0;
00982 }
00983 }
00984 }
00985
00986 int
00987 #if 11
00988 f_duped (olist64 *a, unit *ftnunit, unit **dupunit)
00989 #else
00990 f_duped (olist *a, unit *ftnunit, unit **dupunit)
00991 #endif
00992 {
00993 register int i;
00994 register unit *u;
00995 int nlen;
00996
00997 *dupunit = NULL;
00998 if (!a->ofnm)
00999 return(0);
01000
01001 for (i = 0, u = f77units; i < mxunit; i++, u++) {
01002 if (u->uconn > 0 && u->luno != a->ounit &&
01003 u->ufnm && (nlen = strlen(u->ufnm)) == a->ofnmlen
01004 && !strncmp (u->ufnm, a->ofnm, nlen)) {
01005 *dupunit = u;
01006 err(a->oerr, 109, "open")
01007 }
01008 }
01009 return(0);
01010 }
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020 int
01021 f_open064x (olist64 *a, XINT xmask)
01022 {
01023 int mask = xmask;
01024 return ( f_open064 ( a, &mask ) );
01025 }
01026
01027 #pragma weak f_open064x_mp = f_open064x