pax_global_header00006660000000000000000000000064136672343540014527gustar00rootroot0000000000000052 comment=84e71ff5a939cf4c60a86340fcee6ce667e808ea minwinsvc-1.0.0/000077500000000000000000000000001366723435400135425ustar00rootroot00000000000000minwinsvc-1.0.0/LICENSE000066400000000000000000000015461366723435400145550ustar00rootroot00000000000000Copyright (c) 2015 Daniel Theophanes This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. minwinsvc-1.0.0/README.md000066400000000000000000000006041366723435400150210ustar00rootroot00000000000000### Minimal windows service stub Programs designed to run from most *nix style operating systems can import this package to enable running programs as services without modifying them. ``` import _ "github.com/kardianos/minwinsvc" ``` If you need more control over the exit behavior, set ``` minwinsvc.SetOnExit(func() { // Do something. // Within 10 seconds call: os.Exit(0) }) ``` minwinsvc-1.0.0/go.mod000066400000000000000000000001541366723435400146500ustar00rootroot00000000000000module github.com/kardianos/minwinsvc go 1.15 require golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 minwinsvc-1.0.0/go.sum000066400000000000000000000003171366723435400146760ustar00rootroot00000000000000golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= minwinsvc-1.0.0/minwinsvc.go000066400000000000000000000012261366723435400161070ustar00rootroot00000000000000// Copyright 2015 Daniel Theophanes. // Use of this source code is governed by a zlib-style // license that can be found in the LICENSE file.package service // Minimal non-invasive windows only service stub. // // Import to allow running as a windows service. // import _ "github.com/kardianos/minwinsvc" // This will detect if running as a windows service // and install required callbacks for windows. package minwinsvc // SetOnExit sets the function to be called when the windows service // requests an exit. If this is not called, or if it is called where // f == nil, then it defaults to calling "os.Exit(0)". func SetOnExit(f func()) { setOnExit(f) } minwinsvc-1.0.0/svc_other.go000066400000000000000000000003561366723435400160710ustar00rootroot00000000000000// Copyright 2015 Daniel Theophanes. // Use of this source code is governed by a zlib-style // license that can be found in the LICENSE file.package service //+build !windows package minwinsvc func setOnExit(f func()) { // Nothing. } minwinsvc-1.0.0/svc_windows.go000066400000000000000000000023001366723435400164310ustar00rootroot00000000000000// Copyright 2015 Daniel Theophanes. // Use of this source code is governed by a zlib-style // license that can be found in the LICENSE file.package service //+build windows package minwinsvc import ( "os" "sync" "golang.org/x/sys/windows/svc" ) var ( onExit func() guard sync.Mutex ) func init() { interactive, err := svc.IsAnInteractiveSession() if err != nil { panic(err) } if interactive { return } go func() { _ = svc.Run("", runner{}) guard.Lock() f := onExit guard.Unlock() // Don't hold this lock in user code. if f != nil { f() } // Make sure we exit. os.Exit(0) }() } func setOnExit(f func()) { guard.Lock() onExit = f guard.Unlock() } type runner struct{} func (runner) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (bool, uint32) { const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown changes <- svc.Status{State: svc.StartPending} changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} for { c := <-r switch c.Cmd { case svc.Interrogate: changes <- c.CurrentStatus case svc.Stop, svc.Shutdown: changes <- svc.Status{State: svc.StopPending} return false, 0 } } return false, 0 }