git-svn-id: https://profuse.googlecode.com/svn/branches/v2@279 aa027e90-d47c-11dd-86d7-074df07e0730

This commit is contained in:
ksherlock 2010-05-26 02:03:29 +00:00
parent 724d3c5ac3
commit 4de285c9e1
9 changed files with 757 additions and 64 deletions

View File

@ -31,6 +31,12 @@ File::File(const char *name, int flags, const std::nothrow_t&)
_fd = ::open(name, flags); _fd = ::open(name, flags);
} }
File::File(const char *name, int flags, mode_t mode, const std::nothrow_t&)
{
_fd = ::open(name, flags, mode);
}
File::File(const char *name, bool readOnly, const std::nothrow_t&) File::File(const char *name, bool readOnly, const std::nothrow_t&)
{ {
_fd = ::open(name, readOnly ? O_RDONLY : O_RDWR); _fd = ::open(name, readOnly ? O_RDONLY : O_RDWR);
@ -46,6 +52,16 @@ File::File(const char *name, int flags)
throw POSIXException( __METHOD__ ": open", errno); throw POSIXException( __METHOD__ ": open", errno);
} }
File::File(const char *name, int flags, mode_t mode)
{
#undef __METHOD__
#define __METHOD__ "File::File"
_fd = ::open(name, flags, mode);
if (_fd < 0)
throw POSIXException( __METHOD__ ": open", errno);
}
File::File(const char *name, bool readOnly) File::File(const char *name, bool readOnly)
{ {

View File

@ -16,9 +16,11 @@ class File {
File(int fd); File(int fd);
File(const char *name, int flags); File(const char *name, int flags);
File(const char *name, int flags, mode_t mode);
File(const char *name, bool readOnly); File(const char *name, bool readOnly);
File(const char *name, int flags, const std::nothrow_t &); File(const char *name, int flags, const std::nothrow_t &);
File(const char *name, int flags, mode_t mode, const std::nothrow_t &);
File(const char *name, bool readOnly, const std::nothrow_t &); File(const char *name, bool readOnly, const std::nothrow_t &);
~File(); ~File();

View File

@ -2,14 +2,14 @@
{ {
08FB7793FE84155DC02AAC07 /* Project object */ = { 08FB7793FE84155DC02AAC07 /* Project object */ = {
activeBuildConfigurationName = Debug; activeBuildConfigurationName = Debug;
activeExecutable = B656AF0411AA105500AB578A /* NibbleTest */; activeExecutable = B63EFCCF11A36C7300C90DCE /* apfm */;
activeTarget = B656AF0211AA105500AB578A /* NibbleTest */; activeTarget = B63EFCCD11A36C7300C90DCE /* apfm */;
addToTargets = ( addToTargets = (
); );
breakpoints = ( breakpoints = (
B63EFD8911A4455A00C90DCE /* apfm.cpp:346 */, B63EFD8911A4455A00C90DCE /* apfm.cpp:487 */,
B63EFE0E11A451C600C90DCE /* VolumeEntry.cpp:105 */, B63EFE0E11A451C600C90DCE /* VolumeEntry.cpp:105 */,
B63EFE3B11A4799800C90DCE /* apfm.cpp:184 */, B63EFE3B11A4799800C90DCE /* apfm.cpp:183 */,
B6F3642F11AA1E150045E114 /* NibbleTest.cpp:74 */, B6F3642F11AA1E150045E114 /* NibbleTest.cpp:74 */,
); );
codeSenseManager = B63EFA6811A093C200C90DCE /* Code sense */; codeSenseManager = B63EFA6811A093C200C90DCE /* Code sense */;
@ -144,6 +144,34 @@
B6F3647011AB35F00045E114 /* PBXTextBookmark */ = B6F3647011AB35F00045E114 /* PBXTextBookmark */; B6F3647011AB35F00045E114 /* PBXTextBookmark */ = B6F3647011AB35F00045E114 /* PBXTextBookmark */;
B6F3647111AB35FE0045E114 /* PBXTextBookmark */ = B6F3647111AB35FE0045E114 /* PBXTextBookmark */; B6F3647111AB35FE0045E114 /* PBXTextBookmark */ = B6F3647111AB35FE0045E114 /* PBXTextBookmark */;
B6F3647211AB35FE0045E114 /* PBXTextBookmark */ = B6F3647211AB35FE0045E114 /* PBXTextBookmark */; B6F3647211AB35FE0045E114 /* PBXTextBookmark */ = B6F3647211AB35FE0045E114 /* PBXTextBookmark */;
B6F3649411AB58E80045E114 /* PBXTextBookmark */ = B6F3649411AB58E80045E114 /* PBXTextBookmark */;
B6F3649511AB58E80045E114 /* PBXTextBookmark */ = B6F3649511AB58E80045E114 /* PBXTextBookmark */;
B6F3649611AB58E80045E114 /* PBXTextBookmark */ = B6F3649611AB58E80045E114 /* PBXTextBookmark */;
B6F3649711AB58E80045E114 /* XCBuildMessageTextBookmark */ = B6F3649711AB58E80045E114 /* XCBuildMessageTextBookmark */;
B6F3649811AB58E80045E114 /* PBXTextBookmark */ = B6F3649811AB58E80045E114 /* PBXTextBookmark */;
B6F3649E11AB59190045E114 /* PBXTextBookmark */ = B6F3649E11AB59190045E114 /* PBXTextBookmark */;
B6F3649F11AB59190045E114 /* XCBuildMessageTextBookmark */ = B6F3649F11AB59190045E114 /* XCBuildMessageTextBookmark */;
B6F364A011AB59190045E114 /* PBXTextBookmark */ = B6F364A011AB59190045E114 /* PBXTextBookmark */;
B6F364A511AB593E0045E114 /* PBXTextBookmark */ = B6F364A511AB593E0045E114 /* PBXTextBookmark */;
B6F364A911AB5EBD0045E114 /* PBXTextBookmark */ = B6F364A911AB5EBD0045E114 /* PBXTextBookmark */;
B6F364B111AB74F40045E114 /* XCBuildMessageTextBookmark */ = B6F364B111AB74F40045E114 /* XCBuildMessageTextBookmark */;
B6F364B211AB74F40045E114 /* PBXTextBookmark */ = B6F364B211AB74F40045E114 /* PBXTextBookmark */;
B6F364B611AB84840045E114 /* PBXTextBookmark */ = B6F364B611AB84840045E114 /* PBXTextBookmark */;
B6F364B711AB84840045E114 /* PBXTextBookmark */ = B6F364B711AB84840045E114 /* PBXTextBookmark */;
B6F364B811AB84840045E114 /* PBXTextBookmark */ = B6F364B811AB84840045E114 /* PBXTextBookmark */;
B6F364B911AB84840045E114 /* PBXTextBookmark */ = B6F364B911AB84840045E114 /* PBXTextBookmark */;
B6F364BE11AC92730045E114 /* PBXTextBookmark */ = B6F364BE11AC92730045E114 /* PBXTextBookmark */;
B6F364BF11AC92730045E114 /* XCBuildMessageTextBookmark */ = B6F364BF11AC92730045E114 /* XCBuildMessageTextBookmark */;
B6F364C011AC92730045E114 /* PBXTextBookmark */ = B6F364C011AC92730045E114 /* PBXTextBookmark */;
B6F364C811ACAB370045E114 /* PBXTextBookmark */ = B6F364C811ACAB370045E114 /* PBXTextBookmark */;
B6F364C911ACAB370045E114 /* PBXTextBookmark */ = B6F364C911ACAB370045E114 /* PBXTextBookmark */;
B6F364CA11ACAB370045E114 /* PBXTextBookmark */ = B6F364CA11ACAB370045E114 /* PBXTextBookmark */;
B6F364E811ACB5790045E114 /* PBXTextBookmark */ = B6F364E811ACB5790045E114 /* PBXTextBookmark */;
B6F364E911ACB5790045E114 /* XCBuildMessageTextBookmark */ = B6F364E911ACB5790045E114 /* XCBuildMessageTextBookmark */;
B6F364EB11ACB5790045E114 /* PBXTextBookmark */ = B6F364EB11ACB5790045E114 /* PBXTextBookmark */;
B6F364EC11ACB5790045E114 /* XCBuildMessageTextBookmark */ = B6F364EC11ACB5790045E114 /* XCBuildMessageTextBookmark */;
B6F364ED11ACB5790045E114 /* PBXTextBookmark */ = B6F364ED11ACB5790045E114 /* PBXTextBookmark */;
B6F364F511ACB5B60045E114 /* PBXTextBookmark */ = B6F364F511ACB5B60045E114 /* PBXTextBookmark */;
}; };
sourceControlManager = B63EFA6711A093C200C90DCE /* Source Control */; sourceControlManager = B63EFA6711A093C200C90DCE /* Source Control */;
userBuildSettings = { userBuildSettings = {
@ -319,16 +347,16 @@
}; };
B63EFAC911A09DAA00C90DCE /* File.cpp */ = { B63EFAC911A09DAA00C90DCE /* File.cpp */ = {
uiCtxt = { uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1264, 1209}}"; sepNavIntBoundsRect = "{{0, 0}, {838, 1534}}";
sepNavSelRange = "{1210, 0}"; sepNavSelRange = "{384, 0}";
sepNavVisRange = "{0, 1046}"; sepNavVisRange = "{0, 571}";
}; };
}; };
B63EFACA11A09DAA00C90DCE /* File.h */ = { B63EFACA11A09DAA00C90DCE /* File.h */ = {
uiCtxt = { uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1264, 932}}"; sepNavIntBoundsRect = "{{0, 0}, {701, 948}}";
sepNavSelRange = "{457, 0}"; sepNavSelRange = "{423, 0}";
sepNavVisRange = "{0, 611}"; sepNavVisRange = "{0, 888}";
}; };
}; };
B63EFACB11A09DAA00C90DCE /* MappedFile.cpp */ = { B63EFACB11A09DAA00C90DCE /* MappedFile.cpp */ = {
@ -361,9 +389,9 @@
}; };
B63EFAD211A09DB500C90DCE /* Exception.h */ = { B63EFAD211A09DB500C90DCE /* Exception.h */ = {
uiCtxt = { uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {838, 1898}}"; sepNavIntBoundsRect = "{{0, 0}, {838, 1885}}";
sepNavSelRange = "{734, 12}"; sepNavSelRange = "{783, 10}";
sepNavVisRange = "{434, 1049}"; sepNavVisRange = "{434, 1003}";
}; };
}; };
B63EFAD311A09DB500C90DCE /* Lock.cpp */ = { B63EFAD311A09DB500C90DCE /* Lock.cpp */ = {
@ -417,16 +445,16 @@
}; };
B63EFBEB11A244EE00C90DCE /* File.h */ = { B63EFBEB11A244EE00C90DCE /* File.h */ = {
uiCtxt = { uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1264, 2964}}"; sepNavIntBoundsRect = "{{0, 0}, {838, 3029}}";
sepNavSelRange = "{2767, 0}"; sepNavSelRange = "{2795, 35}";
sepNavVisRange = "{1820, 1622}"; sepNavVisRange = "{2292, 855}";
}; };
}; };
B63EFBEC11A244EE00C90DCE /* FileEntry.cpp */ = { B63EFBEC11A244EE00C90DCE /* FileEntry.cpp */ = {
uiCtxt = { uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {838, 5330}}"; sepNavIntBoundsRect = "{{0, 0}, {838, 7683}}";
sepNavSelRange = "{7404, 0}"; sepNavSelRange = "{1582, 0}";
sepNavVisRange = "{6413, 938}"; sepNavVisRange = "{1039, 851}";
}; };
}; };
B63EFBF111A244EE00C90DCE /* VolumeEntry.cpp */ = { B63EFBF111A244EE00C90DCE /* VolumeEntry.cpp */ = {
@ -475,9 +503,9 @@
}; };
B63EFC9911A35F7200C90DCE /* fuse_pascal.cpp */ = { B63EFC9911A35F7200C90DCE /* fuse_pascal.cpp */ = {
uiCtxt = { uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {701, 4004}}"; sepNavIntBoundsRect = "{{0, 0}, {838, 4121}}";
sepNavSelRange = "{7036, 0}"; sepNavSelRange = "{4176, 0}";
sepNavVisRange = "{5446, 1697}"; sepNavVisRange = "{3759, 970}";
}; };
}; };
B63EFC9B11A35F7B00C90DCE /* newfs_pascal.cpp */ = { B63EFC9B11A35F7B00C90DCE /* newfs_pascal.cpp */ = {
@ -496,9 +524,9 @@
}; };
B63EFC9F11A35F8F00C90DCE /* apfm.cpp */ = { B63EFC9F11A35F8F00C90DCE /* apfm.cpp */ = {
uiCtxt = { uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {838, 5187}}"; sepNavIntBoundsRect = "{{0, 0}, {701, 7228}}";
sepNavSelRange = "{1814, 0}"; sepNavSelRange = "{916, 0}";
sepNavVisRange = "{2880, 875}"; sepNavVisRange = "{800, 1552}";
}; };
}; };
B63EFCB211A3639400C90DCE /* PBXTextBookmark */ = { B63EFCB211A3639400C90DCE /* PBXTextBookmark */ = {
@ -573,12 +601,12 @@
fRef = B63EFAC911A09DAA00C90DCE /* File.cpp */; fRef = B63EFAC911A09DAA00C90DCE /* File.cpp */;
name = "File.cpp: 34"; name = "File.cpp: 34";
rLen = 0; rLen = 0;
rLoc = 385; rLoc = 504;
rType = 0; rType = 0;
vrLen = 225; vrLen = 225;
vrLoc = 284; vrLoc = 284;
}; };
B63EFD8911A4455A00C90DCE /* apfm.cpp:346 */ = { B63EFD8911A4455A00C90DCE /* apfm.cpp:487 */ = {
isa = PBXFileBreakpoint; isa = PBXFileBreakpoint;
actions = ( actions = (
); );
@ -590,7 +618,7 @@
functionName = "main(/* int argc, char **argv */)"; functionName = "main(/* int argc, char **argv */)";
hitCount = 0; hitCount = 0;
ignoreCount = 0; ignoreCount = 0;
lineNumber = 346; lineNumber = 487;
modificationTime = 296363159.802434; modificationTime = 296363159.802434;
originalNumberOfMultipleMatches = 1; originalNumberOfMultipleMatches = 1;
state = 0; state = 0;
@ -806,7 +834,7 @@
originalNumberOfMultipleMatches = 1; originalNumberOfMultipleMatches = 1;
state = 1; state = 1;
}; };
B63EFE3B11A4799800C90DCE /* apfm.cpp:184 */ = { B63EFE3B11A4799800C90DCE /* apfm.cpp:183 */ = {
isa = PBXFileBreakpoint; isa = PBXFileBreakpoint;
actions = ( actions = (
); );
@ -818,7 +846,7 @@
functionName = "action_cat(unsigned argc, char **argv, Pascal::VolumeEntry *volume)"; functionName = "action_cat(unsigned argc, char **argv, Pascal::VolumeEntry *volume)";
hitCount = 0; hitCount = 0;
ignoreCount = 0; ignoreCount = 0;
lineNumber = 184; lineNumber = 183;
modificationTime = 296363159.805745; modificationTime = 296363159.805745;
originalNumberOfMultipleMatches = 1; originalNumberOfMultipleMatches = 1;
state = 0; state = 0;
@ -902,6 +930,11 @@
name = VolumeEntry.cpp; name = VolumeEntry.cpp;
path = ./Pascal/VolumeEntry.cpp; path = ./Pascal/VolumeEntry.cpp;
sourceTree = "<group>"; sourceTree = "<group>";
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {838, 7085}}";
sepNavSelRange = "{3256, 0}";
sepNavVisRange = "{2568, 1113}";
};
}; };
B63EFEA711A488C200C90DCE /* PBXTextBookmark */ = { B63EFEA711A488C200C90DCE /* PBXTextBookmark */ = {
isa = PBXTextBookmark; isa = PBXTextBookmark;
@ -1048,9 +1081,9 @@
}; };
B656AEFE11AA0F8C00AB578A /* NibbleTest.cpp */ = { B656AEFE11AA0F8C00AB578A /* NibbleTest.cpp */ = {
uiCtxt = { uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {838, 1079}}"; sepNavIntBoundsRect = "{{0, 0}, {701, 1079}}";
sepNavSelRange = "{1570, 0}"; sepNavSelRange = "{1570, 0}";
sepNavVisRange = "{917, 940}"; sepNavVisRange = "{173, 1684}";
}; };
}; };
B656AF0211AA105500AB578A /* NibbleTest */ = { B656AF0211AA105500AB578A /* NibbleTest */ = {
@ -1102,7 +1135,7 @@
fRef = B63EFBEC11A244EE00C90DCE /* FileEntry.cpp */; fRef = B63EFBEC11A244EE00C90DCE /* FileEntry.cpp */;
name = "FileEntry.cpp: 372"; name = "FileEntry.cpp: 372";
rLen = 0; rLen = 0;
rLoc = 7404; rLoc = 11357;
rType = 0; rType = 0;
vrLen = 938; vrLen = 938;
vrLoc = 6413; vrLoc = 6413;
@ -1112,7 +1145,7 @@
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */; fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
name = "apfm.cpp: 107"; name = "apfm.cpp: 107";
rLen = 0; rLen = 0;
rLoc = 1814; rLoc = 1824;
rType = 0; rType = 0;
vrLen = 875; vrLen = 875;
vrLoc = 2880; vrLoc = 2880;
@ -1172,7 +1205,7 @@
fRef = B63EFEA511A488C200C90DCE /* VolumeEntry.cpp */; fRef = B63EFEA511A488C200C90DCE /* VolumeEntry.cpp */;
name = "VolumeEntry.cpp: 460"; name = "VolumeEntry.cpp: 460";
rLen = 0; rLen = 0;
rLoc = 9665; rLoc = 10173;
rType = 0; rType = 0;
vrLen = 797; vrLen = 797;
vrLoc = 8547; vrLoc = 8547;
@ -1319,4 +1352,284 @@
sourceDirectories = ( sourceDirectories = (
); );
}; };
B6F3649411AB58E80045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B656AEFE11AA0F8C00AB578A /* NibbleTest.cpp */;
name = "NibbleTest.cpp: 70";
rLen = 0;
rLoc = 1570;
rType = 0;
vrLen = 940;
vrLoc = 917;
};
B6F3649511AB58E80045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B6F3647B11AB361D0045E114 /* xattr.cpp */;
name = "xattr.cpp: 1";
rLen = 0;
rLoc = 0;
rType = 0;
vrLen = 985;
vrLoc = 0;
};
B6F3649611AB58E80045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFC9911A35F7200C90DCE /* fuse_pascal.cpp */;
name = "fuse_pascal.cpp: 187";
rLen = 0;
rLoc = 4176;
rType = 0;
vrLen = 970;
vrLoc = 3759;
};
B6F3649711AB58E80045E114 /* XCBuildMessageTextBookmark */ = {
isa = PBXTextBookmark;
comments = "Prototype for 'File::File(const char*, int, mode_t, const std::nothrow_t&)' does not match any in class 'File'";
fRef = B63EFAC911A09DAA00C90DCE /* File.cpp */;
fallbackIsa = XCBuildMessageTextBookmark;
rLen = 1;
rLoc = 34;
rType = 1;
};
B6F3649811AB58E80045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFAC911A09DAA00C90DCE /* File.cpp */;
name = "File.cpp: 35";
rLen = 0;
rLoc = 384;
rType = 0;
vrLen = 571;
vrLoc = 0;
};
B6F3649E11AB59190045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFAC911A09DAA00C90DCE /* File.cpp */;
name = "File.cpp: 35";
rLen = 0;
rLoc = 384;
rType = 0;
vrLen = 571;
vrLoc = 0;
};
B6F3649F11AB59190045E114 /* XCBuildMessageTextBookmark */ = {
isa = PBXTextBookmark;
comments = "'File' has not been declared";
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
fallbackIsa = XCBuildMessageTextBookmark;
rLen = 1;
rLoc = 279;
rType = 1;
};
B6F364A011AB59190045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
name = "apfm.cpp: 281";
rLen = 66;
rLoc = 5764;
rType = 0;
vrLen = 849;
vrLoc = 5157;
};
B6F364A511AB593E0045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
name = "apfm.cpp: 281";
rLen = 66;
rLoc = 5764;
rType = 0;
vrLen = 855;
vrLoc = 5157;
};
B6F364A911AB5EBD0045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
name = "apfm.cpp: 281";
rLen = 66;
rLoc = 5764;
rType = 0;
vrLen = 855;
vrLoc = 5157;
};
B6F364B111AB74F40045E114 /* XCBuildMessageTextBookmark */ = {
isa = PBXTextBookmark;
comments = "'kTextFile' was not declared in this scope";
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
fallbackIsa = XCBuildMessageTextBookmark;
rLen = 1;
rLoc = 382;
rType = 1;
};
B6F364B211AB74F40045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
name = "apfm.cpp: 385";
rLen = 0;
rLoc = 8425;
rType = 0;
vrLen = 715;
vrLoc = 8003;
};
B6F364B611AB84840045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
name = "apfm.cpp: 385";
rLen = 0;
rLoc = 8425;
rType = 0;
vrLen = 715;
vrLoc = 8003;
};
B6F364B711AB84840045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFAD211A09DB500C90DCE /* Exception.h */;
name = "Exception.h: 39";
rLen = 10;
rLoc = 783;
rType = 0;
vrLen = 1003;
vrLoc = 434;
};
B6F364B811AB84840045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFEA511A488C200C90DCE /* VolumeEntry.cpp */;
name = "VolumeEntry.cpp: 464";
rLen = 0;
rLoc = 10173;
rType = 0;
vrLen = 563;
vrLoc = 8511;
};
B6F364B911AB84840045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFEA511A488C200C90DCE /* VolumeEntry.cpp */;
name = "VolumeEntry.cpp: 473";
rLen = 0;
rLoc = 10173;
rType = 0;
vrLen = 546;
vrLoc = 8717;
};
B6F364BE11AC92730045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFEA511A488C200C90DCE /* VolumeEntry.cpp */;
name = "VolumeEntry.cpp: 473";
rLen = 0;
rLoc = 10173;
rType = 0;
vrLen = 546;
vrLoc = 8717;
};
B6F364BF11AC92730045E114 /* XCBuildMessageTextBookmark */ = {
isa = PBXTextBookmark;
comments = "'volume' is not a class or namespace";
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
fallbackIsa = XCBuildMessageTextBookmark;
rLen = 1;
rLoc = 378;
rType = 1;
};
B6F364C011AC92730045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
name = "apfm.cpp: 381";
rLen = 0;
rLoc = 8337;
rType = 0;
vrLen = 667;
vrLoc = 7907;
};
B6F364C811ACAB370045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFC9F11A35F8F00C90DCE /* apfm.cpp */;
name = "apfm.cpp: 381";
rLen = 0;
rLoc = 8337;
rType = 0;
vrLen = 667;
vrLoc = 7907;
};
B6F364C911ACAB370045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFEA511A488C200C90DCE /* VolumeEntry.cpp */;
name = "VolumeEntry.cpp: 473";
rLen = 0;
rLoc = 10173;
rType = 0;
vrLen = 546;
vrLoc = 8717;
};
B6F364CA11ACAB370045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFEA511A488C200C90DCE /* VolumeEntry.cpp */;
name = "VolumeEntry.cpp: 475";
rLen = 0;
rLoc = 10173;
rType = 0;
vrLen = 490;
vrLoc = 8968;
};
B6F364E811ACB5790045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFBEC11A244EE00C90DCE /* FileEntry.cpp */;
name = "FileEntry.cpp: 86";
rLen = 0;
rLoc = 1582;
rType = 0;
vrLen = 851;
vrLoc = 1039;
};
B6F364E911ACB5790045E114 /* XCBuildMessageTextBookmark */ = {
isa = PBXTextBookmark;
comments = "'void Pascal::VolumeEntry::writeEntry(Pascal::FileEntry*)' is private";
fRef = B6F364EA11ACB5790045E114 /* File.h */;
fallbackIsa = XCBuildMessageTextBookmark;
rLen = 1;
rLoc = 137;
rType = 1;
};
B6F364EA11ACB5790045E114 /* File.h */ = {
isa = PBXFileReference;
name = File.h;
path = ./Pascal/File.h;
sourceTree = "<group>";
};
B6F364EB11ACB5790045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFBEB11A244EE00C90DCE /* File.h */;
name = "File.h: 141";
rLen = 35;
rLoc = 2795;
rType = 0;
vrLen = 855;
vrLoc = 2292;
};
B6F364EC11ACB5790045E114 /* XCBuildMessageTextBookmark */ = {
isa = PBXTextBookmark;
comments = "'_file' was not declared in this scope";
fRef = B63EFEA511A488C200C90DCE /* VolumeEntry.cpp */;
fallbackIsa = XCBuildMessageTextBookmark;
rLen = 1;
rLoc = 154;
rType = 1;
};
B6F364ED11ACB5790045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFEA511A488C200C90DCE /* VolumeEntry.cpp */;
name = "VolumeEntry.cpp: 154";
rLen = 0;
rLoc = 3256;
rType = 0;
vrLen = 1019;
vrLoc = 2603;
};
B6F364F511ACB5B60045E114 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = B63EFEA511A488C200C90DCE /* VolumeEntry.cpp */;
name = "VolumeEntry.cpp: 155";
rLen = 0;
rLoc = 3256;
rType = 0;
vrLen = 1113;
vrLoc = 2568;
};
} }

