1// Copyright 2012 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5//go:build windows 6// +build windows 7 8package main 9 10import ( 11 "fmt" 12 "time" 13 14 "golang.org/x/sys/windows/svc" 15 "golang.org/x/sys/windows/svc/mgr" 16) 17 18func startService(name string) error { 19 m, err := mgr.Connect() 20 if err != nil { 21 return err 22 } 23 defer m.Disconnect() 24 s, err := m.OpenService(name) 25 if err != nil { 26 return fmt.Errorf("could not access service: %v", err) 27 } 28 defer s.Close() 29 err = s.Start("is", "manual-started") 30 if err != nil { 31 return fmt.Errorf("could not start service: %v", err) 32 } 33 return nil 34} 35 36func controlService(name string, c svc.Cmd, to svc.State) error { 37 m, err := mgr.Connect() 38 if err != nil { 39 return err 40 } 41 defer m.Disconnect() 42 s, err := m.OpenService(name) 43 if err != nil { 44 return fmt.Errorf("could not access service: %v", err) 45 } 46 defer s.Close() 47 status, err := s.Control(c) 48 if err != nil { 49 return fmt.Errorf("could not send control=%d: %v", c, err) 50 } 51 timeout := time.Now().Add(10 * time.Second) 52 for status.State != to { 53 if timeout.Before(time.Now()) { 54 return fmt.Errorf("timeout waiting for service to go to state=%d", to) 55 } 56 time.Sleep(300 * time.Millisecond) 57 status, err = s.Query() 58 if err != nil { 59 return fmt.Errorf("could not retrieve service status: %v", err) 60 } 61 } 62 return nil 63} 64