00001
00002
00003 #include "structFileDriver.h"
00004 #include "subStructFileGet.h"
00005 #include "miscServerFunct.h"
00006 #include "dataObjOpr.h"
00007
00008 int
00009 rsSubStructFileGet (rsComm_t *rsComm, subFile_t *subFile,
00010 bytesBuf_t *subFileGetOutBBuf)
00011 {
00012 rodsServerHost_t *rodsServerHost;
00013 int remoteFlag;
00014 int status;
00015
00016 remoteFlag = resolveHost (&subFile->addr, &rodsServerHost);
00017
00018 if (remoteFlag == LOCAL_HOST) {
00019 status = _rsSubStructFileGet (rsComm, subFile, subFileGetOutBBuf);
00020 } else if (remoteFlag == REMOTE_HOST) {
00021 status = remoteSubStructFileGet (rsComm, subFile, subFileGetOutBBuf,
00022 rodsServerHost);
00023 } else {
00024 if (remoteFlag < 0) {
00025 return (remoteFlag);
00026 } else {
00027 rodsLog (LOG_NOTICE,
00028 "rsSubStructFileGet: resolveHost returned unrecognized value %d",
00029 remoteFlag);
00030 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00031 }
00032 }
00033
00034 return (status);
00035 }
00036
00037 int
00038 remoteSubStructFileGet (rsComm_t *rsComm, subFile_t *subFile,
00039 bytesBuf_t *subFileGetOutBBuf, rodsServerHost_t *rodsServerHost)
00040 {
00041 int status;
00042
00043 if (rodsServerHost == NULL) {
00044 rodsLog (LOG_NOTICE,
00045 "remoteSubStructFileGet: Invalid rodsServerHost");
00046 return SYS_INVALID_SERVER_HOST;
00047 }
00048
00049 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00050 return status;
00051 }
00052
00053 status = rcSubStructFileGet (rodsServerHost->conn, subFile,
00054 subFileGetOutBBuf);
00055
00056 if (status < 0) {
00057 rodsLog (LOG_NOTICE,
00058 "remoteSubStructFileGet: rcSubStructFileGet failed for %s, status = %d",
00059 subFile->subFilePath, status);
00060 }
00061
00062 return status;
00063 }
00064
00065 int
00066 _rsSubStructFileGet (rsComm_t *rsComm, subFile_t *subFile,
00067 bytesBuf_t *subFileGetOutBBuf)
00068 {
00069 int status;
00070 int fd;
00071 int len;
00072
00073 len = subFile->offset;
00074 if (len <= 0)
00075 return (0);
00076
00077 fd = subStructFileOpen (rsComm, subFile);
00078
00079 if (fd < 0) {
00080 rodsLog (LOG_NOTICE,
00081 "_rsSubStructFileGet: subStructFileOpen error for %s, status = %d",
00082 subFile->subFilePath, fd);
00083 return (fd);
00084 }
00085
00086 if (subFileGetOutBBuf->buf == NULL) {
00087 subFileGetOutBBuf->buf = malloc (len);
00088 }
00089 status = subStructFileRead (subFile->specColl->type, rsComm,
00090 fd, subFileGetOutBBuf->buf, len);
00091
00092 if (status != len) {
00093 if (status >= 0) {
00094 rodsLog (LOG_NOTICE,
00095 "_rsSubStructFileGet:subStructFileRead for %s,toread %d,read %d",
00096 subFile->subFilePath, len, status);
00097 status = SYS_COPY_LEN_ERR;
00098 } else {
00099 rodsLog (LOG_NOTICE,
00100 "_rsSubStructFileGet: subStructFileRead for %s, status = %d",
00101 subFile->subFilePath, status);
00102 }
00103 } else {
00104 subFileGetOutBBuf->len = status;
00105 }
00106
00107 subStructFileClose (subFile->specColl->type, rsComm, fd);
00108
00109 return (status);
00110 }
00111
00112