getfile.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 240 行
C
240 行
/* * RFA - Remote File Access * * Access and Management for a partial file system tree that exists * at two sites either as master files or slave files * * getfile.c - get file content from remote * * Contributed by Oliver Wenzel, GMD Berlin, 1990 * * $Header: /xtel/isode/isode/others/rfa/RCS/getfile.c,v 9.0 1992/06/16 12:47:25 isode Rel $ * * $Log: getfile.c,v $ * Revision 9.0 1992/06/16 12:47:25 isode * Release 8.0 * */#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/others/rfa/RCS/getfile.c,v 9.0 1992/06/16 12:47:25 isode Rel $";#endif/* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */#include <stdio.h>#include <ctype.h>#include <pwd.h>#include <grp.h>#include <sys/types.h>#include <sys/stat.h>#include "general.h"#include "logger.h"#include "RFA-ops.h"#include "RFA-types.h"#include "rfa.h"#include "rfainfo.h"#include "tailor.h"extern FILE *out, *err;/*--------------------------------------------------------------*//* getfile_aux *//*--------------------------------------------------------------*/int getfile_aux(fn, rfa, rmode)char *fn;struct RfaInfo *rfa;int *rmode;{ struct type_RFA_GetFileDataRes *gfr; struct type_RFA_GetFileDataArg *gfa; int num, res, rc; time_t ts, te; if (getConnection() != OK) return NOTOK_REMOTE_ERROR; if ((gfa = (struct type_RFA_GetFileDataArg *) malloc(sizeof(struct type_RFA_GetFileDataArg))) == NULL) { fprintf(err,"*** local error : no memory ***\n"); return NOTOK_LOCAL_ERROR; } gfa->filename = str2qb(fn, strlen(fn), 1); gfa->slaveVersion = rfa->ri_modTime; fprintf(err,"requesting from master..."); fflush(err); time(&ts); if (invoke(operation_RFA_getFileData, (caddr_t) gfa, &gfr, &res) ==NOTOK) { fprintf(err, "\n\t*** remote operation invocation failed ***\n"); free_RFA_GetFileDataArg(gfa); return NOTOK_REMOTE_ERROR; } free_RFA_GetFileDataArg(gfa); if (res != RY_RESULT) { fprintf(err, "failed\n"); printError(res, (caddr_t)gfr, &rc); return rc; } /*-- set file characteristics in rfa --*/ rfa->ri_mode = gfr->fileinfo->mode; rfa->ri_modTime = gfr->fileinfo->modTime; rfa->ri_size = gfr->fileinfo->size; rfa->ri_owner = qb2str(gfr->fileinfo->user); rfa->ri_group = qb2str(gfr->fileinfo->group); if (IS_MASTER(gfr->fileinfo->status)) { SET_STATUS(rfa->ri_status, RI_SLAVE); SET_TRANSFER(rfa->ri_status, RI_TRANSFER(gfr->fileinfo->status)); rfa->ri_mode &= ~0222; } else { SET_STATUS(rfa->ri_status, RI_UNREGISTERED); SET_TRANSFER(rfa->ri_status, default_transfer); } /*-- create the file --*/ if ((rc = instfile(fn, gfr, &num)) != OK) { free_RFA_GetFileDataRes(gfr); return rc; } (void)time(&te); te = (te - ts) ? te - ts : 1L; switch (gfr->mode) { case int_RFA_mode_compressed: fprintf(err, "transfered compressed\n\t(%2.1f Kbytes in %d sec, ", (float)(gfr->fileinfo->size) / 1024, te); fprintf(err, "%2.1f Kbytes/s, %2.1f%% compression)\n", (float)(gfr->fileinfo->size) / (float)te / 1024, (float)((gfr->fileinfo->size - num) * 100) / (float)(gfr->fileinfo->size + 1)); break; case int_RFA_mode_actual: fprintf(err, "local file up-to-date\n"); break; case int_RFA_mode_zero: fprintf(err, "file is empty\n"); break; default: fprintf(err,"transfered\n\t(%2.1f Kbytes in %d sec, %2.1f Kbytes/s)\n", (float)(gfr->fileinfo->size) / 1024, te, (float)(gfr->fileinfo->size) / (float)te / 1024 ); } /*--- set file access mode bits ---*/ if (changeFileMode(fn, rfa->ri_mode, "set permissions") != OK) fprintf(err, "\t*** %s ***\n", rfaErrStr); if (changeFileOwner(fn, rfa) != OK) fprintf(err, "\t*** %s ***\n", rfaErrStr); *rmode = gfr->fileinfo->mode; free_RFA_GetFileDataRes(gfr); return OK;}/*--------------------------------------------------------------* * instfile - install file *--------------------------------------------------------------*/int instfile(fn, gfr, nump) char *fn; struct type_RFA_GetFileDataRes *gfr; int *nump;{ time_t tt[2]; char fnbak[512]; char fnz[512]; char buf[BUFSIZ]; struct qbuf *qp; FILE *f; struct stat st; if (gfr->mode == int_RFA_mode_actual) return OK; /*--- save old file ---*/ sprintf(fnbak, "%s.bak", makeFN(fn)); rename(makeFN(fn), fnbak); /*--- open new file ---*/ if ((f = fopen(makeFN(fn), "w")) == NULL) { fprintf(err, "failed\n\t*** local error : open of %s failed ***\n", fn); unlink (makeFN(fn)); rename(fnbak, makeFN(fn)); return NOTOK_LOCAL_ERROR; } /*--- write new file with data in result ---*/ if (gfr->mode != int_RFA_mode_zero) { *nump = 0; for (qp = gfr->data->qb_forw; qp != gfr->data; qp = qp->qb_forw) { *nump += qp->qb_len; if (fwrite(qp->qb_data, 1, qp->qb_len, f) != qp->qb_len) { fprintf(err, "failed\n\t*** local error : write of %s failed ***\n", fn); fclose(f); unlink (makeFN(fn)); rename(fnbak, makeFN(fn)); return NOTOK_LOCAL_ERROR; } } } fclose(f); /*--- see if new file is compressed ---*/ if (gfr->mode == int_RFA_mode_compressed) { sprintf(fnz, "%s.Z", makeFN(fn)); rename (makeFN(fn), fnz); sprintf(buf, "exec uncompress %s", fnz); if (system(buf) != 0) { fprintf(err, "failed\n\t*** local error : can't uncompress %s ***\n" , fn); unlink (fnz); rename(fnbak, makeFN(fn)); return NOTOK_LOCAL_ERROR; } } /*--- check size of transfered file ---*/ if (stat(makeFN(fn),&st) == -1) { fprintf(err, "failed\n\t*** local error : can't stat transfered file ***\n"); unlink (makeFN(fn)); rename(fnbak, makeFN(fn)); return NOTOK_LOCAL_ERROR; } if (st.st_size != gfr->fileinfo->size) { fprintf(err, "failed\n\t*** wrong size after transfer ***\n"); unlink (makeFN(fn)); rename(fnbak, makeFN(fn)); return NOTOK_LOCAL_ERROR; } /*--- set time of file ---*/ tt[0] = gfr->fileinfo->modTime; tt[1] = gfr->fileinfo->modTime; if (utime(makeFN(fn), tt) == -1) { fprintf(err, "failed\n\t*** local error : can't set time of %s ***\n", fn); unlink (makeFN(fn)); rename(fnbak, makeFN(fn)); return NOTOK_LOCAL_ERROR; } /*--- remove old file ---*/ if(!backup) unlink(fnbak); return OK;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?