Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/output/file_output_writer.go
2070 views
1
package output
2
3
import (
4
"os"
5
"sync"
6
)
7
8
// fileWriter is a concurrent file based output writer.
9
type fileWriter struct {
10
file *os.File
11
mu sync.Mutex
12
}
13
14
// NewFileOutputWriter creates a new buffered writer for a file
15
func newFileOutputWriter(file string, resume bool) (*fileWriter, error) {
16
var output *os.File
17
var err error
18
if resume {
19
output, err = os.OpenFile(file, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
20
} else {
21
output, err = os.Create(file)
22
}
23
if err != nil {
24
return nil, err
25
}
26
return &fileWriter{file: output}, nil
27
}
28
29
// WriteString writes an output to the underlying file
30
func (w *fileWriter) Write(data []byte) (int, error) {
31
w.mu.Lock()
32
defer w.mu.Unlock()
33
if _, err := w.file.Write(data); err != nil {
34
return 0, err
35
}
36
if _, err := w.file.Write([]byte("\n")); err != nil {
37
return 0, err
38
}
39
return len(data) + 1, nil
40
}
41
42
// Close closes the underlying writer flushing everything to disk
43
func (w *fileWriter) Close() error {
44
w.mu.Lock()
45
defer w.mu.Unlock()
46
//nolint:errcheck // we don't care whether sync failed or succeeded.
47
w.file.Sync()
48
return w.file.Close()
49
}
50
51