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