00001
00002
00003
00004
00005
00006
00007
00008 #include "fileCreate.h"
00009 #include "fileOpr.h"
00010 #include "miscServerFunct.h"
00011 #include "dataObjOpr.h"
00012 #include "physPath.h"
00013
00014 int
00015 rsFileCreate (rsComm_t *rsComm, fileCreateInp_t *fileCreateInp)
00016 {
00017 rodsServerHost_t *rodsServerHost;
00018 int remoteFlag;
00019 int fileInx;
00020 int fd;
00021
00022 remoteFlag = resolveHost (&fileCreateInp->addr, &rodsServerHost);
00023
00024 if (remoteFlag == LOCAL_HOST) {
00025 fd = _rsFileCreate (rsComm, fileCreateInp, rodsServerHost);
00026 } else if (remoteFlag == REMOTE_HOST) {
00027 fd = remoteFileCreate (rsComm, fileCreateInp, rodsServerHost);
00028 } else {
00029 if (remoteFlag < 0) {
00030 return (remoteFlag);
00031 } else {
00032 rodsLog (LOG_NOTICE,
00033 "rsFileCreate: resolveHost returned unrecognized value %d",
00034 remoteFlag);
00035 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00036 }
00037 }
00038
00039 if (fd < 0) {
00040 return (fd);
00041 }
00042
00043 fileInx = allocAndFillFileDesc (rodsServerHost, fileCreateInp->fileName,
00044 fileCreateInp->fileType, fd,
00045 fileCreateInp->mode);
00046
00047 return (fileInx);
00048 }
00049
00050 int
00051 remoteFileCreate (rsComm_t *rsComm, fileCreateInp_t *fileCreateInp,
00052 rodsServerHost_t *rodsServerHost)
00053 {
00054 int fileInx;
00055 int status;
00056
00057 if (rodsServerHost == NULL) {
00058 rodsLog (LOG_NOTICE,
00059 "remoteFileCreate: Invalid rodsServerHost");
00060 return SYS_INVALID_SERVER_HOST;
00061 }
00062
00063 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00064 return status;
00065 }
00066
00067 fileInx = rcFileCreate (rodsServerHost->conn, fileCreateInp);
00068
00069 if (fileInx < 0) {
00070 rodsLog (LOG_NOTICE,
00071 "remoteFileCreate: rcFileCreate failed for %s",
00072 fileCreateInp->fileName);
00073 }
00074
00075 return fileInx;
00076 }
00077
00078
00079
00080
00081 int
00082 _rsFileCreate (rsComm_t *rsComm, fileCreateInp_t *fileCreateInp,
00083 rodsServerHost_t *rodsServerHost)
00084 {
00085 int fd;
00086 int status;
00087
00088
00089
00090
00091
00092 if( fileCreateInp->otherFlags & NO_CHK_PERM_FLAG == 0 ) {
00093 status = chkFilePathPerm (rsComm, fileCreateInp, rodsServerHost, DO_CHK_PATH_PERM);
00094 if (status < 0) {
00095 return (status);
00096 }
00097 }
00098
00099 fd = fileCreate (fileCreateInp->fileType, rsComm, fileCreateInp->fileName,
00100 fileCreateInp->mode, fileCreateInp->dataSize);
00101
00102 if (fd < 0) {
00103 if (getErrno (fd) == ENOENT) {
00104
00105 mkDirForFilePath (fileCreateInp->fileType, rsComm,
00106 "/", fileCreateInp->fileName, getDefDirMode ());
00107 fd = fileCreate (fileCreateInp->fileType, rsComm,
00108 fileCreateInp->fileName, fileCreateInp->mode,
00109 fileCreateInp->dataSize);
00110 if (fd < 0) {
00111 if (getErrno (fd) == EEXIST) {
00112 rodsLog (LOG_DEBUG1,
00113 "_rsFileCreate: fileCreate for %s, status = %d",
00114 fileCreateInp->fileName, fd);
00115 } else {
00116 rodsLog (LOG_NOTICE,
00117 "_rsFileCreate: fileCreate for %s, status = %d",
00118 fileCreateInp->fileName, fd);
00119 }
00120 }
00121 } else if (getErrno (fd) == EEXIST) {
00122
00123 fileRmdir (fileCreateInp->fileType, rsComm,
00124 fileCreateInp->fileName);
00125 fd = fileCreate (fileCreateInp->fileType, rsComm,
00126 fileCreateInp->fileName, fileCreateInp->mode,
00127 fileCreateInp->dataSize);
00128 } else {
00129 if (getErrno (fd) == EEXIST) {
00130 rodsLog (LOG_DEBUG1,
00131 "_rsFileCreate: fileCreate for %s, status = %d",
00132 fileCreateInp->fileName, fd);
00133 } else {
00134 rodsLog (LOG_NOTICE,
00135 "_rsFileCreate: fileCreate for %s, status = %d",
00136 fileCreateInp->fileName, fd);
00137 }
00138 }
00139 }
00140 return (fd);
00141 }
00142