View File

@ -231,8 +231,6 @@
<key>Layout</key> <key>Layout</key>
<array> <array>
<dict> <dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key> <key>ContentConfiguration</key>
<dict> <dict>
<key>PBXBottomSmartGroupGIDs</key> <key>PBXBottomSmartGroupGIDs</key>
@ -269,13 +267,17 @@
<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key> <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
<array> <array>
<string>08FB7794FE84155DC02AAC07</string> <string>08FB7794FE84155DC02AAC07</string>
<string>B63EFBE711A244EE00C90DCE</string>
<string>B63EFACF11A09DB500C90DCE</string>
<string>B63EFAC811A09DAA00C90DCE</string>
<string>B656ADED11A84D3200AB578A</string> <string>B656ADED11A84D3200AB578A</string>
<string>1C37FBAC04509CD000000102</string> <string>1C37FBAC04509CD000000102</string>
</array> </array>
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key> <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array> <array>
<array> <array>
<integer>2</integer> <integer>10</integer>
<integer>7</integer>
<integer>0</integer> <integer>0</integer>
</array> </array>
</array> </array>
@ -297,7 +299,7 @@
<real>318</real> <real>318</real>
</array> </array>
<key>RubberWindowFrame</key> <key>RubberWindowFrame</key>
<string>394 69 1239 1000 0 0 1920 1178 </string> <string>489 -24 1239 1000 0 0 1920 1178 </string>
</dict> </dict>
<key>Module</key> <key>Module</key>
<string>PBXSmartGroupTreeModule</string> <string>PBXSmartGroupTreeModule</string>
@ -308,12 +310,14 @@
<key>Dock</key> <key>Dock</key>
<array> <array>
<dict> <dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key> <key>ContentConfiguration</key>
<dict> <dict>
<key>PBXProjectModuleGUID</key> <key>PBXProjectModuleGUID</key>
<string>B63EFA6111A093C200C90DCE</string> <string>B63EFA6111A093C200C90DCE</string>
<key>PBXProjectModuleLabel</key> <key>PBXProjectModuleLabel</key>
<string>NibbleTest.cpp</string> <string>VolumeEntry.cpp</string>
<key>PBXSplitModuleInNavigatorKey</key> <key>PBXSplitModuleInNavigatorKey</key>
<dict> <dict>
<key>Split0</key> <key>Split0</key>
@ -321,11 +325,11 @@
<key>PBXProjectModuleGUID</key> <key>PBXProjectModuleGUID</key>
<string>B63EFA6211A093C200C90DCE</string> <string>B63EFA6211A093C200C90DCE</string>
<key>PBXProjectModuleLabel</key> <key>PBXProjectModuleLabel</key>
<string>NibbleTest.cpp</string> <string>VolumeEntry.cpp</string>
<key>_historyCapacity</key> <key>_historyCapacity</key>
<integer>0</integer> <integer>0</integer>
<key>bookmark</key> <key>bookmark</key>
<string>B6F3647211AB35FE0045E114</string> <string>B6F364F511ACB5B60045E114</string>
<key>history</key> <key>history</key>
<array> <array>
<string>B63EFC2611A2D5A400C90DCE</string> <string>B63EFC2611A2D5A400C90DCE</string>
@ -333,7 +337,6 @@
<string>B63EFC3211A2D5A400C90DCE</string> <string>B63EFC3211A2D5A400C90DCE</string>
<string>B63EFCB211A3639400C90DCE</string> <string>B63EFCB211A3639400C90DCE</string>
<string>B63EFCB611A3639400C90DCE</string> <string>B63EFCB611A3639400C90DCE</string>
<string>B63EFD7F11A4436B00C90DCE</string>
<string>B63EFDA011A4488200C90DCE</string> <string>B63EFDA011A4488200C90DCE</string>
<string>B63EFDA511A4488200C90DCE</string> <string>B63EFDA511A4488200C90DCE</string>
<string>B63EFDA711A4488200C90DCE</string> <string>B63EFDA711A4488200C90DCE</string>
@ -351,7 +354,6 @@
<string>B63EFEA111A488C200C90DCE</string> <string>B63EFEA111A488C200C90DCE</string>
<string>B63EFEA211A488C200C90DCE</string> <string>B63EFEA211A488C200C90DCE</string>
<string>B63EFEA311A488C200C90DCE</string> <string>B63EFEA311A488C200C90DCE</string>
<string>B63EFEA711A488C200C90DCE</string>
<string>B63EFEA811A488C200C90DCE</string> <string>B63EFEA811A488C200C90DCE</string>
<string>B63EFEA911A488C200C90DCE</string> <string>B63EFEA911A488C200C90DCE</string>
<string>B63EFEEC11A4A70400C90DCE</string> <string>B63EFEEC11A4A70400C90DCE</string>
@ -359,21 +361,25 @@
<string>B6E5F0F211A73144000AD141</string> <string>B6E5F0F211A73144000AD141</string>
<string>B6E5F11211A73340000AD141</string> <string>B6E5F11211A73340000AD141</string>
<string>B6E5F13A11A74F2B000AD141</string> <string>B6E5F13A11A74F2B000AD141</string>
<string>B6E5F18111A76B74000AD141</string>
<string>B6E5F18211A76B74000AD141</string> <string>B6E5F18211A76B74000AD141</string>
<string>B656AE2311A84FA400AB578A</string>
<string>B656AE2411A84FA400AB578A</string> <string>B656AE2411A84FA400AB578A</string>
<string>B656AE2611A84FA400AB578A</string> <string>B656AE2611A84FA400AB578A</string>
<string>B656AE2711A84FA400AB578A</string> <string>B656AE2711A84FA400AB578A</string>
<string>B656AE6511A8591F00AB578A</string>
<string>B656AEA711A9C91600AB578A</string> <string>B656AEA711A9C91600AB578A</string>
<string>B656AEA811A9C91600AB578A</string> <string>B656AEA811A9C91600AB578A</string>
<string>B656AF2711AA10C900AB578A</string>
<string>B656AF2811AA10C900AB578A</string>
<string>B656AF2A11AA10C900AB578A</string> <string>B656AF2A11AA10C900AB578A</string>
<string>B6F3642D11AA1E070045E114</string> <string>B6F3642D11AA1E070045E114</string>
<string>B6F3647111AB35FE0045E114</string> <string>B6F3647111AB35FE0045E114</string>
<string>B6F3647011AB35F00045E114</string> <string>B6F3649411AB58E80045E114</string>
<string>B6F3649511AB58E80045E114</string>
<string>B6F3649611AB58E80045E114</string>
<string>B6F3649E11AB59190045E114</string>
<string>B6F364B711AB84840045E114</string>
<string>B6F364C811ACAB370045E114</string>
<string>B6F364E811ACB5790045E114</string>
<string>B6F364E911ACB5790045E114</string>
<string>B6F364EB11ACB5790045E114</string>
<string>B6F364EC11ACB5790045E114</string>
</array> </array>
</dict> </dict>
<key>SplitCount</key> <key>SplitCount</key>
@ -389,7 +395,7 @@
<key>Frame</key> <key>Frame</key>
<string>{{0, 0}, {899, 562}}</string> <string>{{0, 0}, {899, 562}}</string>
<key>RubberWindowFrame</key> <key>RubberWindowFrame</key>
<string>394 69 1239 1000 0 0 1920 1178 </string> <string>489 -24 1239 1000 0 0 1920 1178 </string>
</dict> </dict>
<key>Module</key> <key>Module</key>
<string>PBXNavigatorGroup</string> <string>PBXNavigatorGroup</string>
@ -413,8 +419,6 @@
<dict> <dict>
<key>Frame</key> <key>Frame</key>
<string>{{10, 27}, {899, 365}}</string> <string>{{10, 27}, {899, 365}}</string>
<key>RubberWindowFrame</key>
<string>394 69 1239 1000 0 0 1920 1178 </string>
</dict> </dict>
<key>Module</key> <key>Module</key>
<string>XCDetailModule</string> <string>XCDetailModule</string>
@ -468,7 +472,9 @@
<key>GeometryConfiguration</key> <key>GeometryConfiguration</key>
<dict> <dict>
<key>Frame</key> <key>Frame</key>
<string>{{10, 27}, {899, 349}}</string> <string>{{10, 27}, {899, 365}}</string>
<key>RubberWindowFrame</key>
<string>489 -24 1239 1000 0 0 1920 1178 </string>
</dict> </dict>
<key>Module</key> <key>Module</key>
<string>PBXBuildResultsModule</string> <string>PBXBuildResultsModule</string>
@ -690,10 +696,14 @@
<integer>5</integer> <integer>5</integer>
<key>WindowOrderList</key> <key>WindowOrderList</key>
<array> <array>
<string>B6F364EE11ACB5790045E114</string>
<string>B6F364C211AC92730045E114</string>
<string>B6F364C111AC92730045E114</string>
<string>/Users/kelvin/Projects/PROFuseX/PROFuseX.xcodeproj</string> <string>/Users/kelvin/Projects/PROFuseX/PROFuseX.xcodeproj</string>
<string>B6F364CC11ACAB370045E114</string>
</array> </array>
<key>WindowString</key> <key>WindowString</key>
<string>394 69 1239 1000 0 0 1920 1178 </string> <string>489 -24 1239 1000 0 0 1920 1178 </string>
<key>WindowToolsV3</key> <key>WindowToolsV3</key>
<array> <array>
<dict> <dict>

