func runHotpatch()

in cmd/hotdog-hotpatch/main.go [322:354]


func runHotpatch(j *jvm) error {
	version, ok := findVersion(j)
	if !ok {
		logger.Printf("Unsupported Java version %q for %d", version, j.pid)
		return nil
	}
	patchPath := filepath.Join(hotdog.ContainerDir, hotdog.PatchPath)
	var options []string
	switch version {
	case java17, java11:
		options = append(jvmOpts, "-jar", patchPath, strconv.Itoa(j.pid))
	case java8:
		// Sometimes java is invoked as $JAVAHOME/jre/bin/java versus $JAVAHOME/bin/java, try to correct for this.
		bindir := filepath.Dir(j.path)
		basedir := filepath.Dir(bindir)
		dirname := filepath.Base(basedir)
		if dirname == "jre" {
			basedir = filepath.Dir(basedir)
		}
		options = append(jvmOpts, "-cp", filepath.Join(basedir, "lib", "tools.jar")+":"+patchPath, hotdog.JDK8Class, strconv.Itoa(j.pid))
	default:
		return nil
	}
	out, err := commandDroppedPrivs(j.path, options, j.euid, j.egid, j.pid)
	exitCode := 0
	if err != nil {
		if execErr, ok := err.(*exec.ExitError); ok {
			exitCode = execErr.ExitCode()
		}
	}
	logger.Printf("Patch exited %d: %q", exitCode, string(out))
	return err
}