// Copyright 2015 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "fmt" "math/big" "os" "os/signal" "path/filepath" "regexp" "sort" "strings" "github.com/codegangsta/cli" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/registrar" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/internal/web3ext" re "github.com/ethereum/go-ethereum/jsre" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/rpc" "github.com/peterh/liner" "github.com/robertkrimen/otto" ) var ( passwordRegexp = regexp.MustCompile("personal.[nu]") leadingSpace = regexp.MustCompile("^ ") onlyws = regexp.MustCompile("^\\s*$") exit = regexp.MustCompile("^\\s*exit\\s*;*\\s*$") ) type jsre struct { re *re.JSRE stack *node.Node wait chan *big.Int ps1 string atexit func() corsDomain string client rpc.Client } func makeCompleter(re *jsre) liner.WordCompleter { return func(line string, pos int) (head string, completions []string, tail string) { if len(line) == 0 || pos == 0 { return "", nil, "" } // chuck data to relevant part for autocompletion, e.g. in case of nested lines eth.getBalance(eth.coinb i := 0 for i = pos - 1; i > 0; i-- { if line[i] == '.' || (line[i] >= 'a' && line[i] <= 'z') || (line[i] >= 'A' && line[i] <= 'Z') { continue } if i >= 3 && line[i] == '3' && line[i-3] == 'w' && line[i-2] == 'e' && line[i-1] == 'b' { continue } i += 1 break } return line[:i], re.re.CompleteKeywords(line[i:pos]), line[pos:] } } func newLightweightJSRE(docRoot string, client rpc.Client, datadir string, interactive bool) *jsre { js := &jsre{ps1: "> "} js.wait = make(chan *big.Int) js.client = client js.re = re.New(docRoot) if err := js.apiBindings(); err != nil { utils.Fatalf("Unable to initialize console - %v", err) } js.setupInput(datadir) return js } func newJSRE(stack *node.Node, docRoot, corsDomain string, client rpc.Client, interactive bool) *jsre { js := &jsre{stack: stack, ps1: "> "} // set default cors domain used by startRpc from CLI flag js.corsDomain = corsDomain js.wait = make(chan *big.Int) js.client = client js.re = re.New(docRoot) if err := js.apiBindings(); err != nil { utils.Fatalf("Unable to connect - %v", err) } js.setupInput(stack.DataDir()) return js } func (self *jsre) setupInput(datadir string) { self.withHistory(datadir, func(hist *os.File) { utils.Stdin.ReadHistory(hist) }) utils.Stdin.SetCtrlCAborts(true) utils.Stdin.SetWordCompleter(makeCompleter(self)) utils.Stdin.SetTabCompletionStyle(liner.TabPrints) self.atexit = func() { self.withHistory(datadir, func(hist *os.File) { hist.Truncate(0) utils.Stdin.WriteHistory(hist) }) utils.Stdin.Close() close(self.wait) } } func (self *jsre) batch(statement string) { err := self.re.EvalAndPrettyPrint(statement) if err != nil { fmt.Printf("%v", jsErrorString(err)) } if self.atexit != nil { self.atexit() } self.re.Stop(false) } // show summary of current geth instance func (self *jsre) welcome() { self.re.Run(` (function () { console.log('instance: ' + web3.version.node); console.log("coinbase: " + eth.coinbase); var ts = 1000 * eth.getBlock(eth.blockNumber).timestamp; console.log("at block: " + eth.blockNumber + " (" + new Date(ts) + ")"); console.log(' datadir: ' + admin.datadir); })(); `) if modules, err := self.supportedApis(); err == nil { loadedModules := make([]string, 0) for api, version := range modules { loadedModules = append(loadedModules, fmt.Sprintf("%s:%s", api, version)) } sort.Strings(loadedModules) } } func (self *jsre) supportedApis() (map[string]string, error) { return self.client.SupportedModules() } func (js *jsre) apiBindings() error { apis, err := js.supportedApis() if err != nil { return err } apiNames := make([]string, 0, len(apis)) for a, _ := range apis { apiNames = append(apiNames, a) } jeth := utils.NewJeth(js.re, js.client) js.re.Set("jeth", struct{}{}) t, _ := js.re.Get("jeth") jethObj := t.Object() jethObj.Set("send", jeth.Send) jethObj.Set("sendAsync", jeth.Send) err = js.re.Compile("bignumber.js", re.BigNumber_JS) if err != nil { utils.Fatalf("Error loading bignumber.js: %v", err) } err = js.re.Compile("web3.js", re.Web3_JS) if err != nil { utils.Fatalf("Error loading web3.js: %v", err) } _, err = js.re.Run("var Web3 = require('web3');") if err != nil { utils.Fatalf("Error requiring web3: %v", err) } _, err = js.re.Run("var web3 = new Web3(jeth);") if err != nil { utils.Fatalf("Error setting web3 provider: %v", err) } // load only supported API's in javascript runtime shortcuts := "var eth = web3.eth; var personal = web3.personal; " for _, apiName := range apiNames { if apiName == "web3" || apiName == "rpc" { continue // manually mapped or ignore } if jsFile, ok := web3ext.Modules[apiName]; ok { if err = js.re.Compile(fmt.Sprintf("%s.js", apiName), jsFile); err == nil { shortcuts += fmt.Sprintf("var %s = web3.%s; ", apiName, apiName) } else { utils.Fatalf("Error loading %s.js: %v", apiName, err) } } } _, err = js.re.Run(shortcuts) if err != nil { utils.Fatalf("Error setting namespaces: %v", err) } js.re.Run(`var GlobalRegistrar = eth.contract(` + registrar.GlobalRegistrarAbi + `); registrar = GlobalRegistrar.at("` + registrar.GlobalRegistrarAddr + `");`) // overrule some of the methods that require password as input and ask for it interactively p, err := js.re.Get("personal") if err != nil { fmt.Println("Unable to overrule sensitive methods in personal module") return nil } // Override the unlockAccount and newAccount methods on the personal object since these require user interaction. // Assign the jeth.unlockAccount and jeth.newAccount in the jsre the original web3 callbacks. These will be called // by the jeth.* methods after they got the password from the user and send the original web3 request to the backend. if persObj := p.Object(); persObj != nil { // make sure the personal api is enabled over the interface js.re.Run(`jeth.unlockAccount = personal.unlockAccount;`) persObj.Set("unlockAccount", jeth.UnlockAccount) js.re.Run(`jeth.newAccount = personal.newAccount;`) persObj.Set("newAccount", jeth.NewAccount) } // The admin.sleep and admin.sleepBlocks are offered by the console and not by the RPC layer. // Bind these if the admin module is available. if a, err := js.re.Get("admin"); err == nil { if adminObj := a.Object(); adminObj != nil { adminObj.Set("sleepBlocks", jeth.SleepBlocks) adminObj.Set("sleep", jeth.Sleep) } } return nil } func (self *jsre) AskPassword() (string, bool) { pass, err := utils.Stdin.PasswordPrompt("Passphrase: ") if err != nil { return "", false } return pass, true } func (self *jsre) ConfirmTransaction(tx string) bool { // Retrieve the Ethereum instance from the node var ethereum *eth.Ethereum if err := self.stack.Service(ðereum); err != nil { return false } // If natspec is enabled, ask for permission if ethereum.NatSpec && false /* disabled for now */ { // notice := natspec.GetNotice(self.xeth, tx, ethereum.HTTPClient()) // fmt.Println(notice) // answer, _ := self.Prompt("Confirm Transaction [y/n]") // return strings.HasPrefix(strings.Trim(answer, " "), "y") } return true } func (self *jsre) UnlockAccount(addr []byte) bool { fmt.Printf("Please unlock account %x.\n", addr) pass, err := utils.Stdin.PasswordPrompt("Passphrase: ") if err != nil { return false } // TODO: allow retry var ethereum *eth.Ethereum if err := self.stack.Service(ðereum); err != nil { return false } a := accounts.Account{Address: common.BytesToAddress(addr)} if err := ethereum.AccountManager().Unlock(a, pass); err != nil { return false } else { fmt.Println("Account is now unlocked for this session.") return true } } // preloadJSFiles loads JS files that the user has specified with ctx.PreLoadJSFlag into // the JSRE. If not all files could be loaded it will return an error describing the error. func (self *jsre) preloadJSFiles(ctx *cli.Context) error { if ctx.GlobalString(utils.PreLoadJSFlag.Name) != "" { assetPath := ctx.GlobalString(utils.JSpathFlag.Name) jsFiles := strings.Split(ctx.GlobalString(utils.PreLoadJSFlag.Name), ",") for _, file := range jsFiles { filename := common.AbsolutePath(assetPath, strings.TrimSpace(file)) if err := self.re.Exec(filename); err != nil { return fmt.Errorf("%s: %v", file, jsErrorString(err)) } } } return nil } // jsErrorString adds a backtrace to errors generated by otto. func jsErrorString(err error) string { if ottoErr, ok := err.(*otto.Error); ok { return ottoErr.String() } return err.Error() } func (self *jsre) interactive() { // Read input lines. prompt := make(chan string) inputln := make(chan string) go func() { defer close(inputln) for { line, err := utils.Stdin.Prompt(<-prompt) if err != nil { if err == liner.ErrPromptAborted { // ctrl-C self.resetPrompt() inputln <- "" continue } return } inputln <- line } }() // Wait for Ctrl-C, too. sig := make(chan os.Signal, 1) signal.Notify(sig, os.Interrupt) defer func() { if self.atexit != nil { self.atexit() } self.re.Stop(false) }() for { prompt <- self.ps1 select { case <-sig: fmt.Println("caught interrupt, exiting") return case input, ok := <-inputln: if !ok || indentCount <= 0 && exit.MatchString(input) { return } if onlyws.MatchString(input) { continue } str += input + "\n" self.setIndent() if indentCount <= 0 { if mustLogInHistory(str) { utils.Stdin.AppendHistory(str[:len(str)-1]) } self.parseInput(str) str = "" } } } } func mustLogInHistory(input string) bool { return len(input) == 0 || passwordRegexp.MatchString(input) || !leadingSpace.MatchString(input) } func (self *jsre) withHistory(datadir string, op func(*os.File)) { hist, err := os.OpenFile(filepath.Join(datadir, "history"), os.O_RDWR|os.O_CREATE, os.ModePerm) if err != nil { fmt.Printf("unable to open history file: %v\n", err) return } op(hist) hist.Close() } func (self *jsre) parseInput(code string) { defer func() { if r := recover(); r != nil { fmt.Println("[native] error", r) } }() if err := self.re.EvalAndPrettyPrint(code); err != nil { if ottoErr, ok := err.(*otto.Error); ok { fmt.Println(ottoErr.String()) } else { fmt.Println(err) } return } } var indentCount = 0 var str = "" func (self *jsre) resetPrompt() { indentCount = 0 str = "" self.ps1 = "> " } func (self *jsre) setIndent() { open := strings.Count(str, "{") open += strings.Count(str, "(") closed := strings.Count(str, "}") closed += strings.Count(str, ")") indentCount = open - closed if indentCount <= 0 { self.ps1 = "> " } else { self.ps1 = strings.Join(make([]string, indentCount*2), "..") self.ps1 += " " } } 42181e822478f6759af'>Style nits in the ports I maintain.David E. O'Brien2000-02-135-20/+24 * Fix for -current.Jeremy Lea2000-02-131-2/+3 * "Now we can send a request with `Referer:' by setting the environmentDavid E. O'Brien2000-02-132-0/+42 * Update to 0.7Satoshi Taoka2000-02-083-6/+11 * Change all www.freebsd.org/~user references to people.FreeBSD.org/~user,Peter Wemm2000-02-081-1/+1 * Upgrade to curl 6.3, USE_OPENSSL and actually make USE_SSL compile in SSLKris Kennaway2000-02-072-9/+14 * Make sure we use the correct path to perl(1).Steve Price2000-01-302-4/+13 * Update to pre10Michael Haro2000-01-286-52/+52 * Upgrade to 2.1.6.Munechika SUMIKAWA2000-01-252-3/+3 * restore historical NLIST behaviourAndrey A. Chernov2000-01-252-0/+40 * Update to version 0.6.Steve Price2000-01-243-7/+58 * Updates the port to version 2.1.5. Adds a couple of lost files inMichael Haro2000-01-223-3/+5 * Add 'ipv6' on CATEGORIES.Munechika SUMIKAWA2000-01-181-1/+1 * allow definition of NO_X11 to compile without xpm/gtkChris Piazza2000-01-111-2/+7 * Update to 3.0 beta 21.David E. O'Brien2000-01-103-5/+5 * Update to 0.5.1Chris Piazza2000-01-082-3/+3 * Update to version 1.07.1.Steve Price2000-01-014-15/+24 * Adding sftp version 0.5.Steve Price1999-12-315-0/+72 * Be sure to create ${PREFIX}/www/data before we try to copy files into it.Steve Price1999-12-301-1/+2 * Update MASTER_SITESChris D. Faulhaber1999-12-291-1/+1 * Update version required comment and add new MASTER_SITE.Steve Price1999-12-261-2/+3 * Adding ftplocate version 1.50.Steve Price1999-12-255-0/+84 * Adding ftplocate version 1.50.Steve Price1999-12-251-0/+1 * add more mastersites, disable use of sendfile until bugs are fixedMichael Haro1999-12-232-4/+16 * Nuke beroftpd, it has security holes and active development seems toBill Fumerola1999-12-101-1/+0 * Update to version 0.5.0Chris Piazza1999-12-083-2/+3 * update to 1.2.0p9Michael Haro1999-12-0612-98/+366 * Remove a ftp server that isn't mirroring properly and hasn'tBill Fumerola1999-11-231-1/+0 * Add trailing slash to fix distfile-fennerage.Bill Fumerola1999-11-231-1/+1 * Update to version 2.0.5aChris Piazza1999-11-144-24/+13 * Update to version 0.4.9Chris Piazza1999-11-112-8/+3 * Change dependencies from static to shared openssl libraries,Dirk Froemberg1999-11-081-2/+2 * Upgrade to curl 6.1Kris Kennaway1999-10-272-3/+3 * Update to 1.0.6Michael Haro1999-10-262-4/+4 * Update port to version 2.1.4Michael Haro1999-10-264-5/+8 * Fix 'dir .' (works as dir *)Andrey A. Chernov1999-10-242-0/+22 * upgrade to 2.6.0Andrey A. Chernov1999-10-2420-206/+204 * Bump gnome libraries' version numbers.Satoshi Asami1999-10-171-1/+1 * - install ftpwhoMichael Haro1999-10-116-10/+14 * - add a startup script for use with standalone modeMichael Haro1999-10-106-6/+52 * update to 1.2.0pre8Michael Haro1999-10-104-8/+8 * Update to spegla-1.04p1, which fixes core dumps that can happen whenJohn Polstra1999-10-102-3/+3 * Update to version 1.0b5Chris Piazza1999-10-033-10/+13 * Update to pre7Michael Haro1999-09-286-10/+10 * Update to version 0.4.7Chris Piazza1999-09-192-3/+6 * Update to pre6 which increases security.Michael Haro1999-09-186-26/+28 * Mark port as forbidden due to security problems. With any luckMichael Haro1999-09-112-0/+4 * Fix some pathsTorsten Blum1999-09-102-15/+21 * Update to version 2.0.4Chris Piazza1999-09-102-4/+5 * gtm depends upon libcapplet, found in gnomecontrolcenterJacques Vidrine1999-09-101-1/+2 * Update to version 2.0.3.Steve Price1999-09-072-4/+7 * add more official patchesAndrey A. Chernov1999-09-044-2/+20 * FreeBSD.ORG -> FreeBSD.orgMichael Haro1999-08-3112-17/+17 * Add a PATCH_FILE to close a security hole in wu-ftpd.Chris Piazza1999-08-314-0/+8 * Remove preceeding pkgname from some of the comments having one.Tim Vanderhoek1999-08-301-1/+1 * Caps, no period.Tim Vanderhoek1999-08-301-1/+1 * We need libcompat on FreeBSD/Alpha too.Steve Price1999-08-292-4/+22 * $Id$ -> $FreeBSD$Peter Wemm1999-08-291-1/+1 * swap #include order so things work wellMichael Haro1999-08-292-10/+10 * addMichael Haro1999-08-292-0/+20 * Unbreak this port (it was using a function called sendfile())Chris Piazza1999-08-292-234/+154 * ln -> ${LN}Michael Haro1999-08-281-1/+1 * Update to version 1.0b2Chris Piazza1999-08-273-11/+10 * Change Id->FreeBSD.David E. O'Brien1999-08-2534-34/+34 * update to 1.2.0pre3aMichael Haro1999-08-236-6/+24 * Add patch-ac, which I forgot to cvs add when I upgraded pavuk to pl18Chris Piazza1999-08-051-0/+12 * Fix a typo in the makefile, it was doing ${MKDIR} share/... insteadChris Piazza1999-08-054-14/+20 * Add a secondary category wwwChris Piazza1999-08-022-4/+4 * Adjust dependency, net/wget -> ftp/wget.Satoshi Asami1999-08-021-3/+3 * Change "net" -> "ftp".Satoshi Asami1999-08-0233-66/+66 * Add new category ftp.Satoshi Asami1999-08-022-0/+36 * really activate libintlAndrey A. Chernov1999-08-024-2/+18 * Update to 0.4.5Chris Piazza1999-08-012-6/+4 * Make a few directories before installing data into them.Chris Piazza1999-07-241-1/+4 * Upgrade to 0.4.4 and disable the http master site: it's serving upChris Piazza1999-07-212-6/+7 * ftp://ftp.max.irk.ru/pub/unix/net/www/wget/ now isDavid E. O'Brien1999-07-152-4/+4 * Add secondary category "www".David E. O'Brien1999-07-052-6/+6 * Update 1.2.4 -> 2.0.1:Sheldon Hearn1999-07-013-5/+6 * Update Y2K URLMichael Haro1999-06-302-4/+4 * Remove trailing spaces, and any periods that were hidden by them.Tim Vanderhoek1999-06-281-1/+1 * Commit #3/4 to enforce caps, no period.Tim Vanderhoek1999-06-2724-24/+24 * Update to pl15.Chris Piazza1999-06-264-9/+22 * Fix typo in the PKGNAME.Chris Piazza1999-06-231-2/+2 * Import of ``downloader''.Chris Piazza1999-06-236-0/+66 * Fix the path in the second MASTER_SITE.Chris Piazza1999-06-201-2/+2 * Change my email address to FreeBSD.org.Chris Piazza1999-06-194-14/+7 * Update yafc to 0.4.3.Michael Haro1999-06-182-4/+4 * update mastersitesMichael Haro1999-06-121-2/+2 * upgrade to beta 19Andrey A. Chernov1999-06-112-5/+5 * Yet another ftp client. Similar to ftp(1)Satoshi Taoka1999-06-115-0/+32 * upgrade to 2.5.0Andrey A. Chernov1999-06-084-12/+10 * Remove the test to create ${PREFIX}/share/info/dir as it is nowMichael Haro1999-06-066-17/+3 * include ${PREFIX}/include/openssl due to openssl upgrade.Dirk Froemberg1999-06-021-2/+3 * Use new version gnomelibs.Steve Price1999-05-301-3/+5 * Update to use gtk version 1.2.3.Steve Price1999-05-295-13/+33 * Update gwget 0.2.0 -> gtm 0.3.0Jacques Vidrine1999-05-295-19/+53 * Upgrade to v5.9Kris Kennaway1999-05-272-5/+5 * update to p113Michael Haro1999-05-202-5/+5 * Update to 2.0.1Michael Haro1999-05-184-17/+20 * Update to version 0.801.Steve Price1999-05-102-4/+4 * PR: ports/11463Seiichirou Hiraoka1999-05-088-0/+193 * Update to 0.8.Michael Haro1999-05-073-14/+12 * Remove man page from PLISTBill Fumerola1999-05-071-1/+0 * Update to 5.8Seiichirou Hiraoka1999-05-062-4/+4 * Update to 0.9.12Seiichirou Hiraoka1999-05-062-5/+5 * Update to 0.9pl11Seiichirou Hiraoka1999-05-053-28/+17 * LIB_DEPENDS on the new unified xview port.Steve Price1999-05-051-2/+2 * Remove ftpckconfig which is not installed.Jun Kuriyama1999-05-032-2/+0 * WWW: This is definately the daemon's work. In Chuck we trust.Michael Haro1999-05-035-4/+7 * REQUIRES_MOTIF= yesMichael Haro1999-05-031-2/+3 * move manpage from PLIST to Makefile and support MOTIFLIBMichael Haro1999-05-033-2/+14 * add MOTIFLIB supportMichael Haro1999-05-021-0/+11 * Two fixes:Steve Price1999-05-012-4/+12 * Update to version 0.750.Steve Price1999-05-012-4/+4 * Update to version 1.04Jordan K. Hubbard1999-04-293-3/+4 * Clean up *.orig.Satoshi Taoka1999-04-271-1/+4 * update to version 0.7Michael Haro1999-04-263-7/+7 * Change MAINTAINER email address to mharo@FreeBSD.org and addMichael Haro1999-04-232-6/+8 * Update to pl9, and now use gtk12Michael Haro1999-04-224-28/+39 * Another bunch off WWW: links in DESCRMarc G. Fournier1999-04-222-0/+4 * Update to greed 0.666 (great version number, huh?)Michael Haro1999-04-223-11/+10 * Change depend from gtk10 to gtk12 in an attempt to phase out the gtk10 port.Michael Haro1999-04-211-2/+2 * upgrade greed to 0.665Michael Haro1999-04-202-3/+3 * Update curl from 5.5 to 5.5.1 and remove ftp.all.de - seems to be goneMichael Haro1999-04-162-4/+3 * A fetch(1) like program that includes resume support.Michael Haro1999-04-146-0/+70 * Add fresh MASTER_SITES.Kris Kennaway1999-04-131-3/+5 * Found a maintainier.David E. O'Brien1999-04-102-4/+4 * Fix PLIST.Jacques Vidrine1999-04-081-1/+0 * upgrade to vr17Andrey A. Chernov1999-04-078-184/+130 * Upgrade to net/cftp 0.9.3Justin M. Seger1999-04-062-4/+6 * Import of gftp version 1.13.Steve Price1999-04-036-0/+78 * Maintainer asked to be removed.Steve Price1999-04-032-4/+4 * Update to version 1.2.0pre3.Steve Price1999-04-026-38/+34 * FTP mirroring program written in PERL (REQUIRES PERL5,Net::FTP)Satoshi Taoka1999-04-025-0/+41 * Remove the last remaining dependency to SSLeay. Use openssl instead.Dirk Froemberg1999-03-301-3/+4 * New list of MASTER_SITES.Steve Price1999-03-251-2/+4 * * Needed dependency for gettextJacques Vidrine1999-03-212-4/+8 * Ftpmirror is an utility to mirror with FTPSatoshi Taoka1999-03-196-0/+338 * Upgrade to v0.4.4, set myself as maintainer.Kris Kennaway1999-03-172-6/+6 * A GNOME front end to wget.Jacques Vidrine1999-03-175-0/+41 * Update to version 1.2.0pre2.Steve Price1999-03-156-28/+18 * Update to version 1.2.4.Steve Price1999-03-152-4/+4 * Update to version 0.9pl5.Steve Price1999-03-153-7/+7 * undefine loosing PASV race protection: it not protects well andAndrey A. Chernov1999-03-092-30/+58 * upgrade to vr16Andrey A. Chernov1999-03-096-58/+18 * master site has been changed.Dima Ruban1999-02-222-4/+4 * Update to 2.4.2-beta-18-vr14Seiichirou Hiraoka1999-02-214-8/+8 * upgrade to 3.0b18David E. O'Brien1999-02-212-4/+4 * upgrade to 3.0b17David E. O'Brien1999-02-183-11/+11 * add buffer overflow vulnerability reduction patchDavid E. O'Brien1999-02-134-2/+12 * There is no need for "USE_AUTOCONF" when "GNU_CONFIGURE" will work just fine.David E. O'Brien1999-02-111-2/+2 * Portlint.Satoshi Asami1999-02-112-8/+8 * upgrade to vr13 to close security hole and lots of enhancementsAndrey A. Chernov1999-02-108-80/+60 * curl is a client to get documents/files from servers, using any of theBill Fumerola1999-02-095-0/+49 * ${MASTER_SITE_GNU} got rearranged in December; let's catch up.Bill Fenner1999-01-272-2/+4 * Fixup: Ports that want gtk+ 1.0.x should now reference gtk10-config.Jacques Vidrine1999-01-231-2/+2 * Find the distfile again.Steve Price1999-01-211-2/+2 * Update to version 0.4.1.Steve Price1999-01-183-6/+8 * Add a couple more Y2K links...Marc G. Fournier1999-01-132-2/+6 * Update to version 0.996.Steve Price1999-01-113-13/+15 * Update to version 1.2.3.Steve Price1999-01-112-4/+4 * Change *_DEPENDS on lang/perl5 to USE_PERL5 so we won't have anySatoshi Asami1999-01-021-2/+2 * gtk11 library is called gtk11, not gtk.Satoshi Asami1998-12-221-2/+2 * upgrade to alpha-9Andrey A. Chernov1998-12-194-39/+19 * Update to version 1.03Jordan K. Hubbard1998-12-193-10/+13 * Upgrade to v1.2.Justin M. Seger1998-12-183-3/+4 * No need to use += for variable defined only once.Satoshi Asami1998-12-172-4/+4 * Pavuk is a HTTP, FTP and Gopher mirroring tool.Bill Fumerola1998-12-176-0/+92 * Upgrade to 1.2.0, and associated changes.Bill Fumerola1998-12-158-84/+106 * Unbreak for ELF.Justin M. Seger1998-12-122-7/+12 * Add more MASTER_SITES.Bill Fumerola1998-12-092-4/+12 * Upgrade to 3.0 beta #16.David E. O'Brien1998-12-092-4/+4 * Initial Import.Bill Fumerola1998-12-025-0/+70 * Use bsd.port.{pre,post}.mk to move PORTOBJFORMAT to front, or changeSatoshi Asami1998-11-141-10/+12 * Checksum changed....Satoshi Asami1998-11-141-1/+1 * Upgrade to 3.0 Beta 15.David E. O'Brien1998-11-122-4/+5 * Unbreak for ELF.Justin M. Seger1998-10-152-4/+6 * Mark BROKEN ELFJustin M. Seger1998-10-141-1/+3 * Mark BROKEN for ELF:Justin M. Seger1998-10-141-1/+3 * Upgrade to 1.5.3.Thomas Gellekum1998-10-084-8/+8 * "ln -s" -> "ln -sf" to make this reinstall-friendly.Satoshi Asami1998-09-281-3/+3 * List lib*.so links.Satoshi Asami1998-09-281-0/+2 * ELFifyDavid E. O'Brien1998-09-274-80/+41 * Remove regexp support for libxview not that it builds ELF too.Steve Price1998-09-221-2/+2 * Remove regexp support for Xaw3d since it can now be built inSteve Price1998-09-211-2/+2 * Add 2 entries of share/lftp/*.Vanilla I. Shu1998-09-191-0/+3 * Upgrade to 1.1.1Vanilla I. Shu1998-09-16