aboutsummaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
authorMike Buland <mike@xagasoft.com>2024-08-27 13:37:36 -0700
committerMike Buland <mike@xagasoft.com>2024-08-27 13:37:36 -0700
commitf1e3f25d9b7a12cdedb99e4cb0bfa66157a1a972 (patch)
treec8414b8040cdcd38bd98471d96a01908cdef49ad /src/tools
parentcaee572ff94822ca2ed354fcb79ca04ed9adf388 (diff)
downloadlibbu++-f1e3f25d9b7a12cdedb99e4cb0bfa66157a1a972.tar.gz
libbu++-f1e3f25d9b7a12cdedb99e4cb0bfa66157a1a972.tar.bz2
libbu++-f1e3f25d9b7a12cdedb99e4cb0bfa66157a1a972.tar.xz
libbu++-f1e3f25d9b7a12cdedb99e4cb0bfa66157a1a972.zip
Making progress.
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/myriad.cpp280
-rw-r--r--src/tools/myriadfs.cpp269
2 files changed, 0 insertions, 549 deletions
diff --git a/src/tools/myriad.cpp b/src/tools/myriad.cpp
deleted file mode 100644
index ccf3d3b..0000000
--- a/src/tools/myriad.cpp
+++ /dev/null
@@ -1,280 +0,0 @@
1/*
2 * Copyright (C) 2007-2023 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libbu++ library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
8#include "bu/sio.h"
9#include "bu/file.h"
10#include "bu/myriad.h"
11#include "bu/myriadstream.h"
12#include "bu/optparser.h"
13
14#include <stdlib.h>
15
16using namespace Bu;
17
18enum Mode
19{
20 modeCreate,
21 modeInfo,
22 modeStreamNew,
23 modeStreamDump,
24 modeStreamPut,
25 modeStreamGet,
26 modeBlockMap,
27
28 modeNone
29};
30
31class Options : public OptParser
32{
33public:
34 Options( int argc, char *argv[] ) :
35 eMode( modeNone ),
36 iBlockSize( 64 ),
37 iPreallocate( 0 ),
38 iStream( 0 )
39 {
40 addHelpBanner("Mode of operation:");
41 addOption( eMode, 'c', "create",
42 "Create a new Myriad file." );
43 addOption( eMode, 'i', "info",
44 "Display some info about a Myriad file." );
45 addOption( eMode, 'n', "new",
46 "Create a new sub-stream in a Myriad file.");
47 addOption( eMode, 'd', "dump",
48 "Display a hexdump of a stream from a Myriad file.");
49 addOption( eMode, "get",
50 "Get a file out of a Myriad stream (use --dst).");
51 addOption( eMode, "put",
52 "Put a file into a Myriad stream (usr --src).");
53 addOption( eMode, 'm', "block-map",
54 "Visualize block usage.");
55 addHelpOption();
56
57 addHelpBanner("\nGeneral options:");
58 addOption( iBlockSize, 'b', "block-size", "Set the block size." );
59 addOption( iPreallocate, 'p', "preallocate",
60 "Number of blocks to preallocate." );
61 addOption( sFile, 'f', "file", "Set the Myriad filename." );
62 addOption( iStream, 's', "stream", "Substream to work with.");
63 addOption( sSrc, "src", "Source file for copying into a Myriad file.");
64 addOption( sDst, "dst",
65 "Destination file for copying out of a Myriad file.");
66
67 setOverride( "create", modeCreate );
68 setOverride( "info", modeInfo );
69 setOverride( "new", modeStreamNew );
70 setOverride( "dump", modeStreamDump );
71 setOverride( "put", modeStreamPut );
72 setOverride( "get", modeStreamGet );
73 setOverride( "block-map", modeBlockMap );
74
75 parse( argc, argv );
76 }
77
78 Mode eMode;
79 int iBlockSize;
80 int iPreallocate;
81 int iStream;
82 Bu::String sFile;
83 Bu::String sSrc;
84 Bu::String sDst;
85};
86
87Bu::Formatter &operator>>( Bu::Formatter &f, Mode & /*e*/ )
88{
89 sio << "Uh oh, the formatter was called..." << sio.nl;
90 return f;
91}
92
93int main( int argc, char *argv[] )
94{
95 Options opts( argc, argv );
96
97 switch( opts.eMode )
98 {
99 case modeCreate:
100 if( !opts.sFile.isSet() )
101 {
102 sio << "Please specify a file to create." << sio.nl;
103 return 0;
104 }
105 else
106 {
107 File fOut( opts.sFile, File::WriteNew|File::Read );
108 Myriad m( fOut, opts.iBlockSize, opts.iPreallocate );
109 }
110 break;
111
112 case modeInfo:
113 if( !opts.sFile.isSet() )
114 {
115 sio << "Please specify a file to display info about." << sio.nl;
116 return 0;
117 }
118 else
119 {
120 File fIn( opts.sFile, File::Read );
121 Myriad m( fIn );
122 sio << "Myriad info:" << sio.nl
123 << " Block size: " << m.getBlockSize() << sio.nl
124 << " Block count: " << m.getNumBlocks() << sio.nl
125 << " Blocks used: " << m.getNumUsedBlocks() << " ("
126 << m.getNumUsedBlocks()*100/m.getNumBlocks() << "%)"
127 << sio.nl
128 << " Stream count: " << m.getNumStreams() << sio.nl
129 << " Used space: " << m.getTotalUsedBytes() << sio.nl
130 << " Unused space: " << m.getTotalUnusedBytes() << sio.nl
131 << " % of files: " << (double)(m.getNumBlocks()*m.getBlockSize())/(double)(m.getTotalUsedBytes() + m.getTotalUnusedBytes( 4096 ))*100.0 << sio.nl;
132/* Bu::Array<int> aStreams = m.getStreamIds();
133 sio << " Stream info:" << sio.nl;
134 for( Bu::Array<int>::iterator i = aStreams.begin(); i; i++ )
135 {
136 sio << " " << Fmt(4) << *i << ") "
137 << m.getStreamSize( *i ) << "b" << sio.nl;
138 } */
139 }
140 break;
141
142 case modeStreamNew:
143 if( !opts.sFile.isSet() )
144 {
145 sio << "Please specify a file manipulate." << sio.nl;
146 return 0;
147 }
148 else
149 {
150 File fOut( opts.sFile, File::Write|File::Read );
151 Myriad m( fOut );
152 m.createStream( opts.iPreallocate );
153 }
154 break;
155
156 case modeStreamDump:
157 if( !opts.sFile.isSet() )
158 {
159 sio << "Please specify a file to manipulate." << sio.nl;
160 return 0;
161 }
162 else
163 {
164 File fOut( opts.sFile, File::Read );
165 Myriad m( fOut );
166 MyriadStream s = m.openStream( opts.iStream );
167 sio << "Stream " << opts.iStream << ":" << sio.nl;
168 char buf[8];
169 int iPos = 0;
170 while( !s.isEos() )
171 {
172 size_t sAmnt = s.read( buf, 8 );
173 sio << Fmt(5) << iPos << ": ";
174 iPos += sAmnt;
175 for( size_t j = 0; j < sAmnt; j++ )
176 {
177 sio << Fmt::hex(2) << (int)((unsigned char)buf[j])
178 << " ";
179 }
180 for( size_t j = sAmnt; j < 8; j++ )
181 {
182 sio << "-- ";
183 }
184 sio << "| ";
185 for( size_t j = 0; j < sAmnt; j++ )
186 {
187 if( buf[j] >= 32 && buf[j] <= 126 )
188 sio << buf[j] << " ";
189 else
190 sio << " ";
191 }
192 sio << sio.nl;
193 }
194 sio << "Position: " << s.tell() << ", isEos()=" << s.isEos()
195 << sio.nl;
196 }
197 break;
198
199 case modeStreamPut:
200 if( !opts.sFile.isSet() )
201 {
202 sio << "Please specify a file manipulate." << sio.nl;
203 return 0;
204 }
205 else if( !opts.sSrc.isSet() )
206 {
207 sio << "Please specify a source file to read." << sio.nl;
208 }
209 else
210 {
211 File fOut( opts.sFile, File::Write|File::Read );
212 Myriad m( fOut );
213 MyriadStream sOut = m.openStream(
214 m.createStream( opts.iPreallocate )
215 );
216 File fIn( opts.sSrc, File::Read );
217 char buf[1024];
218 while( !fIn.isEos() )
219 {
220 sOut.write( buf, fIn.read( buf, 1024 ) );
221 }
222 }
223 break;
224
225 case modeStreamGet:
226 if( !opts.sFile.isSet() )
227 {
228 sio << "Please specify a file manipulate." << sio.nl;
229 return 0;
230 }
231 else if( !opts.sDst.isSet() )
232 {
233 sio << "Please specify a destination file to write." << sio.nl;
234 }
235 else
236 {
237 File fIn( opts.sFile, File::Write|File::Read );
238 Myriad m( fIn );
239 MyriadStream sIn = m.openStream( opts.iStream );
240 File fOut( opts.sDst, File::Write|File::Create|File::Truncate );
241 char buf[1024];
242 while( !sIn.isEos() )
243 {
244 fOut.write( buf, sIn.read( buf, 1024 ) );
245 }
246 }
247 break;
248
249 case modeBlockMap:
250 if( !opts.sFile.isSet() )
251 {
252 sio << "Please specify a file manipulate." << sio.nl;
253 return 0;
254 }
255 {
256 File fIn( opts.sFile, File::Write|File::Read );
257 Myriad m( fIn );
258 Bu::BitString bs = m.getBlocksUsed();
259 for( int j = 0; j < bs.getSize(); j++ )
260 {
261 if( j>0 && (j%50) == 0 )
262 Bu::println("");
263 if( bs.getBit( j ) )
264 Bu::print("#");
265 else
266 Bu::print("-");
267 }
268 Bu::println("\n");
269 }
270 break;
271
272 case modeNone:
273 sio << "Please select a mode, for more info, try --help."
274 << sio.nl << sio.nl;
275 break;
276 }
277
278 return 0;
279}
280
diff --git a/src/tools/myriadfs.cpp b/src/tools/myriadfs.cpp
deleted file mode 100644
index 587bc89..0000000
--- a/src/tools/myriadfs.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
1/*
2 * Copyright (C) 2007-2023 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libbu++ library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
8#include "bu/sio.h"
9#include "bu/streamstack.h"
10#include "bu/file.h"
11#include "bu/myriadfs.h"
12#include "bu/myriadstream.h"
13#include "bu/optparser.h"
14
15enum Mode
16{
17 modeList,
18 modeCat,
19 modeCopyIn,
20 modeCopyOut,
21 modeMkdir,
22 modeInitialize,
23 modeRm,
24
25 modeNone
26};
27
28Bu::Formatter &operator>>( Bu::Formatter &f, Mode & /*e*/ )
29{
30 Bu::sio << "Uh oh, the formatter was called..." << Bu::sio.nl;
31 return f;
32}
33
34class Options : public Bu::OptParser
35{
36public:
37 Options( int argc, char *argv[] ) :
38 eMode( modeNone ),
39 iBlockSize( 64 )
40 {
41 addHelpBanner("Options:");
42 addOption( sFile, 'f', "file", "Myriadfs file");
43 addOption( iBlockSize, 'b', "block-size",
44 "Specify the block size when initializing a new MyriadFs");
45
46 setNonOption( Bu::slot( this, &Options::nonOption ) );
47
48 addHelpOption();
49
50 parse( argc, argv );
51 }
52
53 int nonOption( Bu::Array<Bu::String> aParams )
54 {
55 if( eMode == modeNone )
56 {
57 //Bu::println("Checking mode");
58 // First param, must be the mode
59 if( aParams[0] == "ls" )
60 eMode = modeList;
61 else if( aParams[0] == "cat" )
62 eMode = modeCat;
63 else if( aParams[0] == "cp-in" )
64 eMode = modeCopyIn;
65 else if( aParams[0] == "cp-out" )
66 eMode = modeCopyOut;
67 else if( aParams[0] == "mkdir" )
68 eMode = modeMkdir;
69 else if( aParams[0] == "initialize" )
70 eMode = modeInitialize;
71 else if( aParams[0] == "rm" )
72 eMode = modeRm;
73 else
74 Bu::println("Unknown command, try --help");
75 return 0;
76 } else {
77 lParams.append( aParams[0] );
78 }
79 //Bu::println("Got option: \"%1\"").arg( aParams[0] );
80 return 0;
81 }
82
83 Mode eMode;
84 Bu::String sFile;
85 Bu::StringList lParams;
86 int iBlockSize;
87};
88
89int main( int argc, char *argv[] )
90{
91 Options opt( argc, argv );
92
93 if( opt.sFile.isEmpty() )
94 {
95 Bu::println("You must specify a MyriadFs stream (see -f).\n");
96 return 1;
97 }
98
99 if( opt.eMode == modeNone )
100 {
101 Bu::println("Specify an operation to perfrom.\n");
102 return 1;
103 }
104
105 int iFlags = Bu::File::ReadWrite;
106
107 if( opt.eMode == modeInitialize )
108 {
109 iFlags |= Bu::File::Create|Bu::File::Truncate;
110 }
111
112 Bu::File fFs( opt.sFile, iFlags );
113 Bu::MyriadFs mFs( fFs, opt.iBlockSize );
114
115 switch( opt.eMode )
116 {
117 case modeList:
118 {
119 Bu::String sPath = "/";
120 if( opt.lParams.getSize() > 0 )
121 {
122 sPath = opt.lParams.first();
123 }
124 Bu::MyriadFs::Dir lEnt = mFs.readDir( sPath );
125 for( Bu::MyriadFs::Dir::iterator i = lEnt.begin(); i; i++ )
126 {
127 Bu::String sPerm;
128 switch( (*i).uPerms&Bu::MyriadFs::typeMask )
129 {
130 case Bu::MyriadFs::typeDir: sPerm += "d"; break;
131 case Bu::MyriadFs::typeChrDev: sPerm += "c"; break;
132 case Bu::MyriadFs::typeBlkDev: sPerm += "b"; break;
133 case Bu::MyriadFs::typeSymLink: sPerm += "l"; break;
134 case Bu::MyriadFs::typeSocket: sPerm += "s"; break;
135 default: sPerm += "-"; break;
136 }
137 sPerm += ((*i).uPerms&Bu::MyriadFs::permUsrR)?"r":"-";
138 sPerm += ((*i).uPerms&Bu::MyriadFs::permUsrW)?"w":"-";
139 sPerm += ((*i).uPerms&Bu::MyriadFs::permUsrX)?"x":"-";
140 sPerm += ((*i).uPerms&Bu::MyriadFs::permGrpR)?"r":"-";
141 sPerm += ((*i).uPerms&Bu::MyriadFs::permGrpW)?"w":"-";
142 sPerm += ((*i).uPerms&Bu::MyriadFs::permGrpX)?"x":"-";
143 sPerm += ((*i).uPerms&Bu::MyriadFs::permOthR)?"r":"-";
144 sPerm += ((*i).uPerms&Bu::MyriadFs::permOthW)?"w":"-";
145 sPerm += ((*i).uPerms&Bu::MyriadFs::permOthX)?"x":"-";
146 Bu::println("%1 %2 %3:%4 %5 %6")
147 .arg( sPerm )
148 .arg( (*i).iNode )
149 .arg( (*i).iUser )
150 .arg( (*i).iGroup )
151 .arg( (*i).iSize )
152 .arg( (*i).sName );
153 }
154 }
155 break;
156
157 case modeCat:
158 {
159 if( opt.lParams.isEmpty() )
160 {
161 Bu::println("Specify at least one file.");
162 return 1;
163 }
164 int iBlockSize = 1024*1024;
165 char *pBuf = new char[iBlockSize];
166 for( Bu::StringList::iterator i = opt.lParams.begin(); i; i++ )
167 {
168 Bu::MyriadStream ms = mFs.open( *i, Bu::MyriadFs::Read );
169 int iRead = 0;
170 do
171 {
172 iRead = ms.read( pBuf, iBlockSize );
173 if( iRead > 0 )
174 {
175 Bu::sioRaw.write( pBuf, iRead );
176 }
177 } while( iRead == iBlockSize );
178 }
179 delete[] pBuf;
180 }
181 break;
182
183 case modeCopyIn:
184 {
185 if( opt.lParams.getSize() != 2 )
186 {
187 Bu::println("Specify a source file and destination file.");
188 return 1;
189 }
190 int iBlockSize = 1024*1024;
191 char *pBuf = new char[iBlockSize];
192 Bu::File fs = Bu::File(
193 opt.lParams.first(), Bu::File::Read );
194 Bu::MyriadStream ms = mFs.open(
195 opt.lParams.last(), Bu::MyriadFs::WriteNew );
196 int iRead = 0;
197 do
198 {
199 iRead = fs.read( pBuf, iBlockSize );
200 if( iRead > 0 )
201 {
202 ms.write( pBuf, iRead );
203 }
204 } while( iRead == iBlockSize );
205 delete[] pBuf;
206 }
207 break;
208
209 case modeCopyOut:
210 {
211 if( opt.lParams.getSize() != 2 )
212 {
213 Bu::println("Specify a source file and destination file.");
214 return 1;
215 }
216 int iBlockSize = 1024*1024;
217 char *pBuf = new char[iBlockSize];
218 Bu::MyriadStream ms = mFs.open(
219 opt.lParams.first(), Bu::MyriadFs::Read );
220 Bu::File fs = Bu::File(
221 opt.lParams.last(), Bu::File::WriteNew );
222 int iRead = 0;
223 do
224 {
225 iRead = ms.read( pBuf, iBlockSize );
226 if( iRead > 0 )
227 {
228 fs.write( pBuf, iRead );
229 }
230 } while( iRead == iBlockSize );
231 delete[] pBuf;
232 }
233 break;
234
235 case modeMkdir:
236 {
237 if( opt.lParams.isEmpty() )
238 {
239 Bu::println("Specify at least one directory.");
240 return 1;
241 }
242 for( Bu::StringList::iterator i = opt.lParams.begin(); i; i++ )
243 {
244 mFs.mkDir( *i, 0777 );
245 }
246 }
247 break;
248
249 case modeInitialize:
250 Bu::println("MyriadFs initialized.\n");
251 break;
252
253 case modeRm:
254 {
255 if( opt.lParams.getSize() != 1 )
256 {
257 Bu::println("Specify a file path.");
258 return 1;
259 }
260 mFs.unlink( opt.lParams.first() );
261 }
262 break;
263
264 case modeNone:
265 break;
266 }
267
268 return 0;
269}