From c5f12920b0879498b0a20342650a09b0ad5c9d7c Mon Sep 17 00:00:00 2001 From: r Date: Sun, 2 Jan 2022 11:15:57 +0000 Subject: Use GO's flag parser instead of getopt There's only one flag, so it doesn't matter. --- util/getopt.go | 122 --------------------------------------------------------- 1 file changed, 122 deletions(-) delete mode 100644 util/getopt.go (limited to 'util') 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 - -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 -} -- cgit v1.2.3 From fcb88c8a85fd2918c4c9e30c3ef49e716d77f2b0 Mon Sep 17 00:00:00 2001 From: r Date: Sun, 2 Jan 2022 11:38:06 +0000 Subject: Simplify id generation --- util/rand.go | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) (limited to 'util') 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) { -- cgit v1.2.3