Skip to content

Commit 0469fa2

Browse files
authored
Added an extract command. (#3)
1 parent 9adb3e2 commit 0469fa2

File tree

2 files changed

+67
-16
lines changed

2 files changed

+67
-16
lines changed

Gopkg.lock

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/prefetch.go

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,64 @@ package main
22

33
import (
44
"encoding/json"
5-
"flag"
65
"fmt"
6+
"io"
77
"os"
88

9+
cli "github.com/jawher/mow.cli"
910
"www.velocidex.com/golang/binparsergen"
10-
prefetch "www.velocidex.com/golang/go-prefetch"
11+
"www.velocidex.com/golang/go-prefetch"
1112
)
1213

1314
func main() {
14-
flag.Parse()
15+
// create an app
16+
app := cli.App("prefetch", "parse pf files")
1517

16-
args := flag.Args()
17-
if len(args) == 0 {
18-
flag.Usage()
19-
os.Exit(1)
20-
}
18+
// Specify the action to execute when the app is invoked correctly
19+
app.Command("parse", "Parse pf files", func(cmd *cli.Cmd) {
20+
file := cmd.StringsArg("PF_FILE", nil, "Prefix .pf files")
21+
cmd.Spec = "PF_FILE..."
2122

22-
for _, arg := range args {
23-
fd, err := os.Open(arg)
24-
binparsergen.FatalIfError(err, fmt.Sprintf("Open file: %v", err))
23+
cmd.Action = func() {
24+
for _, arg := range *file {
25+
fd, err := os.Open(arg)
26+
binparsergen.FatalIfError(err, fmt.Sprintf("Open file: %v", err))
2527

26-
prefetch_obj, err := prefetch.LoadPrefetch(fd)
27-
binparsergen.FatalIfError(err, fmt.Sprintf("Parsing Error: %v", err))
28+
prefetch_obj, err := prefetch.LoadPrefetch(fd)
29+
binparsergen.FatalIfError(err, fmt.Sprintf("Parsing Error: %v", err))
2830

29-
serialized_content, _ := json.MarshalIndent(prefetch_obj, " ", " ")
30-
fmt.Println(string(serialized_content))
31-
}
31+
serialized_content, _ := json.MarshalIndent(prefetch_obj, " ", " ")
32+
fmt.Println(string(serialized_content))
33+
}
34+
}
35+
})
36+
37+
app.Command("extract", "Export a compressed pf file", func(cmd *cli.Cmd) {
38+
file := cmd.StringArg("PF_FILE", "", "Prefix .pf files")
39+
40+
cmd.Action = func() {
41+
profile := prefetch.NewPrefetchProfile()
42+
reader, err := os.Open(*file)
43+
binparsergen.FatalIfError(err, fmt.Sprintf("OpenFile: %v", err))
44+
45+
header := profile.MAMHeader(reader, 0)
46+
if header.Signature() == "MAM\x04" {
47+
// Need to decompress it in memory.
48+
data := make([]byte, header.UncompressedSize())
49+
n, err := reader.ReadAt(data, int64(header.Size()))
50+
if err != io.EOF {
51+
binparsergen.FatalIfError(err, fmt.Sprintf("Open file: %v", err))
52+
}
53+
54+
decompressed, err := prefetch.LZXpressHuffmanDecompress(
55+
data[:n], int(header.UncompressedSize()))
56+
binparsergen.FatalIfError(err, fmt.Sprintf("Open file: %v", err))
57+
58+
os.Stdout.Write(decompressed)
59+
}
60+
}
61+
})
62+
63+
// Invoke the app passing in os.Args
64+
app.Run(os.Args)
3265
}

0 commit comments

Comments
 (0)