View File

@ -144,7 +144,7 @@
B656AEFE11AA0F8C00AB578A /* NibbleTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NibbleTest.cpp; sourceTree = "<group>"; }; B656AEFE11AA0F8C00AB578A /* NibbleTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NibbleTest.cpp; sourceTree = "<group>"; };
B656AF0311AA105500AB578A /* NibbleTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NibbleTest; sourceTree = BUILT_PRODUCTS_DIR; }; B656AF0311AA105500AB578A /* NibbleTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = NibbleTest; sourceTree = BUILT_PRODUCTS_DIR; };
B6F3647B11AB361D0045E114 /* xattr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xattr.cpp; sourceTree = "<group>"; }; B6F3647B11AB361D0045E114 /* xattr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xattr.cpp; sourceTree = "<group>"; };
B6F3648011AB36260045E114 /* xattr */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; name = xattr; path = build/Debug/xattr; sourceTree = "<group>"; }; B6F3648011AB36260045E114 /* xattr */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = xattr; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */

View File

@ -45,7 +45,7 @@ public:
unsigned lastBlock() const { return _lastBlock; } unsigned lastBlock() const { return _lastBlock; }
unsigned fileKind() const { return _fileKind; } unsigned fileKind() const { return _fileKind; }
unsigned inode() const { return _inode; } unsigned inode() const { return _inode; }
void setInode(unsigned inode) { _inode = inode; } void setInode(unsigned inode) { _inode = inode; }
@ -124,6 +124,9 @@ protected:
virtual void writeDirectoryEntry(LittleEndian::IOBuffer *); virtual void writeDirectoryEntry(LittleEndian::IOBuffer *);
private: private:
friend class FileEntry;
VolumeEntry(); VolumeEntry();
void init(void *); void init(void *);
@ -174,19 +177,31 @@ class FileEntry : public Entry {
int read(uint8_t *buffer, unsigned size, unsigned offset); int read(uint8_t *buffer, unsigned size, unsigned offset);
int write(uint8_t *buffer, unsigned size, unsigned offset); int write(uint8_t *buffer, unsigned size, unsigned offset);
int truncate(unsigned newSize);
const char *name() const { return _fileName; } const char *name() const { return _fileName; }
Date modification() const { return _modification; } Date modification() const { return _modification; }
void setFileKind(unsigned kind);
protected: protected:
virtual void writeDirectoryEntry(LittleEndian::IOBuffer *); virtual void writeDirectoryEntry(LittleEndian::IOBuffer *);
private: private:
friend class VolumeEntry; friend class VolumeEntry;
void setName(const char *name); void setName(const char *name);
void extend(unsigned newSize);
unsigned _status; unsigned _status;
@ -196,6 +211,12 @@ class FileEntry : public Entry {
unsigned _lastByte; unsigned _lastByte;
Date _modification; Date _modification;
unsigned _maxFileSize; // maximum file size.
// non-text files // non-text files
unsigned dataFileSize(); unsigned dataFileSize();
int dataRead(uint8_t *buffer, unsigned size, unsigned offset); int dataRead(uint8_t *buffer, unsigned size, unsigned offset);

View File

@ -3,6 +3,7 @@
#include <cstring> #include <cstring>
#include <cctype> #include <cctype>
#include <memory> #include <memory>
#include <cerrno>
#include <Pascal/File.h> #include <Pascal/File.h>
@ -44,6 +45,7 @@ FileEntry::FileEntry(void *vp) :
_fileSize = 0; _fileSize = 0;
_pageSize = NULL; _pageSize = NULL;
_maxFileSize = 0;
} }
FileEntry::FileEntry(const char *name, unsigned fileKind) FileEntry::FileEntry(const char *name, unsigned fileKind)
@ -69,6 +71,7 @@ FileEntry::FileEntry(const char *name, unsigned fileKind)
_fileSize = 0; _fileSize = 0;
_pageSize = NULL; _pageSize = NULL;
_maxFileSize = 0;
} }
FileEntry::~FileEntry() FileEntry::~FileEntry()
@ -77,6 +80,13 @@ FileEntry::~FileEntry()
} }
void FileEntry::setFileKind(unsigned kind)
{
_fileKind = kind;
parent()->writeEntry(this);
}
void FileEntry::setName(const char *name) void FileEntry::setName(const char *name)
{ {
#undef __METHOD__ #undef __METHOD__
@ -93,6 +103,8 @@ void FileEntry::setName(const char *name)
// not sure if this is a good idea or not. // not sure if this is a good idea or not.
//_modification = Date::Today(); //_modification = Date::Today();
parent()->writeEntry(this);
} }
unsigned FileEntry::fileSize() unsigned FileEntry::fileSize()
@ -138,6 +150,163 @@ int FileEntry::read(uint8_t *buffer, unsigned size, unsigned offset)
} }
int FileEntry::truncate(unsigned newSize)
{
#undef __METHOD__
#define __METHOD__ "FileEntry::truncate"
unsigned currentSize = fileSize();
if (currentSize == newSize) return 0;
if (fileKind() == kTextFile)
{
if (newSize)
throw ProFUSE::Exception(__METHOD__ ": unable to truncate text file.");
if (_pageSize) _pageSize->clear();
}
extend(newSize);
_modification = Date::Today();
parent()->writeEntry(this);
return 0;
}
/*
* extend -- common truncation code.
* updates _lastByte and _lastBlock but does
* not update _modification or commit to disk.
*/
void FileEntry::extend(unsigned newSize)
{
#undef __METHOD__
#define __METHOD__ "FileEntry::extend"
unsigned currentSize = fileSize();
if (newSize == currentSize) return;
if (newSize > currentSize)
{
if (newSize > _maxFileSize)
throw ProFUSE::POSIXException(__METHOD__ ": Unable to extend file.", ENOSPC);
unsigned remainder = newSize - currentSize;
unsigned block = _lastBlock;
if (_lastByte != 512)
{
// last page not full
unsigned count = std::min(512 - _lastByte, remainder);
uint8_t *address = (uint8_t *)parent()->loadBlock(block);
std::memset(address + _lastByte, 0, count);
parent()->unloadBlock(block, true);
remainder -= count;
}
block++;
while (remainder)
{
unsigned count = std::min(512u, remainder);
uint8_t *address = (uint8_t *)parent()->loadBlock(block);
std::memset(address, 0, count);
parent()->unloadBlock(block, true);
remainder -= count;
block++;
}
}
_lastBlock = _firstBlock + newSize / 512;
_lastByte = newSize % 512;
if (_lastByte = 0) _lastByte = 512;
}
int FileEntry::write(uint8_t *buffer, unsigned size, unsigned offset)
{
#undef __METHOD__
#define __METHOD__ "FileEntry::write"
if (fileKind() == kTextFile)
{
throw ProFUSE::Exception(__METHOD__ ": Text Files are too weird.");
}
unsigned currentSize = fileSize();
unsigned newSize = std::max(offset + size, currentSize);
if (newSize > _maxFileSize)
{
throw ProFUSE::POSIXException(__METHOD__ ": Unable to extend file.", ENOSPC);
}
if (offset > currentSize)
{
extend(offset);
}
// now write the data...
unsigned block = _firstBlock + offset / 512;
unsigned start = offset % 512;
unsigned remainder = size;
if (start)
{
unsigned count = std::min(512 - start, remainder);
uint8_t *address = (uint8_t *)parent()->loadBlock(block);
std::memcpy(address + start, buffer, count);
parent()->unloadBlock(block, true);
remainder -= count;
buffer += count;
block++;
}
while (remainder)
{
uint8_t *address = (uint8_t *)parent()->loadBlock(block);
unsigned count = std::min(512u, size);
std::memcpy(address, buffer, count);
parent()->unloadBlock(block, true);
remainder -= count;
buffer += count;
block++;
}
if (newSize > currentSize)
{
_lastBlock = _firstBlock + currentSize / 512;
_lastByte = currentSize % 512;
if (_lastByte == 0) _lastByte = 512;
}
_modification = Date::Today();
parent()->writeEntry(this);
return size;
}
unsigned FileEntry::dataFileSize() unsigned FileEntry::dataFileSize()
{ {
return blocks() * 512 - 512 + _lastByte; return blocks() * 512 - 512 + _lastByte;

View File

@ -132,6 +132,8 @@ VolumeEntry::VolumeEntry(Device::BlockDevice *device)
try try
{ {
std::vector<FileEntry *>::reverse_iterator iter;
for (unsigned i = 1; i <= _fileCount; ++i) for (unsigned i = 1; i <= _fileCount; ++i)
{ {
std::auto_ptr<FileEntry> child; std::auto_ptr<FileEntry> child;
@ -142,12 +144,26 @@ VolumeEntry::VolumeEntry(Device::BlockDevice *device)
child->setInode(++_inodeGenerator); child->setInode(++_inodeGenerator);
child->_parent = this; child->_parent = this;
child->_address = 512 * 2 + i * 0x1a; child->_address = 512 * 2 + i * 0x1a;
_files.push_back(child.release()); _files.push_back(child.release());
} }
// sanity check _firstBlock, _lastBlock?
// set up _maxBlocks;
unsigned lastBlock = _lastVolumeBlock;
for (iter = _files.rbegin(); iter != _files.rend(); ++iter)
{
FileEntry *e = *iter;
e->_maxFileSize = (lastBlock - e->_firstBlock) * 512;
lastBlock = e->_firstBlock - 1;
}
} }
catch (...) catch (...)
{ {
std::vector<FileEntry *>::iterator iter; std::vector<FileEntry *>::iterator iter;
for(iter = _files.begin(); iter != _files.end(); ++iter) for(iter = _files.begin(); iter != _files.end(); ++iter)
{ {
if (*iter) delete *iter; if (*iter) delete *iter;
@ -155,7 +171,7 @@ VolumeEntry::VolumeEntry(Device::BlockDevice *device)
throw; throw;
} }
} }
@ -224,6 +240,7 @@ unsigned VolumeEntry::unlink(const char *name)
{ {
unsigned index; unsigned index;
// TODO -- update _maxFileSize.
if (_device->readOnly()) return ProFUSE::drvrWrtProt; // WRITE-PROTECTED DISK if (_device->readOnly()) return ProFUSE::drvrWrtProt; // WRITE-PROTECTED DISK

153
apfm.cpp
View File

@ -15,12 +15,13 @@
#include <unistd.h> #include <unistd.h>
#include <strings.h> #include <strings.h>
#include <sys/stat.h>
#include <Pascal/File.h> #include <Pascal/File.h>
#include <Pascal/Date.h> #include <Pascal/Date.h>
#include <Device/BlockDevice.h> #include <Device/BlockDevice.h>
#include <File/File.h>
const char *MonthName(unsigned m) const char *MonthName(unsigned m)
{ {
@ -101,9 +102,7 @@ void printFileEntry(Pascal::FileEntry *e, bool extended)
} }
int action_ls(int argc, char **argv, Pascal::VolumeEntry *volume) int action_ls(int argc, char **argv, Pascal::VolumeEntry *volume)
{ {
//TODO -- check for -l flag.
bool extended = false; bool extended = false;
unsigned fileCount = volume->fileCount(); unsigned fileCount = volume->fileCount();
unsigned used = volume->blocks(); unsigned used = volume->blocks();
@ -253,6 +252,148 @@ int action_krunch(int argc, char **argv, Pascal::VolumeEntry *volume)
int action_get(int argc, char **argv, Pascal::VolumeEntry *volume)
{
// get pascal_file [native file];
char *infile;
char *outfile;
Pascal::FileEntry *entry;
switch(argc)
{
case 1:
infile = outfile = argv[0];
break;
case 2:
infile = argv[0];
outfile = argv[1];
break;
default:
std::fprintf(stderr, "apfm cat: Please specify an infile (and an optional outfile)\n");
}
entry = volume->fileByName(infile);
File::File file(outfile, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (!entry)
{
std::fprintf(stderr, "apfm get: %s: no such file.\n", infile);
return 1;
}
unsigned fileSize = entry->fileSize();
unsigned offset = 0;
while (offset < fileSize)
{
uint8_t buffer[512];
unsigned count = std::min(512u, fileSize - offset);
entry->read(buffer, count, offset);
::write(file.fd(), buffer, count);
offset += count;
}
return 0;
}
#if 0
int action_put(int argc, char **argv, Pascal::VolumeEntry *volume)
{
// put [-t type] native_file [pascal_file]
unsigned type = Pascal::kUntypedFile;
struct stat st;
int c;
char *infile;
char *outfile;
char *tmp;
while ((c = getopt(argc, argv, "t:")) != -1)
{
switch (c)
{
case 't':
if (!::strcasecmp("text", optarg))
type = Pascal::kTextFile;
else if (!::strcasecmp("txt", optarg))
type = Pascal::kTextFile;
else if (!::strcasecmp("code", optarg))
type = Pascal::kCodeFile;
else if (!::strcasecmp("info", optarg))
type = Pascal::kInfoFile;
else if (!::strcasecmp("data", optarg))
type = Pascal::kDataFile;
else if (!::strcasecmp("graf", optarg))
type = Pascal::kGrafFile;
else if (!::strcasecmp("foto", optarg))
type = Pascal::kFotoFile;
else type = Pascal::kUntypedFile;
break;
}
}
// TODO -- if file is named .txt or .text, default to kTextFile.
argc -= optind;
argv += optind;
switch (argc)
{
case 1:
infile = outfile = argv[0];
// need to run basename on outfile.
tmp = strrchr(outfile, '/');
if (tmp) outfile = tmp + 1;
break;
case 2:
infile = argv[0];
outfile = argv[1];
break;
}
if (!Pascal::FileEntry::ValidName(outfile))
{
std::fprintf(stderr, "apfm put: `%s' is not a valid pascal name.\n", outfile);
}
::stat(infile, &st);
File::File file(infile, O_RDONLY);
unsigned blocks = (st.st_size + 511) / 511;
// TODO -- if text file, ..
Pascal::FileEntry *entry = volume.createFile(infile, blocks);
entry->setType(type);
if (type == Pascal::kTextFile)
{
//...
}
else
{
// ...
}
return 0;
}
#endif
void usage() void usage()
{ {
@ -370,6 +511,10 @@ int main(int argc, char **argv)
if (!::strcasecmp("mv", action)) return action_mv(argc - 1, argv + 1, volume.get()); if (!::strcasecmp("mv", action)) return action_mv(argc - 1, argv + 1, volume.get());
if (!::strcasecmp("rm", action)) return action_rm(argc - 1, argv + 1, volume.get()); if (!::strcasecmp("rm", action)) return action_rm(argc - 1, argv + 1, volume.get());
if (!::strcasecmp("get", action)) return action_get(argc -1, argv + 1, volume.get());
//if (!::strcasecmp("put", action)) return action_put(argc -1, argv + 1, volume.get());
usage(); usage();
return 3; return 3;
} }