Go to the documentation of this file.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 #pragma ident "@(#) libf/fio/unitclose.c 92.2 06/18/99 18:38:26"
00039
00040 #include <errno.h>
00041 #include <stdlib.h>
00042 #include <stdio.h>
00043 #include <string.h>
00044 #include <unistd.h>
00045 #include <liberrno.h>
00046 #include <cray/nassert.h>
00047 #include <sys/param.h>
00048 #include <sys/stat.h>
00049 #include "fio.h"
00050
00051 extern short _f_abort;
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 int
00077 _unit_close(
00078 unit *cup,
00079 int cstat,
00080 FIOSPTR cssa)
00081 {
00082 register short delete;
00083 register int ret;
00084 register int errn;
00085 plock_t *lockp;
00086 struct ffsw fst;
00087 struct fiostate state;
00088 FIOSPTR css;
00089
00090 if (cup == NULL)
00091 return(0);
00092
00093 assert ( cstat == CLST_UNSPEC ||
00094 cstat == CLST_KEEP ||
00095 cstat == CLST_DELETE );
00096
00097 if (cssa != NULL)
00098 css = cssa;
00099 else {
00100 (void) memset(&state, 0, sizeof(state));
00101 css = &state;
00102 #ifdef _UNICOS
00103 css->f_rtbgn = _rtc();
00104 #endif
00105 }
00106
00107 cup->uend = BEFORE_ENDFILE;
00108 errn = 0;
00109 delete = (cstat == CLST_DELETE || cup->uscrtch) ? 1 : 0;
00110
00111 lockp = cup->auxlockp;
00112
00113 if (delete && !cup->utmpfil) {
00114 ret = _unit_scratch(cup);
00115 errn = errn ? errn : ret;
00116 }
00117
00118
00119
00120
00121 if (cup->pnonadv) {
00122 if (cup->uwrt) {
00123 ret = _nonadv_endrec(css, cup);
00124 errn = errn ? errn : ret;
00125 }
00126 cup->pnonadv = 0;
00127 }
00128
00129
00130
00131
00132 if (cup->useq && cup->uwrt && cup->utrunc) {
00133 ret = _unit_trunc(cup);
00134 errn = errn ? errn : ret;
00135 }
00136
00137
00138
00139
00140
00141 if ( ! ((cup->ufs == STD || cup->ufs == FS_TEXT) &&
00142 (cup->ufp.std == stdin ||
00143 cup->ufp.std == stdout ||
00144 cup->ufp.std == stderr)) ) {
00145
00146 switch (cup->ufs) {
00147
00148 case FS_FDC:
00149 if ( !_f_abort || !(cup->uflagword & FFC_NOCLOSE))
00150 if (__ffclose(cup->ufp.fdc, &fst) < 0)
00151 errn = errn ? errn : fst.sw_error;
00152 break;
00153
00154 case FS_TEXT:
00155 case STD:
00156
00157 if (fclose(cup->ufp.std) != 0)
00158 errn = errn ? errn : errno;
00159 break;
00160
00161 case FS_AUX:
00162 errn = errn ? errn : FEMIXAUX;
00163
00164 default:
00165 errn = errn ? errn : FEINTFST;
00166 }
00167 }
00168
00169
00170
00171
00172
00173 if (lockp != NULL)
00174 MEM_UNLOCK(lockp);
00175
00176
00177
00178
00179 FSTATS_POST(cup, T_CLOSE, css);
00180
00181 _ft_stclose(cup);
00182
00183
00184
00185
00186
00187 if (cup->ulinebuf != NULL)
00188 free(cup->ulinebuf);
00189
00190 if (cup->upfcstk != NULL)
00191 free(cup->upfcstk);
00192
00193 if (cup->urepdata != NULL)
00194 free(cup->urepdata);
00195
00196
00197
00198
00199 if (cup->ufnm != NULL)
00200 free(cup->ufnm);
00201
00202 if (cup->alfnm != NULL)
00203 free(cup->alfnm);
00204
00205
00206
00207
00208 cup->ufs = 0;
00209
00210 return(errn);
00211 }
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 int
00235 _unit_scratch(unit *cup)
00236 {
00237 register int ret;
00238
00239 cup->uscrtch = 1;
00240
00241 #ifdef FC_SCRATCH
00242 if (cup->ufs == FS_FDC) {
00243 int scrflags;
00244 struct ffsw ffst;
00245
00246 cup->unlinked = 0;
00247 cup->usnglink = 0;
00248
00249
00250
00251
00252
00253
00254
00255 ret = XRCALL(cup->ufp.fdc, fcntlrtn) cup->ufp.fdc,
00256 FC_SCRATCH, &scrflags, &ffst);
00257
00258 if (ret == 0) {
00259 cup->unlinked = (scrflags & SCR_UNLINKED) ? 1 : 0;
00260 cup->usnglink = (scrflags & SCR_SINGLELINK) ? 1 : 0;
00261 return(0);
00262 }
00263
00264
00265 }
00266 #endif
00267
00268 cup->usnglink = 0;
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 if (cup->alfnm != NULL && cup->usysfd >= 0) {
00279 struct stat sbuf;
00280
00281 ret = stat(cup->alfnm, &sbuf);
00282
00283 if (ret != -1) {
00284
00285
00286
00287
00288
00289
00290 if (sbuf.st_ino != cup->uinode ||
00291 sbuf.st_dev != cup->udevice)
00292 return(FENODELT);
00293 else {
00294
00295 ret = unlink(cup->alfnm);
00296
00297 if (ret == -1 && errno != ENOENT)
00298 return(errno);
00299 }
00300 }
00301
00302 cup->unlinked = 1;
00303 }
00304
00305 return(0);
00306 }