int _rsDataObjCreateWithRescInfo( rsComm_t* rsComm, dataObjInp_t* dataObjInp, rescInfo_t* rescInfo, char* rescGroupName ) { dataObjInfo_t *dataObjInfo; int l1descInx; int status; l1descInx = allocL1desc(); if ( l1descInx < 0 ) { return l1descInx; } dataObjInfo = ( dataObjInfo_t* )malloc( sizeof( dataObjInfo_t ) ); initDataObjInfoWithInp( dataObjInfo, dataObjInp ); // =-=-=-=-=-=-=- // honor the purge flag if ( getValByKey( &dataObjInp->condInput, PURGE_CACHE_KW ) != NULL ) { // JMC - backport 4537 L1desc[l1descInx].purgeCacheFlag = 1; } dataObjInfo->rescInfo = new rescInfo_t; memcpy( dataObjInfo->rescInfo, rescInfo, sizeof( rescInfo_t ) ); rstrcpy( dataObjInfo->rescName, rescInfo->rescName, NAME_LEN ); rstrcpy( dataObjInfo->rescGroupName, rescGroupName, NAME_LEN ); char* resc_hier = getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW ); if ( resc_hier ) { rstrcpy( dataObjInfo->rescHier, resc_hier, MAX_NAME_LEN ); } else { rstrcpy( dataObjInfo->rescHier, rescInfo->rescName, MAX_NAME_LEN ); // in kw else } dataObjInfo->replStatus = NEWLY_CREATED_COPY; // JMC - backport 4754 fillL1desc( l1descInx, dataObjInp, dataObjInfo, NEWLY_CREATED_COPY, dataObjInp->dataSize ); status = getFilePathName( rsComm, dataObjInfo, L1desc[l1descInx].dataObjInp ); if ( status < 0 ) { freeL1desc( l1descInx ); return ( status ); } /* output of _rsDataObjCreate - filePath stored in * dataObjInfo struct */ if ( getValByKey( &dataObjInp->condInput, NO_OPEN_FLAG_KW ) != NULL ) { /* don't actually physically open the file */ status = 0; } else { status = dataObjCreateAndReg( rsComm, l1descInx ); } if ( status < 0 ) { freeL1desc( l1descInx ); return ( status ); } else { return ( l1descInx ); } }
void kos_Main(){ rtlSrand(kos_GetSystemClock() / 10000); kos_InitHeap(); getFilePathName(); prepareFileData(); draw_window(); while (true){ switch (kos_WaitForEvent()){ case 1: draw_window(); break; case 2: Byte keyCode; kos_GetKey(keyCode); if (status==0){ //Меню if (keyCode==27){ app_halt(); } if (keyCode==13){ currentquestion=1; status=1; loadquestion(); ////// ПОМЕНЯТЬ МЕСТАМИ!!!!!!! ///////// draw_window(); } } if (status==1){ //Игра if (keyCode==8){ status=6; draw_window(); } if (drawA==true){ if ((keyCode==49)||(keyCode==97)||(keyCode==65)){ if (correctanswer==0x01){ status=2; } else { status=-1; } drawA = true; drawB = true; drawC = true; drawD = true; draw_window(); } } if (drawB==true){ if ((keyCode==50)||(keyCode==98)||(keyCode==66)){ if (correctanswer==0x02){ status=2; } else { status=-1; } drawA = true; drawB = true; drawC = true; drawD = true; draw_window(); } } if (drawC==true){ if ((keyCode==51)||(keyCode==99)||(keyCode==67)){ if (correctanswer==0x03){ status=2; } else { status=-1; } drawA = true; drawB = true; drawC = true; drawD = true; draw_window(); } } if (drawD==true){ if ((keyCode==52)||(keyCode==100)||(keyCode==68)){ if (correctanswer==0x04){ status=2; } else { status=-1; } drawA = true; drawB = true; drawC = true; drawD = true; draw_window(); } } if (callfriendavailable==true){ //Реализация подсказки "Звонок другу" if (keyCode==56){ callfriendavailable=false; status=4; call_friend(); draw_window(); } } if (zalavailable==true){ //Реализация подсказки зала if (keyCode==57){ zalavailable=false; status=5; call_zal(); draw_window(); } } if (na50available==true){ //Реализация подсказки "50 на 50" if (keyCode==55){ if (correctanswer==0x01){ drawA=true; int tmpcodee; recode1: tmpcodee =(rtlRand()%3)+1; int tmpbyte; switch(tmpcodee){ case 1: drawB=true; drawC=false; drawD=false; break; case 2: drawB=false; drawC=true; drawD=false; case 3: drawB=false; drawC=false; drawD=true; } } if (correctanswer==0x02){ drawB=true; int tmpcodee; recode2: tmpcodee =(rtlRand()%3)+1; int tmpbyte; switch(tmpcodee){ case 1: drawA=true; drawC=false; drawD=false; break; case 2: drawA=false; drawC=true; drawD=false; case 3: drawA=false; drawC=false; drawD=true; } } if (correctanswer==0x03){ drawC=true; int tmpcodee; recode3: tmpcodee =(rtlRand()%3)+1; int tmpbyte; switch(tmpcodee){ case 1: drawB=true; drawA=false; drawD=false; break; case 2: drawB=false; drawA=true; drawD=false; case 3: drawB=false; drawA=false; drawD=true; } } if (correctanswer==0x04){ drawA=true; int tmpcodee; recode4: tmpcodee =(rtlRand()%3)+1; int tmpbyte; switch(tmpcodee){ case 1: drawB=true; drawC=false; drawA=false; break; case 2: drawB=false; drawC=true; drawA=false; case 3: drawB=false; drawC=false; drawA=true; } } na50available=false; draw_window(); } } } if (status==2){ //Окно "Это - правильный ответ!" if (keyCode==13){ if (currentquestion<15){ currentquestion++; status=1; loadquestion(); draw_window(); } else { status=3; draw_window(); } } } if (status==3){ //Вы выиграли миллион if (keyCode==27){ app_halt(); } } if (status==4){ //Совет друга if (keyCode==13){ status=1; draw_window(); } } if (status==5){ //Подсказка зала if (keyCode==13){ status=1; draw_window(); } } if (status==6){ //Вы забрали деньги ;-) if (keyCode==27){ app_halt(); } } if (status==-1){ //Вы ошиблись :-( if (keyCode==27){ app_halt(); } } //kos_DrawBar(38,118,50,130,0xBBBBBB); //kos_DisplayNumberToWindow (keyCode,3,40,120,0x000000, nbDecimal, false); break; case 3: app_halt(); break; } } }
/* createEmptyRepl - Physically create a zero length file and register * as a replica and queue the dataObjInfo on the top of dataObjInfoHead. */ int createEmptyRepl( rsComm_t *rsComm, dataObjInp_t *dataObjInp, dataObjInfo_t **dataObjInfoHead ) { int status; regReplica_t regReplicaInp; keyValPair_t *condInput = &dataObjInp->condInput; dataObjInfo_t *myDataObjInfo; std::string resc_name; if ( getValByKey( condInput, DEST_RESC_NAME_KW ) == NULL && getValByKey( condInput, BACKUP_RESC_NAME_KW ) == NULL && getValByKey( condInput, DEF_RESC_NAME_KW ) == NULL ) { return USER_NO_RESC_INPUT_ERR; } status = getRescForCreate( rsComm, dataObjInp, resc_name ); if ( status < 0 || resc_name.empty() ) { return status; // JMC cppcheck } myDataObjInfo = ( dataObjInfo_t* )malloc( sizeof( dataObjInfo_t ) ); *myDataObjInfo = *( *dataObjInfoHead ); rstrcpy( myDataObjInfo->rescName, ( *dataObjInfoHead )->rescName, NAME_LEN ); char* resc_hier = getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW ); if ( resc_hier ) { rstrcpy( myDataObjInfo->rescHier, resc_hier, MAX_NAME_LEN ); // hier sent from upper level code } else { rodsLog( LOG_NOTICE, "createEmptyRepl :: using rescName for hier" ); rstrcpy( myDataObjInfo->rescHier, ( *dataObjInfoHead )->rescName, MAX_NAME_LEN ); // in kw else } rodsLong_t resc_id; irods::error ret = resc_mgr.hier_to_leaf_id( myDataObjInfo->rescHier, resc_id ); myDataObjInfo->rescId = resc_id; status = getFilePathName( rsComm, myDataObjInfo, dataObjInp ); if ( status < 0 ) { rodsLog( LOG_ERROR, "getFilePathName failed in %s with status %d", __FUNCTION__, status ); return status; } status = l3CreateByObjInfo( rsComm, dataObjInp, myDataObjInfo ); if ( status < 0 ) { rodsLog( LOG_ERROR, "l3CreateByObjInfo failed in %s with status %d", __FUNCTION__, status ); return status; } /* close it */ _l3Close( rsComm, status ); /* register the replica */ memset( ®ReplicaInp, 0, sizeof( regReplicaInp ) ); regReplicaInp.srcDataObjInfo = *dataObjInfoHead; regReplicaInp.destDataObjInfo = myDataObjInfo; if ( getValByKey( &dataObjInp->condInput, ADMIN_KW ) != NULL ) { addKeyVal( ®ReplicaInp.condInput, ADMIN_KW, "" ); } status = rsRegReplica( rsComm, ®ReplicaInp ); clearKeyVal( ®ReplicaInp.condInput ); if ( status < 0 ) { free( myDataObjInfo ); } else { /* queue it on top */ myDataObjInfo->next = *dataObjInfoHead; *dataObjInfoHead = myDataObjInfo; } return status; }
int chkCollForExtAndReg (rsComm_t *rsComm, char *collection, rodsObjStat_t **rodsObjStatOut) { dataObjInp_t dataObjInp; int status; rodsObjStat_t *myRodsObjStat = NULL; bzero (&dataObjInp, sizeof (dataObjInp)); rstrcpy (dataObjInp.objPath, collection, MAX_NAME_LEN); #if 0 /* allow mounted coll */ status = collStat (rsComm, &dataObjInp, &myRodsObjStat); #endif status = collStatAllKinds (rsComm, &dataObjInp, &myRodsObjStat); #if 0 if (status == CAT_NO_ROWS_FOUND || status == OBJ_PATH_DOES_NOT_EXIST || status == USER_FILE_DOES_NOT_EXIST) { #endif if (status < 0) { status = rsMkCollR (rsComm, "/", collection); if (status < 0) { rodsLog (LOG_ERROR, "chkCollForExtAndReg: rsMkCollR of %s error. status = %d", collection, status); return (status); } else { #if 0 /* allow mounted coll */ status = collStat (rsComm, &dataObjInp, &myRodsObjStat); #endif status = collStatAllKinds (rsComm, &dataObjInp, &myRodsObjStat); } } if (status < 0) { rodsLog (LOG_ERROR, "chkCollForExtAndReg: collStat of %s error. status = %d", dataObjInp.objPath, status); return (status); } else if (myRodsObjStat->specColl != NULL && myRodsObjStat->specColl->collClass != MOUNTED_COLL) { /* only do mounted coll */ freeRodsObjStat (myRodsObjStat); rodsLog (LOG_ERROR, "chkCollForExtAndReg: %s is a struct file collection", dataObjInp.objPath); return (SYS_STRUCT_FILE_INMOUNTED_COLL); } if (myRodsObjStat->specColl == NULL) { status = checkCollAccessPerm (rsComm, collection, ACCESS_DELETE_OBJECT); } else { status = checkCollAccessPerm (rsComm, myRodsObjStat->specColl->collection, ACCESS_DELETE_OBJECT); } if (status < 0) { rodsLog (LOG_ERROR, "chkCollForExtAndReg: no permission to write %s, status = %d", collection, status); freeRodsObjStat (myRodsObjStat); } else { if (rodsObjStatOut != NULL) { *rodsObjStatOut = myRodsObjStat; } else { freeRodsObjStat (myRodsObjStat); } } return (status); } /* regUnbunSubfiles - non bulk version of registering all files in phyBunDir * to the collection. Valid values for flags are: * FORCE_FLAG_FLAG. */ int regUnbunSubfiles (rsComm_t *rsComm, rescInfo_t *rescInfo, char *rescGroupName, char *collection, char *phyBunDir, int flags, genQueryOut_t *attriArray) { #ifndef USE_BOOST_FS DIR *dirPtr; struct dirent *myDirent; struct stat statbuf; #endif char subfilePath[MAX_NAME_LEN]; char subObjPath[MAX_NAME_LEN]; dataObjInp_t dataObjInp; int status; int savedStatus = 0; rodsLong_t st_size; #ifdef USE_BOOST_FS path srcDirPath (phyBunDir); if (!exists(srcDirPath) || !is_directory(srcDirPath)) { #else dirPtr = opendir (phyBunDir); if (dirPtr == NULL) { #endif rodsLog (LOG_ERROR, "regUnbunphySubfiles: opendir error for %s, errno = %d", phyBunDir, errno); return (UNIX_FILE_OPENDIR_ERR - errno); } bzero (&dataObjInp, sizeof (dataObjInp)); #ifdef USE_BOOST_FS directory_iterator end_itr; // default construction yields past-the-end for (directory_iterator itr(srcDirPath); itr != end_itr;++itr) { path p = itr->path(); snprintf (subfilePath, MAX_NAME_LEN, "%s", p.c_str ()); #else while ((myDirent = readdir (dirPtr)) != NULL) { if (strcmp (myDirent->d_name, ".") == 0 || strcmp (myDirent->d_name, "..") == 0) { continue; } snprintf (subfilePath, MAX_NAME_LEN, "%s/%s", phyBunDir, myDirent->d_name); #endif #ifdef USE_BOOST_FS if (!exists (p)) { #else status = lstat (subfilePath, &statbuf); if (status != 0) { #endif rodsLog (LOG_ERROR, "regUnbunphySubfiles: stat error for %s, errno = %d", subfilePath, errno); savedStatus = UNIX_FILE_STAT_ERR - errno; unlink (subfilePath); continue; } #ifdef USE_BOOST_FS if (is_symlink (p)) { #else if ((statbuf.st_mode & S_IFLNK) == S_IFLNK) { #endif rodsLogError (LOG_ERROR, SYMLINKED_BUNFILE_NOT_ALLOWED, "regUnbunSubfiles: %s is a symlink", subfilePath); savedStatus = SYMLINKED_BUNFILE_NOT_ALLOWED; continue; } #ifdef USE_BOOST_FS path childPath = p.filename(); snprintf (subObjPath, MAX_NAME_LEN, "%s/%s", collection, childPath.c_str()); if (is_directory (p)) { #else snprintf (subObjPath, MAX_NAME_LEN, "%s/%s", collection, myDirent->d_name); if ((statbuf.st_mode & S_IFDIR) != 0) { #endif status = rsMkCollR (rsComm, "/", subObjPath); if (status < 0) { rodsLog (LOG_ERROR, "regUnbunSubfiles: rsMkCollR of %s error. status = %d", subObjPath, status); savedStatus = status; continue; } status = regUnbunSubfiles (rsComm, rescInfo, rescGroupName, subObjPath, subfilePath, flags, attriArray); if (status < 0) { rodsLog (LOG_ERROR, "regUnbunSubfiles: regUnbunSubfiles of %s error. status=%d", subObjPath, status); savedStatus = status; continue; } #ifdef USE_BOOST_FS } else if (is_regular_file (p)) { st_size = file_size (p); #else } else if ((statbuf.st_mode & S_IFREG) != 0) { st_size = statbuf.st_size; #endif status = regSubfile (rsComm, rescInfo, rescGroupName, subObjPath, subfilePath, st_size, flags); unlink (subfilePath); if (status < 0) { rodsLog (LOG_ERROR, "regUnbunSubfiles: regSubfile of %s error. status=%d", subObjPath, status); savedStatus = status; continue; } } } #ifndef USE_BOOST_FS closedir (dirPtr); #endif rmdir (phyBunDir); return savedStatus; } int regSubfile (rsComm_t *rsComm, rescInfo_t *rescInfo, char *rescGroupName, char *subObjPath, char *subfilePath, rodsLong_t dataSize, int flags) { dataObjInfo_t dataObjInfo; dataObjInp_t dataObjInp; #ifndef USE_BOOST_FS struct stat statbuf; #endif int status; int modFlag = 0; bzero (&dataObjInp, sizeof (dataObjInp)); bzero (&dataObjInfo, sizeof (dataObjInfo)); rstrcpy (dataObjInp.objPath, subObjPath, MAX_NAME_LEN); rstrcpy (dataObjInfo.objPath, subObjPath, MAX_NAME_LEN); rstrcpy (dataObjInfo.rescName, rescInfo->rescName, NAME_LEN); rstrcpy (dataObjInfo.dataType, "generic", NAME_LEN); dataObjInfo.rescInfo = rescInfo; rstrcpy (dataObjInfo.rescGroupName, rescGroupName, NAME_LEN); dataObjInfo.dataSize = dataSize; status = getFilePathName (rsComm, &dataObjInfo, &dataObjInp); if (status < 0) { rodsLog (LOG_ERROR, "regSubFile: getFilePathName err for %s. status = %d", dataObjInp.objPath, status); return (status); } #ifdef USE_BOOST_FS path p (dataObjInfo.filePath); if (exists (p)) { if (is_directory (p)) { #else status = stat (dataObjInfo.filePath, &statbuf); if (status == 0 || errno != ENOENT) { if ((statbuf.st_mode & S_IFDIR) != 0) { #endif return SYS_PATH_IS_NOT_A_FILE; } if (chkOrphanFile (rsComm, dataObjInfo.filePath, rescInfo->rescName, &dataObjInfo) > 0) { /* an orphan file. just rename it */ fileRenameInp_t fileRenameInp; bzero (&fileRenameInp, sizeof (fileRenameInp)); rstrcpy (fileRenameInp.oldFileName, dataObjInfo.filePath, MAX_NAME_LEN); status = renameFilePathToNewDir (rsComm, ORPHAN_DIR, &fileRenameInp, rescInfo, 1); if (status < 0) { rodsLog (LOG_ERROR, "regSubFile: renameFilePathToNewDir err for %s. status = %d", fileRenameInp.oldFileName, status); return (status); } } else { /* not an orphan file */ if ((flags & FORCE_FLAG_FLAG) != 0 && dataObjInfo.dataId > 0 && strcmp (dataObjInfo.objPath, subObjPath) == 0) { /* overwrite the current file */ modFlag = 1; unlink (dataObjInfo.filePath); } else { status = SYS_COPY_ALREADY_IN_RESC; rodsLog (LOG_ERROR, "regSubFile: phypath %s is already in use. status = %d", dataObjInfo.filePath, status); return (status); } } } /* make the necessary dir */ mkDirForFilePath (UNIX_FILE_TYPE, rsComm, "/", dataObjInfo.filePath, getDefDirMode ()); /* add a link */ #ifndef windows_platform /* Windows does not support link */ status = link (subfilePath, dataObjInfo.filePath); if (status < 0) { rodsLog (LOG_ERROR, "regSubFile: link error %s to %s. errno = %d", subfilePath, dataObjInfo.filePath, errno); return (UNIX_FILE_LINK_ERR - errno); } #endif if (modFlag == 0) { status = svrRegDataObj (rsComm, &dataObjInfo); } else { char tmpStr[MAX_NAME_LEN]; modDataObjMeta_t modDataObjMetaInp; keyValPair_t regParam; bzero (&modDataObjMetaInp, sizeof (modDataObjMetaInp)); bzero (®Param, sizeof (regParam)); snprintf (tmpStr, MAX_NAME_LEN, "%lld", dataSize); addKeyVal (®Param, DATA_SIZE_KW, tmpStr); addKeyVal (®Param, ALL_REPL_STATUS_KW, tmpStr); snprintf (tmpStr, MAX_NAME_LEN, "%d", (int) time (NULL)); addKeyVal (®Param, DATA_MODIFY_KW, tmpStr); modDataObjMetaInp.dataObjInfo = &dataObjInfo; modDataObjMetaInp.regParam = ®Param; status = rsModDataObjMeta (rsComm, &modDataObjMetaInp); clearKeyVal (®Param); } if (status < 0) { rodsLog (LOG_ERROR, "regSubFile: svrRegDataObj of %s. errno = %d", dataObjInfo.objPath, errno); unlink (dataObjInfo.filePath); } else { ruleExecInfo_t rei; dataObjInp_t dataObjInp; bzero (&dataObjInp, sizeof (dataObjInp)); rstrcpy (dataObjInp.objPath, dataObjInfo.objPath, MAX_NAME_LEN); initReiWithDataObjInp (&rei, rsComm, &dataObjInp); rei.doi = &dataObjInfo; rei.status = applyRule ("acPostProcForTarFileReg", NULL, &rei, NO_SAVE_REI); if (rei.status < 0) { rodsLogError (LOG_ERROR, rei.status, "regSubFile: acPostProcForTarFileReg error for %s. status = %d", dataObjInfo.objPath); } } return status; }