Skip to content

Commit

Permalink
Fix IPv6 bug on android
Browse files Browse the repository at this point in the history
coyove committed Sep 27, 2018

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent a5fe9d7 commit 5ddf5b6
Showing 4 changed files with 48 additions and 24 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ launch.json
*.exe
*.dll
*.a
*.csv.*
.vscode
build/
.DS_Store
59 changes: 37 additions & 22 deletions cmd/goflyway/main.go
Original file line number Diff line number Diff line change
@@ -95,11 +95,7 @@ var (
_ = flag.Bool("fast-open", true, "-- Placeholder --")
)

func loadConfig() {
if *cmdSection == "" {
return
}

func loadConfig() error {
path := *cmdConfig
if path == "" {
if runtime.GOOS == "windows" {
@@ -110,22 +106,18 @@ func loadConfig() {
}

if _, err := os.Stat(path); err != nil {
return
return nil
}

buf, err := ioutil.ReadFile(path)
if err != nil {
logger.L("Config", "Error", err)
return
return err
}

if strings.Contains(path, "shadowsocks.conf") {
logger.L("Config", "Shadowsocks")

cmds := make(map[string]interface{})
if err := json.Unmarshal(buf, &cmds); err != nil {
logger.L("Config", "Parse", err)
return
return err
}

*cmdKey = cmds["password"].(string)
@@ -134,10 +126,6 @@ func loadConfig() {
switch (*cmdKey)[1] {
case 'w':
*cmdUpstream = "ws://" + *cmdUpstream
case 's':
*cmdUnderlay = "https"
// case 'k':
// *cmdUnderlay = "kcp"
case 'c':
*cmdUpstream = "ws://" + *cmdUpstream + "/" + (*cmdKey)[2:]
}
@@ -146,16 +134,18 @@ func loadConfig() {
*cmdLogLevel = "dbg"
*cmdVPN = true
*cmdGlobal = true
return
return nil
}

if *cmdSection == "" {
return nil
}

cf, err := config.ParseConf(string(buf))
if err != nil {
logger.L("Config", "Parse", err)
return
return err
}

logger.L("Config", "Section", *cmdSection)
func(args ...interface{}) {
for i := 0; i < len(args); i += 2 {
switch f, name := args[i+1], strings.TrimSpace(args[i].(string)); f.(type) {
@@ -195,6 +185,8 @@ func loadConfig() {
"underlay ", cmdUnderlay,
"autocert ", cmdAutoCert,
)

return nil
}

var logger *logg.Logger
@@ -257,13 +249,21 @@ func main() {
}

runtime.GOMAXPROCS(runtime.NumCPU() * 4)
configerr := loadConfig()

logger = &logg.Logger{}
logger.SetFormats(logg.FmtLongTime, logg.FmtShortFile, logg.FmtLevel)
logger.Parse(*cmdLogLevel)

logger.L("Hello", "goflyway build "+version)
loadConfig()
if *cmdSection != "" {
logger.L("Config", "Section", *cmdSection)
}

if configerr != nil {
logger.L("Config", "Error", configerr)
}

logger.L("Build", "goflyway "+version)

if *cmdUpstream != "" {
logger.L("Role", "Client")
@@ -534,6 +534,21 @@ func parseAuthURL(in string) (auth string, upstream string, header string, dummy
}

if _, _, err := net.SplitHostPort(upstream); err != nil {
if strings.Count(upstream, ":") > 1 {
lc := strings.LastIndex(upstream, ":")
port := upstream[lc+1:]
upstream = upstream[:lc]
upip := net.ParseIP(upstream)
if bs := []byte(upip); len(bs) == net.IPv6len {
upstream = "["
for i := 0; i < 16; i += 2 {
upstream += strconv.FormatInt(int64(bs[i])*256+int64(bs[i+1]), 16) + ":"
}
upstream = upstream[:len(upstream)-1] + "]:" + port
return
}
}

logger.F("Init", "Invalid server destination", upstream, err)
}

2 changes: 1 addition & 1 deletion makefile
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@ release: windows darwin linux
# don't use ldflags -X
release = \
sed -i -- 's/__devel__/$(VERSION)/g' $(SOURCE) && \
GOOS=$(1) GOARCH=$(2) CGO_ENABLED=1 go build -o build/$(3) ./cmd/goflyway && \
GOOS=$(1) GOARCH=$(2) go build -o build/$(3) ./cmd/goflyway && \
sed -i -- 's/$(VERSION)/__devel__/g' $(SOURCE) && \
cp -t build/ $(LIST)
tar = cd build && tar -cvzf $(NAME)_$(1)_$(2).tar.gz $(NAME) $(LIST) && rm $(NAME)
10 changes: 9 additions & 1 deletion proxy/ssvpn_interop.go
Original file line number Diff line number Diff line change
@@ -16,7 +16,15 @@ import (
)

func vpnDial(address string) (net.Conn, error) {
sock, err := fd.Socket(syscall.AF_INET)
var family int
family = syscall.AF_INET

if address[0] == '[' {
// naive match
family = syscall.AF_INET6
}

sock, err := fd.Socket(family)
if err != nil {
return nil, err
}

0 comments on commit 5ddf5b6

Please sign in to comment.