mmdf(5) راهنمای کاربران mmdf(5)

mmdf - قالب صندوق پستی سامانه توزیع یادداشت چندکاناله (MMDF)

این سند قالب صندوق پستی MMDF را شرح می‌دهد که توسط برخی برنامه‌های MTA و MUA (مانند scomail(1)) برای ذخیره محلی پیام‌های رایانامه استفاده می‌شود.

یک صندوق پستی MMDF پرونده‌ای متنی است که شامل تعداد دلخواهی از پیام‌های رایانامه است. هر پیام شامل یک نشان پستی (postmark) است که پس از آن یک پیام رایانامه قالب‌بندی‌شده مطابق با RFC822 / RFC2822 و سپس یک نشان پستی دیگر قرار می‌گیرد. قالب این پرونده خط‌محور است. خطوط با نویسه‌های خط‌جدید (line feed در کد اسکی 10) از یکدیگر جدا می‌شوند. یک خط نشان پستی شامل چهار نویسه «^A^A^A^A» است (Control-A؛ کد اسکی 1).

نمونه‌ای از یک صندوق پستی MMDF شامل دو رایانامه:
^A^A^A^A
From: example@example.com
To: example@example.org
Subject: test

>From what I learned about the MMDF-format:
^A^A^A^A
^A^A^A^A
From: example@example.com
To: example@example.org
Subject: test 2

bar
^A^A^A^A

برخلاف اغلب قالب‌های صندوق پستی تک‌پرونده‌ای دیگر مانند MBOXO و MBOXRD (ببینید mbox(5)) هیچ نیازی به نقل‌قول‌گذاری یا حذف نقل‌قول خطوط «"From "» در صندوق‌های پستی MMDF وجود ندارد، زیرا چنین خطوطی هیچ معنای خاصی در این قالب ندارند.

اگر زمان تغییر (معمولاً تعیین‌شده از طریق stat(2)) یک پرونده صندوق پستی غیرخالی بزرگ‌تر از زمان آخرین دسترسی به آن باشد، پرونده حاوی رایانامه جدید است. بسیاری از برنامه‌های MUA سرآیندی با عنوان «Status:» در هر پیام قرار می‌دهند تا مشخص شود کدام پیام‌ها پیش‌تر خوانده شده‌اند.

از آنجا که پرونده‌های MMDF معمولاً توسط چندین برنامه به صورت موازی در دسترس قرار می‌گیرند، عموماً نباید بدون قفل‌گذاری به پرونده‌های MMDF دسترسی پیدا کرد.

سه سازوکار قفل‌گذاری مختلف (و ترکیب‌هایی از آن‌ها) به طور معمول استفاده می‌شوند:

  • قفل‌گذاری با fcntl(2) عمدتاً در سامانه‌های نوین و سازگار با POSIX به کار می‌رود. استفاده از این روش قفل‌گذاری، به‌ویژه در صورتی که به پرونده‌های MMDF از طریق سامانه پرونده شبکه‌ای (NFS) دسترسی وجود داشته باشد، توصیه می‌شود؛ زیرا به نظر می‌رسد تنها روش مطمئن برای نامعتبرسازی حافظه پنهان کلاینت‌های NFS باشد.
  • قفل‌گذاری با flock(2) عمدتاً در سامانه‌های مبتنی بر BSD استفاده می‌شود.
  • قفل‌گذاری نقطه‌ای (Dotlocking) در انواع سامانه‌ها استفاده می‌شود. برای قفل کردن یک پرونده MMDF به نام folder، برنامه ابتدا یک پرونده موقت با نامی یکتا در دایرکتوری محل قرارگیری folder ایجاد می‌کند. سپس برنامه تلاش می‌کند تا با استفاده از فراخوانی سیستمی link(2) یک پیوند سخت (hard link) به نام folder.lock به آن پرونده موقت ایجاد کند. موفقیت فراخوانی سیستمی link(2) باید علاوه بر این با استفاده از فراخوانی‌های stat(2) بررسی و تأیید شود. در صورت موفقیت‌آمیز بودن پیوند، پوشه رایانامه قفل‌شده با نقطه (dotlocked) در نظر گرفته می‌شود. پس از آن می‌توان پرونده موقت را با اطمینان حذف (unlink) کرد.
برای آزادسازی قفل، برنامه صرفاً پرونده folder.lock را حذف (unlink) می‌کند.

اگر چندین روش با یکدیگر ترکیب شوند، پیاده‌سازان باید اطمینان حاصل کنند که از گونه‌های غیرمسدودکننده (non-blocking) فراخوانی‌های سیستمی fcntl(2) و flock(2) استفاده نمایند تا از ایجاد بن‌بست (deadlock) جلوگیری شود.

در صورت ترکیب چند روش، یک پرونده MMDF نباید پیش از دستیابی به تمامی قفل‌های مجزا، با موفقیت قفل‌شده تلقی گردد. هنگامی که یکی از روش‌های قفل‌گذاری مجزا با شکست مواجه می‌شود، برنامه باید تمام قفل‌هایی را که با موفقیت کسب کرده است آزاد کند و کل فرایند قفل‌گذاری را پس از یک تأخیر مناسب، از ابتدا دوباره آغاز نماید.

سازوکار قفل‌گذاری مورد استفاده در یک سامانه خاص، تابعی از سیاست‌های محلی است و باید به طور یکپارچه توسط تمام برنامه‌های نصب‌شده روی سامانه که به پرونده‌های MMDF دسترسی دارند استفاده شود. کوتاهی در انجام این کار ممکن است به از دست رفتن داده‌های رایانامه و خراب شدن پرونده‌های MMDF منجر شود.

MMDF بخشی از هیچ استانداردی که در حال حاضر پشتیبانی شود نیست.

MMDF در دانشگاه دلاور (University of Delaware) توسط Dave Crocker توسعه یافت.

scomail(1), fcntl(2), flock(2), link(2), stat(2), mbox(5), RFC822, RFC2822

Urs Janssen <urs@tin.org>

18 فوریه 2002 Unix