;================================================================================= ; System V IPC using Message Queues ; ; Creates new or retrieves an available message queue ID using unique key ; 0x3245432. Then depending on the command-line argument either sends a new ; message, receives a message, or destroys the queue. ; ; e.g. ; $ ./sysv_msg -s 1234 Hello ; Sending a message ... ; $ ./sysv_msg -r ; Receiving a message ... ; Type: 1234 Message: Hello ; $ ./sysv_msg -d ; ; ; The LSCR Project. ;================================================================================= format ELF include '../macros.inc' include '../../include/symbols.inc' include '../../include/structs.inc' extrn error_chk section '.text' executable public _start _start: pop eax cmp eax, 2 jb usage mov [argc], eax mov eax, SYS_IPC mov ebx, MSGGET mov ecx, 0x3245432 ; we need an unique key. let's hope this one is. mov edx, IPC_CREAT or S_IRUSR or S_IWUSR int 0x80 ccall error_chk, <"MSGGET has failed: ">, exit mov [msgqueue_id], eax pop eax pop eax cmp [eax], word "-s" ; send message je send_message cmp [eax], word "-r" ; receive message je receive_message cmp [eax], word "-d" ; delete queue je delete_queue usage: mov eax, SYS_WRITE ; print usage info mov ebx, STDOUT mov ecx, usage_s mov edx, usage_s_sz int 0x80 exit: mov eax, SYS_EXIT xor ebx, ebx int 0x80 send_message:;--------------------------------------------------; cmp [argc], 4 jb usage mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, sending_s mov edx, sending_s_sz int 0x80 pop eax ; save message type mov eax, [eax] mov [_msgbuf], eax pop esi ; copy the message data mov edi, _msgbuf+4 xor edx, edx @@: inc edx lodsb stosb test al, al jne @b mov eax, SYS_IPC ; send message mov ebx, MSGSND mov ecx, [msgqueue_id] xor esi, esi mov edi, _msgbuf int 0x80 ccall error_chk, <"MSGSND has failed: ">, exit jmp exit receive_message:;-----------------------------------------------; mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, receiving_s mov edx, receiving_s_sz int 0x80 mov [_ipc_kludge.msgp], _msgbuf mov eax, SYS_IPC ; receive any message on the given queue ID mov ebx, MSGRCV mov ecx, [msgqueue_id] mov edx, MSGMAX xor esi, esi mov edi, _ipc_kludge xor ebp, ebp int 0x80 ccall error_chk, <"MSGRCV has failed: ">, exit mov eax, SYS_WRITE ; print message type mov ebx, STDOUT mov ecx, msg_type_s mov edx, msg_type_s_sz int 0x80 mov edi, _msgbuf ; calculate type's size xor eax, eax xor edx, edx @@: inc edx scasb jne @b cmp edx, 4 jbe @f mov edx, 4 @@: mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, _msgbuf int 0x80 mov eax, SYS_WRITE ; print message data mov ebx, STDOUT mov ecx, msg_data_s mov edx, msg_data_s_sz int 0x80 mov edi, _msgbuf+4 ; calculate message data size xor eax, eax xor edx, edx @@: inc edx scasb jne @b mov [edi-1], byte 0xa mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, _msgbuf+4 int 0x80 jmp exit delete_queue:;--------------------------------------------------; mov eax, SYS_IPC ; delete message queue mov ebx, MSGCTL mov ecx, [msgqueue_id] mov edx, IPC_RMID xor esi, esi int 0x80 ccall error_chk, <"MSGCTL has failed: ">, exit jmp exit section '.data' writeable usage_s db "USAGE:",0xa db " ./sysv_msg -s send a message of the given type",0xa db " ./sysv_msg -r receive any available message",0xa db " ./sysv_msg -d destroy the message queue",0xa usage_s_sz = $-usage_s sending_s db "Sending a message ...",0xa sending_s_sz = $-sending_s receiving_s db "Receiving a message ...",0xa receiving_s_sz = $-receiving_s msg_type_s db "Type: " msg_type_s_sz = $-msg_type_s msg_data_s db " Message: " msg_data_s_sz = $-msg_data_s argc rd 1 msgqueue_id rd 1 struc mymsgbuf { .mtype rd 1 .mtext rb MSGMAX } _ipc_kludge ipc_kludge _msgbuf mymsgbuf