00001
00002
00003
00004
00005
00006 #include "dataObjLock.h"
00007 #include "rodsLog.h"
00008 #include "objMetaOpr.h"
00009 #include "dataObjOpr.h"
00010 #include "physPath.h"
00011 #include "specColl.h"
00012 #include "rsGlobalExtern.h"
00013 #include "rcGlobalExtern.h"
00014 #include "reGlobalsExtern.h"
00015 #include "reDefines.h"
00016 #include "reDefines.h"
00017 #include "getRemoteZoneResc.h"
00018
00019 int
00020 rsDataObjLock (rsComm_t *rsComm, dataObjInp_t *dataObjInp)
00021 {
00022 int status;
00023 int remoteFlag;
00024 specCollCache_t *specCollCache = NULL;
00025 rodsServerHost_t *rodsServerHost = NULL;
00026
00027 resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache,
00028 &dataObjInp->condInput);
00029
00030 remoteFlag = getAndConnRcatHost (rsComm, MASTER_RCAT, dataObjInp->objPath,
00031 &rodsServerHost);
00032 if (remoteFlag < 0) {
00033 return (remoteFlag);
00034 } else if (remoteFlag == REMOTE_HOST) {
00035 if( rodsServerHost != NULL ) {
00036 status = rcDataObjLock (rodsServerHost->conn, dataObjInp);
00037 return (status);
00038 } else {
00039 status = SYS_NO_RCAT_SERVER_ERR;
00040 }
00041 } else {
00042 #ifdef RODS_CAT
00043 status = _rsDataObjLock (rsComm, dataObjInp);
00044 #else
00045 status = SYS_NO_RCAT_SERVER_ERR;
00046 #endif
00047 }
00048 return (status);
00049 }
00050
00051 int
00052 _rsDataObjLock (rsComm_t *rsComm, dataObjInp_t *dataObjInp)
00053 {
00054 int status;
00055 int cmd, type, fd;
00056
00057 fd = getLockCmdAndType (&dataObjInp->condInput, &cmd, &type);
00058 if (fd < 0) return fd;
00059
00060 status = fsDataObjLock (dataObjInp->objPath, cmd, type, fd);
00061 return status;
00062 }
00063
00064 int
00065 getLockCmdAndType (keyValPair_t *condInput, int *cmd, int *type)
00066 {
00067 char *lockType, *lockCmd, *lockFd;
00068 int status;
00069
00070 if (condInput == NULL || cmd == NULL || type == NULL)
00071 return USER__NULL_INPUT_ERR;
00072
00073 lockType = getValByKey (condInput, LOCK_TYPE_KW);
00074 if (lockType == NULL) return SYS_LOCK_TYPE_INP_ERR;
00075
00076 if (strcmp (lockType, READ_LOCK_TYPE) == 0) {
00077 *type = F_RDLCK;
00078 } else if (strcmp (lockType, WRITE_LOCK_TYPE) == 0) {
00079 *type = F_WRLCK;
00080 } else if (strcmp (lockType, UNLOCK_TYPE) == 0) {
00081 *type = F_UNLCK;
00082 *cmd = F_SETLK;
00083 lockFd = getValByKey (condInput, LOCK_FD_KW);
00084 if (lockFd != NULL) {
00085 return (atoi (lockFd));
00086 } else {
00087 status = SYS_LOCK_TYPE_INP_ERR;
00088 rodsLogError (LOG_ERROR, status,
00089 "getLockCmdAndType: LOCK_FD_KW not defined for UNLOCK_TYPE");
00090 return status;
00091 }
00092 } else {
00093 status = SYS_LOCK_TYPE_INP_ERR;
00094 rodsLogError (LOG_ERROR, status,
00095 "getLockCmdAndType: illegal lock type %s", lockType);
00096 return status;
00097 }
00098
00099 lockCmd = getValByKey (condInput, LOCK_CMD_KW);
00100 if (lockCmd == NULL) {
00101
00102 *cmd = F_SETLKW;
00103 return 0;
00104 }
00105
00106 if (strcmp (lockCmd, SET_LOCK_CMD) == 0) {
00107 *cmd = F_SETLK;
00108 } else if (strcmp (lockCmd, SET_LOCK_WAIT_CMD) == 0) {
00109 *cmd = F_SETLKW;
00110 } else if (strcmp (lockCmd, GET_LOCK_CMD) == 0) {
00111 *cmd = F_GETLK;
00112 } else {
00113 status = SYS_LOCK_CMD_INP_ERR;
00114 rodsLogError (LOG_ERROR, status,
00115 "getLockCmdAndType: illegal lock cmd %s", lockCmd);
00116 return status;
00117 }
00118 return 0;
00119 }
00120
00121
00122
00123 int
00124 rsDataObjUnlock (rsComm_t *rsComm, dataObjInp_t *dataObjInp, int fd)
00125 {
00126 char tmpStr[NAME_LEN];
00127 int status;
00128
00129 snprintf (tmpStr, NAME_LEN, "%-d", fd);
00130 addKeyVal (&dataObjInp->condInput, LOCK_FD_KW, tmpStr);
00131 addKeyVal (&dataObjInp->condInput, LOCK_TYPE_KW, UNLOCK_TYPE);
00132
00133 status = rsDataObjLock (rsComm, dataObjInp);
00134
00135 return status;
00136 }
00137