URI:
       tdatabase.go - tordam - A library for peer discovery inside the Tor network
  HTML git clone https://git.parazyd.org/tordam
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tdatabase.go (1684B)
       ---
            1 // Copyright (c) 2017-2021 Ivan Jelincic <parazyd@dyne.org>
            2 //
            3 // This file is part of tordam
            4 //
            5 // This program is free software: you can redistribute it and/or modify
            6 // it under the terms of the GNU Affero General Public License as published by
            7 // the Free Software Foundation, either version 3 of the License, or
            8 // (at your option) any later version.
            9 //
           10 // This program is distributed in the hope that it will be useful,
           11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
           12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
           13 // GNU Affero General Public License for more details.
           14 //
           15 // You should have received a copy of the GNU Affero General Public License
           16 // along with this program. If not, see <https://www.gnu.org/licenses/>.
           17 
           18 package tordam
           19 
           20 import (
           21         "encoding/json"
           22         "io/ioutil"
           23         "log"
           24 )
           25 
           26 // WritePeersDB marshals the Peers global to JSON and writes to given file.
           27 // Please note that this should be probably used in conjunction with some sort
           28 // of semaphore.
           29 func WritePeersDB(file string) error {
           30         j, err := json.Marshal(Peers)
           31         if err != nil {
           32                 return err
           33         }
           34         return ioutil.WriteFile(file, j, 0600)
           35 }
           36 
           37 // writePeersDBWithSem is an internal function to call WritePeersDB safely
           38 // using an internal semaphore. Programs using this library should probably
           39 // implement something similar if they want to write Peers to a file.
           40 func writePeersDBWithSem(file string) {
           41         if err := dbSem.Acquire(dbSemCtx, 1); err != nil {
           42                 log.Println("warning: failed to acquire sem for writing:", err)
           43                 return
           44         }
           45         go func() {
           46                 if err := WritePeersDB(file); err != nil {
           47                         log.Println("warning: failed to write peers db:", err)
           48                 }
           49                 dbSem.Release(1)
           50         }()
           51 }