Mục lục

  1. PHẦN MỀM ĐIỀU KHIỂN
  2. CHUYỂN TẬP TIN
  3. MÃ NGUỒN
  4. PHIÊN BẢN UNIX
  5. CHUYỂN SANG MỘT NỀN TẢNG MỚI
  6. SỬA LỖI
  7. LỊCH SỬ CẬP NHẬT
  8. TẢI VỀ

EK ( Kermit Nhúng, E-Kermit) là một ứng dụng của giao thức chuyển đổi tập tin Kermit, viết bằng ngôn ngữ ANSI C và dùng để nhúng vào các thiết bị hoặc phần lõi. Mục đích là dùng trong các ứng dụng thời gian thực hoặc xây dựng cơ sở dữ liệu DLL hoặc các thư viện. EKSW là một phiên bản mới của E-Kermit có hỗ trợ giao thức cửa sổ trượt thực. EK và EKSW nên được tổng hợp lại thành một cơ sở code, nhưng hiện tại điều này chưa xảy ra.

E-Kermit có khả năng gì

EK chỉ có hai chức năng: gửi và nhận tập tin. Giao thức này gọn nhẹ và hoàn toàn chạy lại được. Trên SPARC (RISC), kermit.o nặng tầm 25K. Trên Intel (CISC) nó tầm 15K. Bằng cách giảm các kích cỡ đệm và loại bỏ tính năng thừa và phụ, ta có thể đạt được kích cỡ nhỏ hơn.

E-Kermit KHÔNG có khả năng gì

EK không bao gồm các tính năng máy chủ/máy khách; một ngôn ngữ lập trình hoặc điều khiển; chuyển đổi các bộ ký tự; mã hóa vận chuyển; hoặc bất kỳ phương thức giao tiếp hoặc quy trình nhập/xuất tập tin nào. Nó không liên kết với modem cũng như tạo kết nối. Nó không có sẵn các ngăn xếp TCP/IP hoặc giao diện dẫn đến ngăn xếp ngoại. Nếu bạn cần những tính năng này, bạn nên sử dụng chương trình đầy đủ của Kermit ví dụ như  C-Kermit hoặc Kermit 95.

Bản thân EK không phải là một ứng dụng, mà nó chỉ là một quy trình phụ của phần mềm chính. Nó chỉ thực sự hữu dụng với các kỹ sư phần mềm, và họ phải chuẩn bị phần mềm chính hoặc môi trường gọi biến cũng như các tập tin và quy trình giao tiếp nhập/xuất. Môi trường gọi biến cũng phải tạo ra và điều chỉnh kết nối giao tiếp nếu chưa có và nếu cần. Môi trường gọi biến mẫu và hỗ trợ nhập/xuất sẽ được cung cấp trong phiên bản Unix.

Khách hàng của chúng tôi đã tinh chỉnh EK cho thích ứng với nhiều môi trường và nền tảng, bao gồm Palm Pilot, nhiều loại thiết bị cho kỹ thuật viên (ví dụ như thiết bị chẩn đoán lỗi và bảo dưỡng tháp điện thoại), và đôi khi họ cũng cung cấp bản tinh chỉnh của họ hoặc quy trình nhập/xuất của họ. Chúng tôi có thể chia sẻ những phiên bản này, nhưng hoàn toàn ở dạng nguyên mẫu. Chúng tôi không thể hỗ trợ hoặc duy trì các dòng lệnh viết bởi người dùng; do vậy(ví dụ) nếu một phiên bản mới của EK được phát hành, các module do người dùng cung cấp có thể sẽ không được cập nhật. Các dòng lệnh được người dùng phát triển bao gồm:

  • Chuyển đổi hệ cho Microsoft Windows 9x/ME/NT/2000/XP/Vista/7 và nhập/xuất tập tin EK 1.3 trở về sau.
  • Wind River VxWorks cho EK 1.1.
  • EK 1.2 dịch sang ngôn ngữ Java.

