From ee04b718876438feb0ed6d794f0caf72d24f777a Mon Sep 17 00:00:00 2001
From: Jeffrey Wilcke <geffobscura@gmail.com>
Date: Tue, 7 Jul 2015 12:53:36 +0200
Subject: [PATCH] cmd/geth, cmd/utils: changed ParamsToAddress to return error

ParamsToAddress no longer aborts the process, it now returns an error
instead so that the caller can handle the error properly.
---
 cmd/geth/main.go   | 21 ++++++++++++---------
 cmd/utils/flags.go | 10 +++++++---
 2 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index b9e9cd346..5ac93a983 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -458,17 +458,20 @@ func execJSFiles(ctx *cli.Context) {
 
 func unlockAccount(ctx *cli.Context, am *accounts.Manager, addr string, i int) (addrHex, auth string) {
 	var err error
-	addrHex = utils.ParamToAddress(addr, am)
-	// Attempt to unlock the account 3 times
-	attempts := 3
-	for tries := 0; tries < attempts; tries++ {
-		msg := fmt.Sprintf("Unlocking account %s | Attempt %d/%d", addr, tries+1, attempts)
-		auth = getPassPhrase(ctx, msg, false, i)
-		err = am.Unlock(common.HexToAddress(addrHex), auth)
-		if err == nil {
-			break
+	addrHex, err = utils.ParamToAddress(addr, am)
+	if err == nil {
+		// Attempt to unlock the account 3 times
+		attempts := 3
+		for tries := 0; tries < attempts; tries++ {
+			msg := fmt.Sprintf("Unlocking account %s | Attempt %d/%d", addr, tries+1, attempts)
+			auth = getPassPhrase(ctx, msg, false, i)
+			err = am.Unlock(common.HexToAddress(addrHex), auth)
+			if err == nil {
+				break
+			}
 		}
 	}
+
 	if err != nil {
 		utils.Fatalf("Unlock account failed '%v'", err)
 	}
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index d58c754fe..903c97e71 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -369,6 +369,10 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config {
 		clientID += "/" + customName
 	}
 	am := MakeAccountManager(ctx)
+	etherbase, err := ParamToAddress(ctx.GlobalString(EtherbaseFlag.Name), am)
+	if err != nil {
+		glog.V(logger.Error).Infoln("WARNING: No etherbase set and no accounts found as default")
+	}
 
 	return &eth.Config{
 		Name:                    common.MakeName(clientID, version),
@@ -380,7 +384,7 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config {
 		LogFile:                 ctx.GlobalString(LogFileFlag.Name),
 		Verbosity:               ctx.GlobalInt(VerbosityFlag.Name),
 		LogJSON:                 ctx.GlobalString(LogJSONFlag.Name),
-		Etherbase:               common.HexToAddress(ParamToAddress(ctx.GlobalString(EtherbaseFlag.Name), am)),
+		Etherbase:               common.HexToAddress(etherbase),
 		MinerThreads:            ctx.GlobalInt(MinerThreadsFlag.Name),
 		AccountManager:          am,
 		VmDebug:                 ctx.GlobalBool(VMDebugFlag.Name),
@@ -508,7 +512,7 @@ func StartPProf(ctx *cli.Context) {
 	}()
 }
 
-func ParamToAddress(addr string, am *accounts.Manager) (addrHex string) {
+func ParamToAddress(addr string, am *accounts.Manager) (addrHex string, err error) {
 	if !((len(addr) == 40) || (len(addr) == 42)) { // with or without 0x
 		index, err := strconv.Atoi(addr)
 		if err != nil {
@@ -517,7 +521,7 @@ func ParamToAddress(addr string, am *accounts.Manager) (addrHex string) {
 
 		addrHex, err = am.AddressByIndex(index)
 		if err != nil {
-			Fatalf("%v", err)
+			return "", err
 		}
 	} else {
 		addrHex = addr
-- 
GitLab