/* chmod ���� */ void File::splitFile(char* sourceFile, char* first_target, char* second_target) // sourceFile�� file�� ������, first_target�� xFilenamea, second_target�� xFilenameb { // source������ ������ �о�´� int fd = open( findFile(sourceFile) ); TableManager* t = TableManager::getInstance(); TableManager& tm = *t; InodeElement* sourceInodeE = tm.getInodeByFD( fd ); int halfSize = atoi(sourceInodeE->inode.size) / 2; // first_target���Ͽ� �ݸ�ŭ ���� int* dirInodeNo = new int; int firstTargetFd = createAndOpen( first_target, findFile( first_target, dirInodeNo ), *dirInodeNo ); char* firstFileData; readFile(fd, firstFileData, halfSize); writeFile(firstTargetFd, firstFileData, halfSize); // second_target�� ������ �� ���� int secondTargetFd = createAndOpen( second_target, findFile(second_target, dirInodeNo), *dirInodeNo ); char* secondFileData; readFile(fd, secondFileData, halfSize); writeFile(secondTargetFd, secondFileData, halfSize); delete dirInodeNo; }
void File::copySysFile(char* sourceSysFile, char* targetFile) { string data = readSystemFile(sourceSysFile);// System file read int* dirInodeNo = new int; int fd = createAndOpen(targetFile, findFile(targetFile, dirInodeNo), *dirInodeNo );//-> filename���� file create���� �� //-> file open�Ұ� writeFile(fd, (char*)data.c_str(), data.length());//-> filewrite ���� �� delete dirInodeNo; }
// cat >> a �� ��� : �̾�� void File::joinCat(char* file, char* data) // file �� filename { int* dirInodeNo = new int; int fd = createAndOpen( file, findFile(file, dirInodeNo), *dirInodeNo ); delete dirInodeNo; if (fd <= 0 ) return; writeFile(fd, data); }
// cat > a �� ��� : ����� void File::overwriteCat(char* file, string data) // file�� path { int* dirInodeNo = new int; int fd = createAndOpen( file, findFile(file, dirInodeNo), *dirInodeNo ); if (fd <= 0 ) return; delete dirInodeNo; writeFile(fd, (char*)data.c_str(), data.length()); }
FileStream* FileStream::clone() const { Torque::FS::File::AccessMode mode; if( hasCapability( StreamWrite ) && hasCapability( StreamRead ) ) mode = Torque::FS::File::ReadWrite; else if( hasCapability( StreamWrite ) ) mode = Torque::FS::File::Write; else mode = Torque::FS::File::Read; FileStream* copy = createAndOpen( mFile->getName(), mode ); if( copy && copy->setPosition( getPosition() ) ) return copy; delete copy; return NULL; }
static void check(short dbr_type) { dbChannel *pch; db_field_log *pfl, *pfl2; dbAddr valaddr; dbAddr offaddr; const char *offname = NULL, *valname = NULL, *typname = NULL; epicsInt32 ar[10] = {10,11,12,13,14,15,16,17,18,19}; epicsInt32 *ar10_0_1 = ar; epicsInt32 ar10_4_1[10] = {14,15,16,17,18,19,10,11,12,13}; epicsInt32 ar5_0_1[10] = {12,13,14,15,16}; epicsInt32 ar5_3_1[10] = {15,16,17,18,19}; epicsInt32 ar5_5_1[10] = {17,18,19,10,11}; epicsInt32 ar5_9_1[10] = {11,12,13,14,15}; epicsInt32 ar5_0_2[10] = {12,14,16}; epicsInt32 ar5_3_2[10] = {15,17,19}; epicsInt32 ar5_5_2[10] = {17,19,11}; epicsInt32 ar5_9_2[10] = {11,13,15}; epicsInt32 ar5_0_3[10] = {12,15}; epicsInt32 ar5_3_3[10] = {15,18}; epicsInt32 ar5_5_3[10] = {17,10}; epicsInt32 ar5_9_3[10] = {11,14}; epicsInt32 off = 0; switch (dbr_type) { case DBR_LONG: offname = "x.OFF"; valname = "x.VAL"; typname = "long"; break; case DBR_DOUBLE: offname = "y.OFF"; valname = "y.VAL"; typname = "double"; break; case DBR_STRING: offname = "z.OFF"; valname = "z.VAL"; typname = "string"; break; default: testDiag("Invalid data type %d", dbr_type); } (void) dbNameToAddr(offname, &offaddr); (void) dbNameToAddr(valname, &valaddr); (void) dbPutField(&valaddr, DBR_LONG, ar, 10); /* Default: should not change anything */ testHead("Ten %s elements from rec, increment 1, full size (default)", typname); createAndOpen(valname, "{\"arr\":{}}", "(default)", &pch, 1); testOk(pch->final_type == valaddr.field_type, "final type unchanged (%d->%d)", valaddr.field_type, pch->final_type); testOk(pch->final_no_elements == valaddr.no_elements, "final no_elements unchanged (%ld->%ld)", valaddr.no_elements, pch->final_no_elements); TEST1(10, 0, 1, "no offset"); TEST1(10, 4, 1, "wrapped"); dbChannelDelete(pch); testHead("Ten %s elements from rec, increment 1, out-of-bound start parameter", typname); createAndOpen(valname, "{\"arr\":{\"s\":-500}}", "out-of-bound start", &pch, 1); testOk(pch->final_type == valaddr.field_type, "final type unchanged (%d->%d)", valaddr.field_type, pch->final_type); testOk(pch->final_no_elements == valaddr.no_elements, "final no_elements unchanged (%ld->%ld)", valaddr.no_elements, pch->final_no_elements); TEST1(10, 4, 1, "wrapped"); dbChannelDelete(pch); testHead("Ten %s elements from rec, increment 1, out-of-bound end parameter", typname); createAndOpen(valname, "{\"arr\":{\"e\":500}}", "out-of-bound end", &pch, 1); testOk(pch->final_type == valaddr.field_type, "final type unchanged (%d->%d)", valaddr.field_type, pch->final_type); testOk(pch->final_no_elements == valaddr.no_elements, "final no_elements unchanged (%ld->%ld)", valaddr.no_elements, pch->final_no_elements); TEST1(10, 4, 1, "wrapped"); dbChannelDelete(pch); testHead("Ten %s elements from rec, increment 1, zero increment parameter", typname); createAndOpen(valname, "{\"arr\":{\"i\":0}}", "zero increment", &pch, 1); testOk(pch->final_type == valaddr.field_type, "final type unchanged (%d->%d)", valaddr.field_type, pch->final_type); testOk(pch->final_no_elements == valaddr.no_elements, "final no_elements unchanged (%ld->%ld)", valaddr.no_elements, pch->final_no_elements); TEST1(10, 4, 1, "wrapped"); dbChannelDelete(pch); testHead("Ten %s elements from rec, increment 1, invalid increment parameter", typname); createAndOpen(valname, "{\"arr\":{\"i\":-30}}", "invalid increment", &pch, 1); testOk(pch->final_type == valaddr.field_type, "final type unchanged (%d->%d)", valaddr.field_type, pch->final_type); testOk(pch->final_no_elements == valaddr.no_elements, "final no_elements unchanged (%ld->%ld)", valaddr.no_elements, pch->final_no_elements); TEST1(10, 4, 1, "wrapped"); dbChannelDelete(pch); #define TEST5(Incr, Left, Right, Type) \ testHead("Five %s elements from rec, increment " #Incr ", " Type " addressing", typname); \ createAndOpen(valname, "{\"arr\":{\"s\":" #Left ",\"e\":" #Right ",\"i\":" #Incr "}}", \ "(" #Left ":" #Incr ":" #Right ")", &pch, 1); \ testOk(pch->final_type == valaddr.field_type, \ "final type unchanged (%d->%d)", valaddr.field_type, pch->final_type); \ testOk(pch->final_no_elements == 4 / Incr + 1, \ "final no_elements correct (%ld->%ld)", valaddr.no_elements, pch->final_no_elements); \ TEST1(5, 0, Incr, "no offset"); \ TEST1(5, 3, Incr, "from upper block"); \ TEST1(5, 5, Incr, "wrapped"); \ TEST1(5, 9, Incr, "from lower block"); \ dbChannelDelete(pch); /* Contiguous block of 5 */ TEST5(1, 2, 6, "regular"); TEST5(1, -8, 6, "left side from-end"); TEST5(1, 2, -4, "right side from-end"); TEST5(1, -8, -4, "both sides from-end"); /* 5 elements with increment 2 */ TEST5(2, 2, 6, "regular"); TEST5(2, -8, 6, "left side from-end"); TEST5(2, 2, -4, "right side from-end"); TEST5(2, -8, -4, "both sides from-end"); /* 5 elements with increment 3 */ TEST5(3, 2, 6, "regular"); TEST5(3, -8, 6, "left side from-end"); TEST5(3, 2, -4, "right side from-end"); TEST5(3, -8, -4, "both sides from-end"); /* From buffer (plugin chain) */ #define TEST5B(Incr, Left, Right, Type) \ testHead("Five %s elements from buffer, increment " #Incr ", " Type " addressing", typname); \ createAndOpen(valname, "{\"arr\":{},\"arr\":{\"s\":" #Left ",\"e\":" #Right ",\"i\":" #Incr "}}", \ "(" #Left ":" #Incr ":" #Right ")", &pch, 2); \ testOk(pch->final_type == valaddr.field_type, \ "final type unchanged (%d->%d)", valaddr.field_type, pch->final_type); \ testOk(pch->final_no_elements == 4 / Incr + 1, \ "final no_elements correct (%ld->%ld)", valaddr.no_elements, pch->final_no_elements); \ TEST1(5, 0, Incr, "no offset"); \ dbChannelDelete(pch); /* Contiguous block of 5 */ TEST5B(1, 2, 6, "regular"); TEST5B(1, -8, 6, "left side from-end"); TEST5B(1, 2, -4, "right side from-end"); TEST5B(1, -8, -4, "both sides from-end"); /* 5 elements with increment 2 */ TEST5B(2, 2, 6, "regular"); TEST5B(2, -8, 6, "left side from-end"); TEST5B(2, 2, -4, "right side from-end"); TEST5B(2, -8, -4, "both sides from-end"); /* 5 elements with increment 3 */ TEST5B(3, 2, 6, "regular"); TEST5B(3, -8, 6, "left side from-end"); TEST5B(3, 2, -4, "right side from-end"); TEST5B(3, -8, -4, "both sides from-end"); }
static void check(short dbr_type) { dbChannel *pch; db_field_log *pfl; dbAddr valaddr; dbAddr offaddr; const char *offname = NULL, *valname = NULL, *typname = NULL; epicsInt32 buf[26]; long off, req; int i; switch (dbr_type) { case DBR_LONG: offname = "i32.OFF"; valname = "i32.VAL"; typname = "long"; break; case DBR_DOUBLE: offname = "f64.OFF"; valname = "f64.VAL"; typname = "double"; break; case DBR_STRING: offname = "c40.OFF"; valname = "c40.VAL"; typname = "string"; break; default: testDiag("Invalid data type %d", dbr_type); } (void) dbNameToAddr(offname, &offaddr); (void) dbNameToAddr(valname, &valaddr); testHead("Ten %s elements", typname); /* Fill the record's array field with data, 10..19 */ epicsInt32 ar[10] = {10,11,12,13,14,15,16,17,18,19}; (void) dbPutField(&valaddr, DBR_LONG, ar, 10); /* Open a channel to it, make sure no filters present */ createAndOpen(valname, &pch); testOk(pch->final_type == valaddr.field_type, "final type unchanged (%d->%d)", valaddr.field_type, pch->final_type); testOk(pch->final_no_elements == valaddr.no_elements, "final no_elements unchanged (%ld->%ld)", valaddr.no_elements, pch->final_no_elements); /* TEST1 sets the record's OFF field, then requests 10 elements from the channel, * passing in a transparent db_field_log and converting the data to LONG on the way in. * It checks that it got back the expected data and the right number of elements. */ #define TEST1(Size, Offset, Text, Expected) \ testDiag("Reading from offset = %d (%s)", Offset, Text); \ off = Offset; req = 10; \ memset(buf, 0, sizeof(buf)); \ (void) dbPutField(&offaddr, DBR_LONG, &off, 1); \ pfl = db_create_read_log(pch); \ testOk(pfl && pfl->type == dbfl_type_rec, "Valid pfl, type = rec"); \ testOk(!dbChannelGetField(pch, DBR_LONG, buf, NULL, &req, pfl), "Got Field value"); \ testOk(req == Size, "Got %ld elements (expected %d)", req, Size); \ if (!testOk(!memcmp(buf, Expected, sizeof(Expected)), "Data correct")) \ for (i=0; i<Size; i++) \ testDiag("Element %d expected %d got %d", i, Expected[i], buf[i]); \ db_delete_field_log(pfl); const epicsInt32 res_10_0[] = {10,11,12,13,14,15,16,17,18,19}; TEST1(10, 0, "no offset", res_10_0); const epicsInt32 res_10_4[] = {14,15,16,17,18,19,10,11,12,13}; TEST1(10, 4, "wrapped", res_10_4); /* Partial array */ testHead("Five %s elements", typname); off = 0; /* Reset offset for writing the next buffer */ (void) dbPutField(&offaddr, DBR_LONG, &off, 1); (void) dbPutField(&valaddr, DBR_LONG, &ar[5], 5); createAndOpen(valname, &pch); testOk(pch->final_type == valaddr.field_type, "final type unchanged (%d->%d)", valaddr.field_type, pch->final_type); testOk(pch->final_no_elements == valaddr.no_elements, "final no_elements unchanged (%ld->%ld)", valaddr.no_elements, pch->final_no_elements); const epicsInt32 res_5_0[] = {15,16,17,18,19}; TEST1(5, 0, "no offset", res_5_0); const epicsInt32 res_5_3[] = {18,19,15,16,17}; TEST1(5, 3, "wrapped", res_5_3); /* TEST2 sets the record's OFF field, then requests 15 elements from the channel * but passes in a db_field_log with alternate data, converting that data to LONG. * It checks that it got back the expected data and the right number of elements. */ #define TEST2(Size, Offset, Text, Expected) \ testDiag("Reading from offset = %d (%s)", Offset, Text); \ off = Offset; req = 15; \ memset(buf, 0, sizeof(buf)); \ (void) dbPutField(&offaddr, DBR_LONG, &off, 1); \ pfl = db_create_read_log(pch); \ pfl->type = dbfl_type_ref; \ pfl->field_type = DBF_CHAR; \ pfl->field_size = 1; \ pfl->no_elements = 26; \ pfl->u.r.dtor = freeArray; \ pfl->u.r.field = epicsStrDup("abcdefghijklmnopqrsstuvwxyz"); \ testOk(!dbChannelGetField(pch, DBR_LONG, buf, NULL, &req, pfl), "Got Field value"); \ testOk(req == Size, "Got %ld elements (expected %d)", req, Size); \ if (!testOk(!memcmp(buf, Expected, sizeof(Expected)), "Data correct")) \ for (i=0; i<Size; i++) \ testDiag("Element %d expected '%c' got '%c'", i, Expected[i], buf[i]); \ db_delete_field_log(pfl); testHead("Fifteen letters from field-log instead of %s", typname); const epicsInt32 res_15[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o'}; TEST2(15, 0, "no offset", res_15); TEST2(15, 10, "ignored", res_15); dbChannelDelete(pch); }