EK bao gồm các tính năng sau trong Giao thức Kermit:

  • Gói tin dài
  • Cửa sổ trượt với khả năng hồi phục lỗi Go-back-to-N (tính năng lặp lại có chọn lọc ở trong EKSW).
  • Nén số lần lặp lại
  • Gán và bỏ gán tiền tố cho ký  tự điều khiển
  • Gán tiền tố cho bit thứ 8 (để chuyển dữ liệu 8 bit qua đường dẫn 7 bit) (= parity)
  • Gói tin thông số (loại, kích cỡ, và ngày)
  • Gửi và nhận nhiều hoặc một tập tin.
  • Chuyển đổi tự động giữa chế độ nhị phân và chế độ chữ theo từng tập tin.
  • Cả ba loại kiểm tra khối (checksum 6 bit và 12 bit, CRC 16 bit).
  • Báo cáo tình hình (hiện trạng giao thức, tên tập tin, kích cỡ, mốt thời gian, số byte đến hiện tại).
  • Hủy giao dịch, có thể được kích bởi bất kỳ bên nào.

Những tính năng thuộc Giao thức Kermit sau không được đưa vào:

  • Cửa sổ trượt với tính năng tái truyền có chọn lọc (trừ trong EKSW)
  • Bộ ký tự
  • Thay đổi khóa
  • Máy khách/máy chủ

Hết thời hạn kết nối là trách nhiệm của chương trình Kermit ở mấy bên kia hoặc, nếu bản thân E-Kermit cần, quy trình đọc gói tin phụ thuộc vào nền tảng mà bạn viết nên.

Từ phiên bản 1.5 về sau, E-Kermit bao gồm các cấu trúc tiền xử lý để giúp bạn loại bỏ các tính năng như gói thông tin dài, cửa sổ trượt, cửa sổ, và kiểm tra khối ở mức độ cao nhằm mục đích sử dụng càng ít bộ nhớ càng tốt, và cấu trúc này cũng có thể được sử dụng trong cấu hình Chỉ-nhận.

PHẦN MỀM ĐIỀU KHIỂN

EK được thiết kế để dùng trong một môi trường hợp tác đa nhiệm, nhưng nó không cần một môi trường như vậy. Chương trình điều khiển sẽ quản lý việc xếp lịch. Dưới đây là những gì phần mềm điều khiển phải (và/hoặc có thể) làm:

  • Nếu muốn, mở thiết bị giao tiếp, nếu có.
  • Nếu muốn, đưa thiết bị giao tiếp, nếu có, vào “chế độ gói dữ liệu”.
  • Kích hoạt cấu trúc Kermit với thông số hoạt động mong muốn.
  • Gọi hàm kermit(K_INIT, …) để Kermit tự kích hoạt.
  • Nếu đang gửi tập tin, gọi kermit(K_SEND) để bắt đầu chuyển giao.

(Khi E-Kermit được dùng để nhận tập tin, nó sẽ đợi gói dữ liệu đầu tiên từ người gửi tập tin; vậy nên nó sẽ đơn giản là gia nhập vòng lặp gói dữ liệu.) Trong vòng lặp gói dữ liệu, E-Kermit sẽ:

  • Tạo phần đệm và đọc dữ liệu đến trong đó.
  • Kiểm tra xem có bị người dùng gián đoạn.
  • Gọi lệnh kermit(K_RUN, …) để làm những bước tiếp.
  • Làm bất kỳ điều gì nó muốn  (ví dụ như chạy lệnh khác).
  • Thoát hoặc tiếp tục vòng lặp tùy theo lệnh trở về kermit().

Mỗi khi phần mềm điều khiển gọi hàm kermit(), nó sẽ được ủy quyền để giải quyết một gói dữ liệu; vậy nên một gói dữ liệu = một lát cắt thời gian. Nếu phần mềm điều khiển không còn gì để làm, nó sẽ xử lý các gói dữ liệu liên tục như một phần mềm Kermit bình thường. Khi đang ở trong vòng lặp chuyển giao dữ liệu, mọi lệnh gọi kermit() sẽ đưa ra cấu trúc bao gồm:

  • Hiện trạng của giao thức
  • Tên hiện tại của tập tin;
  • Kích cỡ tập tin nếu biết được, hoặc -1;
  • Mốc thời gian của tập tin, nếu biết;
  • Số byte đã chuyển đến hiện tại.

