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)))))))))