Check for -E...
[doldaconnect.git] / lib / guile / autodl
index fef6b70..af98f9e 100755 (executable)
@@ -62,7 +62,9 @@
 
 (define (wanttosearch)
   (> (- (current-time) lastsearch)
-     (if (> (length trans) 0) 300 60))
+     (if (eq? (cdr (assoc 'search-mode session)) 'wait)
+        7200
+        (if (> (length trans) 0) 300 60)))
   )
 
 (define defspeed '())
                    (begin (logf (string-append "transfer " (number->string (car o)) " timing out"))
                           (dc-ecmd-assert 200 "cancel" (car o))
                           (disablepeer (cdr (assoc 'peer (cdr o))))
-                          (set! trans (assq-remove! trans (car o)))))
+                          (set! trans (assq-remove! trans (car o)))
+                          (write-info-file)))
                (if (and (eq? (cdr (assoc 'state (cdr o))) 'main)
                         (> (- time (cdr (assoc 'lastprog (cdr o)))) 60))
                    (begin (logf (string-append "transfer " (number->string (car o)) " seems to have stalled"))
                           (dc-ecmd-assert 200 "cancel" (car o))
-                          (set! trans (assq-remove! trans (car o)))))
+                          (set! trans (assq-remove! trans (car o)))
+                          (write-info-file)))
                (if (and (eq? (cdr (assoc 'state (cdr o))) 'main)
                         (> (- (cdr (assoc 'lastprog (cdr o))) (cdr (assoc 'lasttime (cdr o)))) 20))
                    (begin (set-cdr! (assoc 'curspeed (cdr o))
                                     (/ (- (cdr (assoc 'curpos (cdr o))) (cdr (assoc 'lastpos (cdr o))))
                                        (- (cdr (assoc 'lastprog (cdr o))) (cdr (assoc 'lasttime (cdr o))))))
                           (set-cdr! (assoc 'lastpos (cdr o)) (cdr (assoc 'curpos (cdr o))))
-                          (set-cdr! (assoc 'lasttime (cdr o)) (cdr (assoc 'lastprog (cdr o)))))))
+                          (set-cdr! (assoc 'lasttime (cdr o)) (cdr (assoc 'lastprog (cdr o))))
+                          (write-info-file))))
                trans))
   )
 
                     (cons 'realsr info-numreal)
                     (cons 'totalsr info-numtotal)
                     (cons 'lastsrch lastsearch)
-                    (cons 'srcheta info-searcheta))
+                    (cons 'srcheta info-searcheta)
+                    (cons 'srchmode (cdr (assoc 'search-mode session))))
               op)
        (newline op)
        (close-port op))))
     (set! info-numavail numavail)
     (set! info-numreal numreal)
     (set! info-numtotal numtotal)
