~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
44 lines · 633 B Raw History
package selfexe

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"io"
	"os"
	"sync"
)

const Path = "/proc/self/exe"

type Pin struct {
	Sha256 string

	Size int64
}

var (
	mu sync.Mutex

	cached *Pin
)

func Sum() (Pin, error) {
	mu.Lock()
	defer mu.Unlock()
	if cached != nil {
		return *cached, nil
	}
	f, err := os.Open(Path)
	if err != nil {
		return Pin{}, fmt.Errorf("selfexe: %w", err)
	}
	defer f.Close()
	h := sha256.New()
	n, err := io.Copy(h, f)
	if err != nil {
		return Pin{}, fmt.Errorf("selfexe: hashing %s: %w", Path, err)
	}
	cached = &Pin{Sha256: hex.EncodeToString(h.Sum(nil)), Size: n}
	return *cached, nil
}