func()

in main_windows.go [32:107]


func (m *windowsService) Execute(_ []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (bool, uint32) {
	// start the service
	changes <- svc.Status{State: svc.StartPending}

	// set up the log file
	exePath, err := os.Executable()
	if err != nil {
		changes <- svc.Status{State: svc.StopPending}
		return true, 101 // service specific exit code=101
	}

	logFolder := filepath.Join(filepath.Dir(exePath), "logs")
	os.Mkdir(logFolder, 0644) // ignore all errors

	logFile := &lumberjack.Logger{
		Filename:   filepath.Join(logFolder, "cloud-sql-proxy.log"),
		MaxSize:    50, // megabytes
		MaxBackups: 10,
		MaxAge:     30, //days
	}

	logger := log.NewStdLogger(logFile, logFile)
	logger.Infof("Starting...")

	// start the main command
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	app := cmd.NewCommand(cmd.WithLogger(logger))

	cmdErrCh := make(chan error, 1)
	go func() {
		cmdErrCh <- app.ExecuteContext(ctx)
	}()

	// now running
	changes <- svc.Status{State: svc.Running, Accepts: svc.AcceptStop | svc.AcceptShutdown}

	var cmdErr error

loop:
	for {
		select {
		case err := <-cmdErrCh:
			cmdErr = err
			break loop

		case c := <-r:
			switch c.Cmd {
			case svc.Interrogate:
				changes <- c.CurrentStatus
				// testing deadlock from https://code.google.com/archive/p/winsvc/issues/4
				time.Sleep(100 * time.Millisecond)
				changes <- c.CurrentStatus

			case svc.Stop, svc.Shutdown:
				cancel()

			default:
				logger.Errorf("unexpected control request #%d", c)
			}
		}
	}

	// start shutting down
	logger.Infof("Stopping...")

	changes <- svc.Status{State: svc.StopPending}

	if cmdErr != nil && errors.Is(cmdErr, context.Canceled) {
		logger.Errorf("Unexpected error: %v", cmdErr)
		return true, 2
	}

	return false, 0
}