Function: nnmaildir--new-number
nnmaildir--new-number is a byte-compiled function defined in
nnmaildir.el.gz.
Signature
(nnmaildir--new-number NNDIR)
Documentation
Allocate a new article number by atomically creating a file under NNDIR.
Source Code
;; Defined in /usr/src/emacs/lisp/gnus/nnmaildir.el.gz
(defun nnmaildir--new-number (nndir)
"Allocate a new article number by atomically creating a file under NNDIR."
(let ((numdir (nnmaildir--num-dir nndir))
(make-new-file t)
(number-open 1)
number-link previous-number-link path-open path-link ino-open)
(nnmaildir--mkdir numdir)
(catch 'return
(while t
(setq path-open (concat numdir (number-to-string number-open)))
(if (not make-new-file)
(setq previous-number-link number-link)
(nnmaildir--mkfile path-open)
;; If Emacs had O_CREAT|O_EXCL, we could return number-open here.
(setq make-new-file nil
previous-number-link 0))
(let* ((attr (file-attributes path-open))
(nlink (file-attribute-link-number attr)))
(setq ino-open (file-attribute-inode-number attr)
number-link (+ number-open nlink)))
(if (= number-link previous-number-link)
;; We've already tried this number, in the previous loop iteration,
;; and failed.
(signal 'error `("Corrupt internal nnmaildir data" ,path-open)))
(setq path-link (concat numdir (number-to-string number-link)))
(nnmaildir--condcase err
(progn
(add-name-to-file path-open path-link)
(throw 'return number-link))
(cond
((nnmaildir--emlink-p err)
(setq make-new-file t
number-open number-link))
((nnmaildir--eexist-p err)
(let ((attr (file-attributes path-link)))
(unless (equal (file-attribute-inode-number attr) ino-open)
(setq number-open number-link
number-link 0))))
(t (signal (car err) (cdr err)))))))))