diff options
Diffstat (limited to 'internal/namespace/pinning.go')
| -rw-r--r-- | internal/namespace/pinning.go | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/internal/namespace/pinning.go b/internal/namespace/pinning.go new file mode 100644 index 0000000..cd81a38 --- /dev/null +++ b/internal/namespace/pinning.go @@ -0,0 +1,35 @@ +package namespace + +import ( + "fmt" + "os" + + "git.theodohertyfamily.com/tools/wg-wrap/internal/paths" +) + +// UnpinNamespace removes the pinned namespace file from the filesystem. +// This allows the namespace to be destroyed once the last process exits. +func UnpinNamespace(pm *paths.PathManager, profile string) error { + nsPath := GetProfileNamespacePath(pm, profile) + + // We only want to unpin if there are no more active processes. + // The caller (cli.ExecuteCommand) is responsible for calling this + // when IsLastProcess returns true. + + if _, err := os.Stat(nsPath); os.IsNotExist(err) { + return nil + } + + // We also want to remove the pids directory if it's empty. + pidsDir := GetPidsDirPath(pm, profile) + + // Unlink the namespace file + if err := os.Remove(nsPath); err != nil { + return fmt.Errorf("failed to unpin namespace %s: %w", nsPath, err) + } + + // Try to remove pids directory + _ = os.Remove(pidsDir) + + return nil +} |