Khi đã xong, phần mềm điều khiển sẽ:

  • Khôi phục và đóng (nếu muốn) thiết bị liên lạc.

Những hàm mà phần mềm điều khiển có thể gọi bằng lệnh kermit() bao gồm:

K_INIT   — Kích hoạt kiến trúc dữ liệu.

K_SEND   — (Chỉ dùng khi gửi) — Kích hoạt gửi dữ liệu.

K_RUN    — Chạy giao thức.

K_STATUS — Trả lại bảng thông báo tình hình ở cấu trúc k_response.

K_QUIT   — Thoát ngay lập tức.

K_ERROR  — Gửi gói dữ liệu Error xong thoát.

Lệnh trả về của hàm kermit() gồm:

X_OK     — OK, giao thức đã kích hoạt.

X_DONE   — OK, giao thức hoàn thành.

X_ERROR  — Lỗi nghiêm trọng.

X_STATUS — Trích xuất hiện trạng nhằm trả lời cho K_STATUS.

(Thật ra hiện trạng được trích xuất trong mỗi cuộc gọi) Mã hiện trạng của giao thức bao gồm:

-1       — Lỗi nghiêm trọng

 0       — Người nhận (giao thức không hoạt động)

 1       — Người nhận đang đợi gói dữ liệu S

 2       — Người nhận đang đợi gói dữ liệu F hoặc B

 3       — Người nhận đang đợi gói dữ liệu A hoặc D

 4       — Người nhận đang đợi gói dữ liệu D hoặc Z

10       — Người gửi (giao thức không hoạt động)

11       — Người gửi gửi gói S (bắt đầu)

12       — Người gửi gửi gói F (tên tập tin)

13       — Người gửi gửi gói A (giá trị)

14       — Người gửi gửi gói D (dữ liệu)

15       — Người gửi gửi gói Z (EOF)

16       — Người gửi gửi gói B (EOT)

CHUYỂN TẬP TIN

Vì EK được thiết kế chủ yếu cho phần mềm nhúng, nó không dùng chức năng chạy trực tiếp dữ liệu hoặc (trừ trường hợp EKSW) cửa sổ trượt thực (dẫu vậy, đa phần các dòng lệnh của tính năng cửa sổ trượt vẫn còn). Đây là lý do vì sao:

  • Sử dụng giao thức thông thường  ACK/NAK sẽ giúp phần mềm điều khiển nắm quyền lại sau mỗi gói dữ liệu. Điều này giúp nó đảm nhận đa nhiệm vụ, hiển thị quá trình chuyển đổi tập tin, hoặc bất kỳ điều gì. Chạy trực tiếp hoặc sử dụng cửa sổ trượt sẽ khiến phần mềm điều khiển không sử dụng được trong một quãng dài.
  • Chạy trực tiếp dữ liệu hoặc sử dụng cửa sổ trượt sẽ khiến giao diện giữa phần mềm điều khiển và module kermit() trở nên phức tạp hơn nhiều. Thực tế là điều này sẽ khiến các chi tiết của giao thức bị đẩy vào không gian của phần mềm điều khiển, nơi chúng không thuộc về.
  • Chạy trực tiếp dữ liệu thường cần đến kết nối vững vàng (ví dụ như TCP/IP) nhưng các thiết bị với giao tiếp nhúng thường dùng cổng nối tiếp.

Việc EK thiếu tính năng cửa sổ trượt thực được bù đắp bằng việc khiến EK giả vờ hỗ trợ chúng mà không thực sự làm vậy. Điều này giúp cho các bên gửi “phát trực tiếp” gói dữ liệu thay vì đợi ACKs sau mỗi gói, miễn là không có lỗi xảy ra. Nếu có lỗi xảy ra, chiến thuật phục hồi sẽ là “quay lại n” (hoặc “error out” trong một số trường hợp) thay vì “lặp lại có chọn lọc”. EKSW, một phần mềm tách biệt không tích hợp kèm EK (nhưng nên vậy), có hỗ trợ cửa sổ trượt thực với lặp lại có chọn lọc; nghĩa là chỉ những gói dữ liệu cần thì mới được gửi lại.