+    (write-info-file)
     retval)
   )
 
 (define (handlesr filename fnet peer size slots resptime hash)
+  (if (eq? (cdr (assoc 'search-mode session)) 'wait)
+      (begin (set-cdr! (assoc 'search-mode session) 'normal)
+            (logf "reverting to normal mode")))
   (let ((cl (or (assoc size sr)
                (let ((newp (cons size '()))) (set! sr (append sr (list newp))) newp)))
        (newsr (list
   )
 
 (define (autodl-main args)
-  (let ((dc-server #f) (done #f) (retval 0))
-    (let ((getopt (make-getopt (cdr args) "hs:S:e:p:t:a:I:")) (arg #f))
+  (let ((dc-server #f) (done #f) (retval 0) (filterexit ""))
+    (let ((getopt (make-getopt (cdr args) "whs:S:e:p:t:a:I:E:")) (arg #f))
       (do ((arg (getopt) (getopt))) ((not (and (pair? arg) (char? (car arg)))) (set! args arg))
        (cond ((eq? (car arg) #\h)
               (begin (display "usage: autodl [-s server] -S sessfile\n" (current-error-port))
-                     (display "       autodl [-s server] -e search-expression [-p prio] [-t tag] [-a userarg]\n" (current-error-port))
+                     (display "       autodl [-w] [-s server] -e search-expression [-p prio] [-t tag] [-a userarg]\n" (current-error-port))
                      (display "       autodl [-s server]\n" (current-error-port))
                      (display "       autodl -h\n" (current-error-port))
                      (exit 0)))
               (let ((c (assoc 'info-file session)))
                 (if c (set-cdr! c (cdr arg))
                     (set! session (cons (cons 'info-file (cdr arg)) session)))))
+             ((eq? (car arg) #\E)
+              (let ((c (assoc 'estat-file session)))
+                (if c (set-cdr! c (cdr arg))
+                    (set! session (cons (cons 'estat-file (cdr arg)) session)))))
              ((eq? (car arg) #\e)
               (set! session (cons (cons 'sexpr (dc-lexsexpr (cdr arg))) session)))
+             ((eq? (car arg) #\w)
+              (set! session (cons '(search-mode . wait) session)))
              )
        )
       )
        (set! session (cons '(prio . 10) session)))
     (if (not (assoc 'maxtrans session))
        (set! session (cons '(maxtrans . 1) session)))
+    (if (not (assoc 'search-mode session))
+       (set! session (cons '(search-mode . normal) session)))
     (if (not (validate-session session)) (begin (display "Invalid session!\n" (current-error-port)) (exit 1)))
     (if (not dc-server) (set! dc-server (getenv "DCSERVER")))
     (if (not dc-server) (set! dc-server "localhost"))
           (lambda (key . args)
             (logf (string-append "could not connect to server: " (apply format #f (cadr args) (caddr args))))
             (exit 2)))
-    (dc-ecmd-assert 200 "notify" "all" "on")
+    (dc-ecmd-assert 200 "notify" "trans:act" "on" "trans:prog" "on" "srch:act" "on")
     (for-each (lambda (sig) (sigaction sig (lambda (sig) (throw 'sig sig)))) (list SIGINT SIGTERM SIGHUP))
     (catch 'sig
           (lambda ()
                               (begin (set! srchid (car ires))
                                      (logf (string-append "search scheduled in " (number->string (cadr ires)) " seconds (id " (number->string srchid) ")"))
                                      (set! info-searcheta (+ (current-time) (cadr ires)))
-                                     (set! lastsearch -1)))
+                                     (set! lastsearch -1)
+                                     (write-info-file)))
                              ((501)
                               (begin (set! srchid -1)
                                      (logf (string-append "no fnetnodes available to search on"))
                    (if (> (- (current-time) lastparse) 20)
                        (begin (parseresults)
                               (set! lastparse (current-time))))
-                   (write-info-file)
                    (dc-select 10000)
                    (while (let ((resp (dc-getresp)))
                             (if resp
                                           (let* ((ires (dc-intresp resp)) (tr (and ires (assoc (car ires) trans))))
                                             (if tr
                                                 (begin (if (eq? (cdr (assoc 'state (cdr tr))) 'done)
-                                                           (begin (logf (string-append "transfer " (number->string (car ires)) " done"))
+                                                           (begin (logf (string-append "transfer " (number->string (car ires)) " done (" (cadr ires) ")"))
                                                                   (set! trans (assq-remove! trans (car ires)))
                                                                   (set! done #t)
+                                                                  (set! filterexit (cadr ires))
                                                                   (throw 'sig 0))
                                                            (begin (logf (string-append "transfer " (number->string (car ires)) " disappeared"))
                                                                   (set! trans (assq-remove! trans (car ires)))))))))
                                           (let ((ires (dc-intresp resp)))
                                             (if (and ires (= (car ires) srchid))
                                                 (begin (set! info-searcheta (+ (current-time) (cadr ires)))
-                                                       (logf (string-append "search rescheduled to T+" (number->string (cadr ires))))))))
+                                                       (logf (string-append "search rescheduled to T+" (number->string (cadr ires))))
+                                                       (write-info-file)))))
                                          ((621) ; Search committed
                                           (let ((ires (dc-intresp resp)))
                                             (if (and ires (= (car ires) srchid))
                                                 (begin (logf "search committed")
                                                        (set! info-searcheta 0)
-                                                       (set! lastsearch (current-time))))))
+                                                       (set! lastsearch (current-time))
+                                                       (write-info-file)))))
                                          ((622) ; Search result
                                           (let ((ires (list->vector (dc-intresp resp))))
                                             (if (and ires (= (vector-ref ires 0) srchid)) (apply handlesr (map (lambda (n) (vector-ref ires n)) '(1 2 3 4 5 7 8))))))
                        )))
           (lambda (key sig)
             (logf "forcing quit")))
+    (if (assoc 'estat-file session)
+       (let ((op (open-output-file (cdr (assoc 'estat-file session)))))
+         (write filterexit op)
+         (newline op)
+         (close-port op)))
     (exit retval)
     )
   )