diff options
Diffstat (limited to 'util')
| -rw-r--r-- | util/getopt.go | 122 | ||||
| -rw-r--r-- | util/rand.go | 20 | 
2 files changed, 7 insertions, 135 deletions
| diff --git a/util/getopt.go b/util/getopt.go deleted file mode 100644 index 10926a8..0000000 --- a/util/getopt.go +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright 2019 Drew DeVault <sir@cmpwn.com> - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors -may be used to endorse or promote products derived from this software without -specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package util - -import ( -	"fmt" -	"os" -) - -// In the case of "-o example", Option is 'o' and "example" is Value. For -// options which do not take an argument, Value is "". -type Option struct { -	Option rune -	Value  string -} - -// This is returned when an unknown option is found in argv, but not in the -// option spec. -type UnknownOptionError rune - -func (e UnknownOptionError) Error() string { -	return fmt.Sprintf("%s: unknown option -%c", os.Args[0], rune(e)) -} - -// This is returned when an option with a mandatory argument is missing that -// argument. -type MissingOptionError rune - -func (e MissingOptionError) Error() string { -	return fmt.Sprintf("%s: expected argument for -%c", os.Args[0], rune(e)) -} - -// Getopts implements a POSIX-compatible options interface. -// -// Returns a slice of options and the index of the first non-option argument. -// -// If an error is returned, you must print it to stderr to be POSIX complaint. -func Getopts(argv []string, spec string) ([]Option, int, error) { -	optmap := make(map[rune]bool) -	runes := []rune(spec) -	for i, rn := range spec { -		if rn == ':' { -			if i == 0 { -				continue -			} -			optmap[runes[i-1]] = true -		} else { -			optmap[rn] = false -		} -	} - -	var ( -		i    int -		opts []Option -	) -	for i = 1; i < len(argv); i++ { -		arg := argv[i] -		runes = []rune(arg) -		if len(arg) == 0 || arg == "-" { -			break -		} -		if arg[0] != '-' { -			break -		} -		if arg == "--" { -			i++ -			break -		} -		for j, opt := range runes[1:] { -			if optopt, ok := optmap[opt]; !ok { -				opts = append(opts, Option{'?', ""}) -				return opts, i, UnknownOptionError(opt) -			} else if optopt { -				if j+1 < len(runes)-1 { -					opts = append(opts, Option{opt, string(runes[j+2:])}) -					break -				} else { -					if i+1 >= len(argv) { -						if len(spec) >= 1 && spec[0] == ':' { -							opts = append(opts, Option{':', string(opt)}) -						} else { -							return opts, i, MissingOptionError(opt) -						} -					} else { -						opts = append(opts, Option{opt, argv[i+1]}) -						i++ -					} -				} -			} else { -				opts = append(opts, Option{opt, ""}) -			} -		} -	} -	return opts, i, nil -} diff --git a/util/rand.go b/util/rand.go index 1e4ec95..90e66a5 100644 --- a/util/rand.go +++ b/util/rand.go @@ -2,24 +2,18 @@ package util  import (  	"crypto/rand" -	"math/big" +	"encoding/base64"  ) -var ( -	runes        = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890") -	runes_length = len(runes) -) +var enc = base64.URLEncoding  func NewRandID(n int) (string, error) { -	data := make([]rune, n) -	for i := range data { -		num, err := rand.Int(rand.Reader, big.NewInt(int64(runes_length))) -		if err != nil { -			return "", err -		} -		data[i] = runes[num.Int64()] +	data := make([]byte, enc.DecodedLen(n)) +	_, err := rand.Read(data) +	if err != nil { +		return "", err  	} -	return string(data), nil +	return enc.EncodeToString(data), nil  }  func NewSessionID() (string, error) { | 
