mirror of https://github.com/jetkvm/kvm.git
110 lines
2.3 KiB
Go
110 lines
2.3 KiB
Go
package usbgadget
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// Helper function to get absolute value of float64
|
|
func abs(x float64) float64 {
|
|
if x < 0 {
|
|
return -x
|
|
}
|
|
return x
|
|
}
|
|
|
|
func joinPath(basePath string, paths []string) string {
|
|
pathArr := append([]string{basePath}, paths...)
|
|
return filepath.Join(pathArr...)
|
|
}
|
|
|
|
func ensureSymlink(linkPath string, target string) error {
|
|
if _, err := os.Lstat(linkPath); err == nil {
|
|
currentTarget, err := os.Readlink(linkPath)
|
|
if err != nil || currentTarget != target {
|
|
err = os.Remove(linkPath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to remove existing symlink %s: %w", linkPath, err)
|
|
}
|
|
}
|
|
} else if !os.IsNotExist(err) {
|
|
return fmt.Errorf("failed to check if symlink exists: %w", err)
|
|
}
|
|
|
|
if err := os.Symlink(target, linkPath); err != nil {
|
|
return fmt.Errorf("failed to create symlink from %s to %s: %w", linkPath, target, err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func hexToDecimal(hex string) (int64, error) {
|
|
decimal, err := strconv.ParseInt(hex, 16, 64)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return decimal, nil
|
|
}
|
|
|
|
func decimalToOctal(decimal int64) string {
|
|
return fmt.Sprintf("%04o", decimal)
|
|
}
|
|
|
|
func hexToOctal(hex string) (string, error) {
|
|
hex = strings.ToLower(hex)
|
|
hex = strings.Replace(hex, "0x", "", 1) //remove 0x or 0X
|
|
|
|
decimal, err := hexToDecimal(hex)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// Convert the decimal integer to an octal string.
|
|
octal := decimalToOctal(decimal)
|
|
return octal, nil
|
|
}
|
|
|
|
func compareFileContent(oldContent []byte, newContent []byte, looserMatch bool) bool {
|
|
if bytes.Equal(oldContent, newContent) {
|
|
return true
|
|
}
|
|
|
|
if len(oldContent) == len(newContent)+1 &&
|
|
bytes.Equal(oldContent[:len(newContent)], newContent) &&
|
|
oldContent[len(newContent)] == 10 {
|
|
return true
|
|
}
|
|
|
|
if len(newContent) == 4 {
|
|
if len(oldContent) < 6 || len(oldContent) > 7 {
|
|
return false
|
|
}
|
|
|
|
if len(oldContent) == 7 && oldContent[6] == 0x0a {
|
|
oldContent = oldContent[:6]
|
|
}
|
|
|
|
oldOctalValue, err := hexToOctal(string(oldContent))
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
if oldOctalValue == string(newContent) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
if looserMatch {
|
|
oldContentStr := strings.TrimSpace(string(oldContent))
|
|
newContentStr := strings.TrimSpace(string(newContent))
|
|
|
|
return oldContentStr == newContentStr
|
|
}
|
|
|
|
return false
|
|
}
|