Nói tóm lại là vì EK được thiết kế đa phần cho phần mềm nhúng nên chậm trễ trong các vòng gửi-nhận tập tin sẽ không là một nhân tố đáng kể; kết nói thường chỉ ở mức cục bộ, nhanh, ngắn, và nếu được điều hành hiệu quả, không có lỗi. Khi điều hành không hiệu quả, tốc độ và/hoặc kích thước gói dữ liệu và/hoặc kích cỡ cửa sổ có thể được tinh chỉnh lại theo giá trị nhất định dể tối ưu hóa hiệu quả và giảm thiểu mất dữ liệu.

MÃ NGUỒN

Các tập tin nguồn bao gòm:

platform.h

Tập header cho các định nghĩa dành riêng cho các nên tảng khác nhau (nếu cần). Dù có rỗng thì đây là tập tin thiết yếu, vì kermit.c bao gồm nó.

kermit.h

Tệp header cho các module. Chứa định nghĩa của cấu trúc k_data và k_response.

kermit.c

Đây là engine chính của giao thức Kermit. Động lực duy nhất của nó là các dữ liệu nó chứa. Tất cả thông tin trạng thái sẽ được lưu ở cấu trúc dữ liệu Kermit. Các thông tin trạng thái này sẽ được truyền theo tham chiếu từ module chính đến các tính năng khác trong module kermit, rồi về lại module này. Vậy nên một module có thể chuyển nhiều tập tin cùng một lúc trên nhiều hệ kết nói khác. Ngoài ra, không có thư viện tham chiếu nào trên module của Kermit, kể cả stdio (trừ khi đang mở chế độ sửa lỗi), và không có tập tin header /usr/include/* đi kèm. Luật lệ dành riêng cho kermit.c:

  • Không biến toàn cục (trừ khi sửa lỗi) hoặc bộ đệm.
  • Không kích hoạt mảng bằng trình biên dịch.
  • Để an toàn, không kích hoạt biến vô hướng.
  • Không gọi thư viện hoặc hệ thống, không dùng hàm #include <…>.
  • Mọi giao tiếp nhập/xuất sẽ được thực hiện bằng các hàm được định dạng ở module tách biệt.

Điểm bắt đầu duy nhất của module kermit.c là hàm kermit():

int kermit(struct k_data * k, struct k_response * r)

Cấu trúc k chứa tất cả những thông số vận hành, biến, thông tin thể trạng, và bộ đệm; cấu trúc r sẽ giúp người gọi biết hiện trạng của giao thức, tên và thông tin tập tin, và tiến độ chuyển giao (byte đã chuyển).

main.c

Phần mềm điều khiển mẫu. Trong môi trường thử Unix, nó chỉ là hàm truyền thống main(), dùng để đọc các điều kiện trong dòng lệnh điều khiển, kích hoạt giao thức, rồi gọi module của giao thức theo vòng lặp phụ thuộc vào hiện trạng, rồi dọn dẹp lại. Trong môi trường nhúng, các tính năng này sẽ được tích hợp trong phần mềm điều khiển.

unixio.c

Các hàm nhập/xuất của Unix. Thay bằng module của bạn mà có tích hợp các hàm này vào môi trường mong muốn và thay đổi quá trình xây dựng của bạn để liên kết với nó. Khởi điểm và quy ước gọi tên sẽ được mô tả ở dưới.

PHIÊN BẢN UNIX

EK được phát triển trên nền tảng Unix thông thường, ví dụ như Mac OS, AIX, Solaris, HP-UX, … hoặc, dạo gần đây, một biến thể của BSD và Linux. Trên các nền tảng này thì EK được cấu tạo như một phần mềm chuyển tập tin từ xa, tương tự như G Kermit, và đã được kiểm nghiệm so sánh với Kermit trên máy bàn như K95 hoặc C-Kermit. LƯU Ý: Phiên bản Unix vẫn hoạt động với stdin/stdout; các “hàng” được cấu tạo theo hướng khó sử dụng nhất có thể (system(“stty …”)). Điều này dẫn đến kết quả khá khác biệt; ví dụ: tải tập tin bằng EK trên hệ Solaris có thể chỉ đạt tốc độ 17Kcps, trong khi đó dùng cùng mạng cùng máy nhưng trên hệ Linux có thể đạt 1700Kcps. Điều này không đáng lo lắm vì vốn EK không được dùng cho mục đích sản xuất trên hệ Unix, vốn đã có G-Kermit và C-Kermit cho mục đích này.

Makefile của Unix bao gồm những mục tiêu sau (it’s easy to add more):

gcc:   Cấu tạo với gcc (mặc định).

cc:    Cấu tạo với cc.

hp:    Cấu tạo với HP-UX.

gccnd: Cấu tạo với gcc, không sửa lỗi.

gprof: Cấu tạo với gcc, bao gồm liệt kê tính chất.

clean: Loại bỏ đối tượng và tập tin chủ đạo.

Makefile này sẽ tạo nên một tệp thực thi trên Unix tên là “ek” (kermit nhúng). Quy trình mẫu main() sau cung cấp bảng hiển thị lệnh điều khiển đơn giản:

$ ./ek -h

Usage: ./ek options [cách dùng]

Options: [Lựa chọn]

 -r           Receive files [Nhận tập tin]

 -s files     Send files [Gửi tập tin]

 -p [neoms]   Parity: none, even, odd, mark, space [Số chẵn hoặc lẻ]

 -b [123]     Block check type: 1, 2, or 3 (default = 3) [Loại test kiểm tra khối]

 -k           Keep incompletely received files [Giữ tập tin chưa nhận đủ]

 -B           Force binary mode [Ép vào chế độ nhị phân]

 -T           Force text mode [Ép vào chế độ chữ]

 -R           Remote mode (vs local) [Chế độ điều khiển từ xa]

 -L           Local mode (vs remote) [Chế độ điều khiển cục bộ]

 -E number    Simulated error rate (0-100) [Tỉ số lỗi giả lập]

 -d           Create debug.log [Tạo tập tin debug.log]

 -h           Help (this message) [Hỗ trợ]

$

Khi gửi tập tin, nếu bạn không định dạng cụ thể là nhị phân hay chữ, EK sẽ quét từng tập tin và dùng dạng chữ hoặc nhị phân theo nội dung từng tập.

Chế độ điều khiển từ xa và chế độ cục bộ chỉ được dùng để kích hoạt khả năng ngăn quy trình chuyển tập tin bằng bàn phím.

THAY ĐỔI THÍCH ỨNG VỚI MỘT NỀN TẢNG KHÁC

Phiên bản 1.0 của EK đã được thay đổi thích ứng với VxWorks bởi Airvana, Inc, Chelmsford MA. Gói chương trình VxWorks EK 1.1 toàn diện đã được đính kèm theo đây để làm ví dụ cho một chương trình sản xuất, với sự cho phép của Airvana (lưu ý rằng API của EK đã thay đổi kể từ lúc viết bài, nên trước khi bạn dùng mã VxWorks, bạn phải cập nhật nó). Để thay đổi thích ứng với một nền tảng khác:

  • Tạo một makefile mới cho nền tảng đích, hoặc viết nên quy trình cấu tạo của riêng bạn.
  • Tạo một tập tin platform.h cho nền tảng của bạn. Tập tin này có thể bao gồm các định nghĩa cần thiết, và nó cũng có thể chép đè lên một số định nghĩa gốc ở trong kermit.h:
    #define NODEBUG để xây dựng phần mềm không chứa lệnh sửa lỗi.
    #define HAVE_UCHAR nếu UCHAR đã được định nghĩa hoặc typedef’d các dữ liệu char không dấu.
    #define HAVE_ULONG nếu ULONG đã được định nghĩa hoặc typedef’d các dữ liệu long không dấu.
    #define IBUFLEN để định ra kích cỡ mong muốn của bộ đệm tập tin vào.
    #define OBUFLEN để định ra kích cỡ mong muốn của bộ đệm tập tin ra.
    #define FN_MAX để định ra số ký tự tối đa của tên tập tin.
    #define P_PKTLEN để chép đè lên kích thước tối đa của gói dữ liệu.
    #define P_WSLOTS để chép đè lên số chỗ tối đa trong cửa sổ.
  • Thay tập tin mẫu main.c bằng phần mềm điều khiển của riêng bạn. Dùng cùng tập tin header và quy ước gọi như trong mẫu.
  • Sao chép unixio.c đến xxxio.c (tự đặt tên theo ý bạn), tinh chỉnh lại tập tin để nó tương thích với nền tảng mới, và thay đổi lại quy trình cấu tạo để nó liên kết với module xxxio thay vì unixio. Lưu ý rằng bộ đệm dành cho tập tin vào và tập tin ra (i_buf[] and o_buf[]) phải được định dạng trong quy trình xxxio.

Dưới đây là một số mẹo khi bạn tạo một module nhập/xuất:

Thiết bị thực hiện nhập/xuất sẽ được giao vai trò tự đảm nhiệm các thông số liên lạc, bao gồm tốc độ dẫn truyền thông tin, tính chẵn-lẻ, và điều hành quy trình. Đặc biệt, Kermit sẽ không đảm nhiệm tính chẵn lẻ, nhưng vẫn phải biết về nó. Bạn có thể làm điều này trong bước cài đặt thông qua main(). Quy trình readpkt() nên loại bỏ tính chẵn lẻ và tx_data() nên loại thêm nó vào nếu cần. Trên nền mạng nối tiếp, có thể lập trình để UART đảm nhiệm việc này.

Thay đổi trong API giữa EK 1.1 và  1.2: Quy ước gọi tên (danh sách đối số trong hàm và giá trị cho ra) đã được thay đổi giữa hai phiên bản 1.1 và 1.2, chủ yếu để tất cả các quy trình đều tiếp cận được cấu trúc K một cách nhất quán, cũng như là để người gọi nhận được phản hồi tốt hơn. Trong trường hợp đã có thay đổi giữa các phiên bản, cả định dạng cũ lẫn mới sẽ được hiển thị.

Các hàm nhập/xuất của thiết bị bao gồm:

int

devopen(char * device)

Mở thiết bị giao tiếp đã chọn. Có thể cũng là chủ của mạng lưới. Trả kết quả 0 nếu thất bại, 1 nếu thành công.

int

devsettings(char * settings)

Lệnh này sẽ điều khiển các thông số kỹ thuật cần thiết của thiết bị, ví dụ như tốc độ và quy trình chạy của một thiết bị nối. Vì không có cách nào để biết chính xác các thông số liên quan là gì, quy trình này sẽ lấy một chuỗi ở bất kỳ định dạng nào, ví dụ “9600;8N1” hoặc “speed=57600;flow=rts/cts”; quy trình devsettings sẽ phân tích các thông số đó. Trả số 0 nếu thất bại, 1 nếu thành công.

int

devrestore(void)

Nếu muốn, trả thiết bị về nguyên dạng lúc devsettings() kích hoạt, ví dụ như trước lúc đóng nó.

int

devclose(void)

Đóng thiết bị liên lạc.

int

readpkt(UCHAR * buffer, struct k_data * k) (1.1)

readpkt(struct k_data * k, UCHAR * buffer, int length) (1.2)

Quy trình này phải làm đúng chính xác những gì quy trình mẫu làm: tìm khởi nguồn của gói dữ liệu, sau đó sao chép tất cả ký tự cho đến (nhưng không bao gồm) đuôi của gói vào bộ đệm dữ liệu, với địa chỉ đã cho trước. Bạn cần phải viết lệnh này càng hiệu quả càng tốt, và dùng bất kỳ mánh nào bạn biết như: đọc đệm không chặn, v.v. Nếu bạn muốn chương trình Kermit của bạn phải chờ đợi phản hồi, đây là chỗ để gắn dòng lệnh đó. LƯU Ý: Không cần thiết phải gián đoạn để chờ đợi phản hồi, vì khả năng đối tác Kermit của EK không thể chờ đợi phản hồi là 0%. Định dạng EK 1.2 đặt k làm đối số đầu để nhất quán với các quy trình khác, và định dạng này cũng đã thêm đối số cho kích thước bộ đệm.

Lưu ý cho tính năng F_CTRLC. Tính năng này mặc định sẽ được bật. Nó cho phép EK bức phá ra khỏi chế độ gói dữ liệu bằng cách gửi cho nó ba lệnh Ctrl-C liên tiếp vào dòng dữ liệu. Thông thường thì bạn không cần phải tắt tính năng này, vì dù người gửi đang “bỏ gán tiền tố” Ctrl-C, ba lệnh liên tục thường sẽ được gom thành một chuỗi đếm lặp.

int

tx_data(UCHAR * data, int length, short parity) (1.1)

tx_data(struct k_data * k, UCHAR * data, int length) (1.2)

Ở đây bạn lại phải giải quyết vấn đề chẵn lẻ (nếu nó chưa được giải quyết tự động bằng phương tiện liên lạc hoặc trình điều khiển thiết bị). Quy trình này cần phải hiệu quả và chắc chắn. Nó được dùng để truyền tải toàn bộ chuỗi dữ liệu, hoặc không sẽ thất bại. Tham khảo mẫu unixio.c để biết thêm chi tiết về độ chắc chắn. Ở EK phiên bản 1.2 trở về sau, tính chẵn lẻ được xác định từ cấu trúc k .

Các hàm nhập/xuất của tập tin bao gồm; dĩ nhiên là chúng có thể được dùng để đọc bất kỳ thức gì — không chỉ là tập tin: bộ nhớ, băng, các loại thẻ, tia laser, bộ điều khiển thiết bị, bất kỳ thứ gì. Bạn gọi những quy trình này là gì không quan trọng, nhưng danh sách đối số và loại kết quả trả lại phải đúng như mẫu; ngoài ra, nếu bạn đặt tên khác cho chúng, bạn cần phải đổi mẫu đầu tiên trong kermit.h:

int

openfile(UCHAR * filename, int mode, struct k_date * k) (1.1)

openfile(struct k_date * k, UCHAR * filename, int mode) (1.2)

Mở tập tin đã đặt tên trong chế độ đã định  (1 = đọc, 2 = chép, 3 = gọi tên). Trả lại kết quả X_OK khi thành công, X_ERROR khi thất bại.

ULONG

fileinfo(UCHAR * filename, UCHAR * buf, int buflen, short * type, short mode) (1.1)

fileinfo(struct k_data * k,UCHAR * filename,UCHAR * buf,int buflen,short * type,short mode) (1.2)

Lấy thông tin về một tập tin cục bộ cụ thể: kích cỡ, ngày tháng, và , nếu mode == 0, loại tập tin (chữ hoặc nhị phân). buf và buflen áp dụng cho chuỗi ngày/tháng của tập tin. Trả kết quả X_OK hoặc X_ERROR.

int

readfile(struct k_data *)

Đọc một phần đệm từ tập tin vào và, nếu quy trình chuyển giao đang ở chế độ chữ, chuyển định dạng ghi chép sang Kermit Stream CRLF tiêu chuẩn. Trả lại kết quả X_OK hoặc X_ERROR.

int

writefile(struct k_data *, CHAR * buffer, int length)

Viết một phần đệm cho tập tin ra, và nếu quy trình chuyển giao ở chế độ chữ, chuyển định dạng ghi chép tiêu chuẩn Kermit Stream CRLF sang định dạng yêu cầu cục bộ. Trả lại kết quả X_OK hoặc X_ERROR.

int

closefile(struct k_data *, UCHAR code, int mode)

Đóng tập tin. Với tập tin xuất, dĩ nhiên là lệnh này sẽ hủy bỏ mọi dữ liệu đệm còn chờ trong tập tin trước khi đóng; sau đó nó sẽ kiểm tra xem máy Kermit gửi có hủy chuyển giao tập tin trước khi nó hoàn thành không (mã == ‘D’). Trong trường hợp này nó sẽ xóa tập tin khuyết thay vì giữ nó. Phần chế độ sẽ xác định đây là tập tin nhận hay tập tin xuất, nên các tập tin khuyết có thể được xóa nếu muốn. Trả lại kết quả X_OK hoặc X_ERROR.

Quy ước gọi tên chính xác sẽ được hiển thị trong tập tin unixio.c.

SỬA LỖI

Nếu EK được thiết kế mà NODEBUG không được định dạng, thì bạn có thể thêm lựa chọn -d vào dòng lệnh điều khiển. Bản mẫu dựa trên hệ Unix của EK sẽ tạo tập tin debug.log tại thư mục hiện tại của nó. Trong phiên bản sản xuất, bạn có thể thêm dòng -DNODEBUG vào trình biên dịch C CFLAGS để hủy bỏ chế độ sửa lỗi. Các kích cỡ trên đã bao gồm chế độ sửa lỗi. Bạn có thể xây dựng chế độ sửa lỗi tùy theo  ý bạn muốn trong các module nhập/xuất phụ thuộc vào nền tảng.

LỊCH SỬ PHÁT HÀNH

Phiên bảnNgày thángMô tả
1.12002/10/07   Phiên bản phát hành đầu tiên. Phiên bả VxWorks vẫn ở mức độ này.
1.22003/01/28Phát triển API, bản thích ứng Java (vẫn ở mức độ này).
1.32004/03/04Sửa lỗi chuyển giao tập tin với HyperTerminal.
1.42004/03/20Sửa lỗi nhận tập tin rỗng.
1.52004/04/10Sửa lỗi với các gói dữ liệu A, cho phép các cấu hình siêu nhỏ hoặc/và chỉ-nhận.
1.512004/09/23Thích ứng với Philips XAG30 (John Dunlap)
EKSW 0.942010/06/24Cửa sổ trượt thực với chế độ truyền lại có chọn lọc (John Dunlap)
1.62011/03/30Phát hành dưới giấy phép 3-Clause Revised BSD License.
1.72011/06/06Giao thức FORCE-3, làm việc chung với C-Kermit 9.0 (giải thích ở đây)
1.82021/06/26Sửa lỗi với đối số -B và -T tại dòng điều khiển (chỉ trên bản dùng thử Unix)

TẢI VỀ

Có nhiều phiên bản ứng dụng E-Kermit khác nhau để bạn tải về. Bản thân E-Kermit phiên bản 1.8 là bản chính. Phiên bản 1.7 vẫn còn tải được. Những bản khác là phiên bản thích ứng cho các nền tảng hoặc ngôn ngữ khác trươc khi E-Kermit được phát hành, như đã đề cập ở các mục trước; nói cách khác, những bản vá lỗi trong E-Kermit 1.3, 1.4, and 1.5 sẽ không tòn tại trong bản VxWorks hoặc Java, và phiên bản VxWorks dùng API E-Kermit 1.1 thay vì API tốt hơn ở bản 1.2. EKSW có chỉnh sửa đôi chút API và một số điểm thiếu nhất quán mà bạn phải gỡ ra trước khi nó được tích hợp vào EK 1.6, nhưng nó hoàn toàn có thể chạy độc lập. Thật ra, đây là phiên bản chạy thế hệ mới của Apex-EM ocean floats và đã được kiểm định ở nhiều điều kiện bất lợi hơn có thể nói là bất kỳ phiên bản ứng dụng khác của giao thức Kermit. Phiên bản này đã hỗ trợ xây dựng nên phiên bản 1.7, với giao thức kiểm lỗi từng gói dữ liệu mới Force-3. (Trong tương lai, EKSW nên có thêm tính năng này.)

Original article: https://www.kermitproject.org/ek.html