diff --git a/sdjournal/journal.go b/sdjournal/journal.go index b0651629..87717398 100644 --- a/sdjournal/journal.go +++ b/sdjournal/journal.go @@ -164,6 +164,15 @@ package sdjournal // } // // int +// my_sd_journal_seek_head(void *f, sd_journal *j) +// { +// int (*sd_journal_seek_head)(sd_journal *); +// +// sd_journal_seek_head = f; +// return sd_journal_seek_head(j); +// } +// +// int // my_sd_journal_seek_tail(void *f, sd_journal *j) // { // int (*sd_journal_seek_tail)(sd_journal *); @@ -587,6 +596,25 @@ func (j *Journal) GetRealtimeUsec() (uint64, error) { return uint64(usec), nil } +// SeekHead seeks to the beginning of the journal, i.e. the oldest available +// entry. +func (j *Journal) SeekHead() error { + sd_journal_seek_head, err := j.getFunction("sd_journal_seek_head") + if err != nil { + return err + } + + j.mu.Lock() + r := C.my_sd_journal_seek_head(sd_journal_seek_head, j.cjournal) + j.mu.Unlock() + + if r < 0 { + return fmt.Errorf("failed to seek to head of journal: %d", syscall.Errno(-r)) + } + + return nil +} + // SeekTail may be used to seek to the end of the journal, i.e. the most recent // available entry. func (j *Journal) SeekTail() error { diff --git a/sdjournal/read.go b/sdjournal/read.go index 8944448c..5e7cec8d 100644 --- a/sdjournal/read.go +++ b/sdjournal/read.go @@ -125,10 +125,16 @@ func (r *JournalReader) Read(b []byte) (int, error) { return len(msg), nil } +// Close closes the JournalReader's handle to the journal. func (r *JournalReader) Close() error { return r.journal.Close() } +// Rewind attempts to rewind the JournalReader to the first entry. +func (r *JournalReader) Rewind() error { + return r.journal.SeekHead() +} + // Follow synchronously follows the JournalReader, writing each new journal entry to writer. The // follow will continue until a single time.Time is received on the until channel. func (r *JournalReader) Follow(until <-chan time.Time, writer io.Writer) (err error) {