My Little Daemon™

Middle, FreeBSDJanuary 2, 2008 2:37 pm

Quota merupakan fitur yang memungkinkan FreeBSD membatasi penggunaan ruang hard disk dan atau file oleh user dan atau group. Hal ini penting dilakukan terutama dalam sistem jaringan komputer yang menerapkan sharing file/direktori.

Langkah-langkahnya :

  1. Karena fitur quota bukan konfigurasi default kernel GENERIC, maka Anda perlu meng-compile ulang kernel Anda dengan opsi : options QUOTA

  2. Edit file /etc/fstab pada partisi yang akan diberlakukan sistem quota. Misalnya jika semula : /dev/ad6    /hd2  ufs  rw  1  1 ubah menjadi /dev/ad6    /hd2  ufs  rw,userquota,groupquota  1  1. Di sini sistem quota diberlakukan pada mounting / untuk user dan group.

  3. Membuat fitur quota dan check quota dijalankan ketika FreeBSD booting bisa dilakukan dengan mengedit file /etc/rc.conf dengan tambahan record : quota_enable="YES" dan check_quotas="YES" lalu reboot

  4. Begitu masuk setelah login, jalankan perintah berikut :

    # quotacheck -a lalu # quotaon -a

  5. Melakukan setting quota untuk user handaru :

    # edquota -u handaru

    maka Anda akan dihantarkan pada konfigurasi quota ke vi editor. Berikut adalah contoh setting quota untuk user handaru yang telah saya lakukan :

    Quotas for user handaru:
    /hd2: kbytes in use: 54, limits (soft = 50, hard = 75)
            inodes in use: 26, limits (soft = 50, hard = 60)

    dimana :

    pembatasan ruang hard disk bisa kita lakukan pada baris kedua :  /hd2: kbytes in use: 54, limits (soft = 50, hard = 75) dalam satuan kilobytes adapun limit soft mengandung pengertian bahwa sistem masih bisa menampung data melebihi soft limit ini asal tidak melebihi hard limit-nya hingga periode grace-nya. Defaultnya adalah 1 minggu. Jika over soft limit telah berlangsung seminggu, sistem akan secara otomatis menjadikan soft limit ini menjadi hard limit sehingga tidak akan ada toleransi lagi. Jika user menurunkan pemakaian disknya di bawah soft limit, maka periode grace-nya akan di-reset kembali. Pada contoh di atas, Anda bisa melihat bahwa sistem masih bisa mentolerir peggunaan disk space oleh user handaru (54 kb) yang melewati soft limitnya (50 kb). Sementara itu untuk hard limit, sistem tidak akan memberi kelonggaran over quota. Adapun pada baris ke tiga : inodes in use: 26, limits (soft = 50, hard = 60) kita bisa menentukan jumlah file maksimum yang bisa digunakan oleh user handaru ini. Di sini juga bisa diberlakukan soft maupun hard limit.

  6. Untuk memastikan sistem quota telah berjalan dengan baik, lakukan perintah berikut :

    $ quota -v
    Disk quotas for user handaru (uid 1001):
         Filesystem   usage   quota   limit   grace   files   quota   limit   grace
                /hd2      54*      50      75    7days    26      50      60

    tanda * pada 54* menandakan bahwa penggunaan disk telah melampau soft limitnya.

FreeBSD…mantap man !

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, FreeBSDDecember 27, 2007 5:23 am

Pretty Good Privacy [PGP] adalah sebuah fitur yang memungkinkan seseorang mengirim file/email yang ter-enskripsi dan pihak lain yang menerimanya melakukan dekripsi dengan kunci terpisah. PGP memanfaatkan public-key cryptography yang memang memisahkan antara kunci enskripsi dengan kunci deskripsinya. Jadi PGP adalah metoda enskripsi dua arah [dan bukan one way seperti MD5] namun sangat aman. Algoritma enkripsi yang didukung PGP antara lain : CAST, AES, 3DES, dan Twofish.

Instalasi PGP :

  • # cd /usr/ports/security/pgp
  • # make install clean

Mengkonfigurasi dan menggunakan PGP [misal antara user handaru dan user sakti yang hendak bertukar file secara aman] :

  • $ pwd
    /usr/home/handaru

  • $ mkdir .pgp

  • $ PGPPATH=/usr/home/handaru/.pgp; export PGPPATH

  • me-generate kunci enskripsi publik sekaligus bersesuaian dengan kunci deskripsinya :
    $ pgp -kg
    Pretty Good Privacy(tm) 2.6.3ia - Public-key encryption for the masses. (c) 1990-96 Philip Zimmermann, Phil’s Pretty Good Software. 1996-03-04 International version - not for use in the USA. Does not use RSAREF. Current time: 2007/12/27 04:03 GMT

    Pick your RSA key size:
         1) 512 bits- Low commercial grade, fast but less secure
         2) 768 bits- High commercial grade, medium speed, good security
         3) 1024 bits- "Military" grade, slow, highest security
    Choose 1, 2, or 3, or enter desired number of bits: 3

    Generating an RSA key with a 1024-bit modulus.

    You need a user ID for your public key. The desired form for this user ID is your name, followed by your E-mail address enclosed in , if you have an E-mail address. For example: John Q. Smith <12345.6789@compuserve.com> Enter a user ID for your public key:
    handaru <handaru@light19.com>

    You need a pass phrase to protect your RSA secret key. Your pass phrase can be any sentence or phrase and may have many words, spaces, punctuation, or any other printable characters.

    Enter pass phrase:,br>Enter same pass phrase again:
    Note that key generation is a lengthy process.

    We need to generate 582 random bits. This is done by measuring the time intervals between your keystrokes. Please enter some random text on your keyboard until you hear the beep:
         0 * -Enough, thank you.
    ….**** ………………………………………****
    Pass phrase is good. Just a moment….
    Key signature certificate added.
    Key generation completed.

  • Hasilnya Anda akan mendapatkan dua file PGP : secring.pgp dan pubring.pgp. PGP menggunakan key rings untuk menyimpan kunci-kuncinya. Secara default, private secret key ring handaru adalah secring.pgp dan public key ring handaru adalah pubring.pgp :

    $ cd .pgp
    $ ls
    pubring.bak     pubring.pgp     randseed.bin    secring.pgp

  • Kita bisa melihat suatu key ring dengan perintah :

    $ pgp -kv secring.pgp
    Pretty Good Privacy(tm) 2.6.3ia - Public-key encryption for the masses.
    (c) 1990-96 Philip Zimmermann, Phil’s Pretty Good Software. 1996-03-04
    International version - not for use in the USA. Does not use RSAREF.
    Current time: 2007/12/27 04:37 GMT

    Key ring: ’secring.pgp’
    Type Bits/KeyID    Date       User ID
    sec  1024/D2CD5C6D 2007/12/27 handaru <handaru@light19.com>
    1 matching key found.

  • Untuk memberikan public key kita ke seseorang, cukup kita salinkan public key ring [pubring.pgp] kita ke dia. 

  • Sebaliknya jika perlu mengakses public key ring orang lain, maka public key ring orang itu perlu kita masukkan dulu public key ring orang itu ke key ring kita. Misalkan public key ring orang itu adalah saktipubring.pgp [file hasil generate oleh sakti] maka cara memasukkannya ke key ring kita adalah :

    $ pgp -ka saktipubring.pgp
    Pretty Good Privacy(tm) 2.6.3ia - Public-key encryption for the masses.
    (c) 1990-96 Philip Zimmermann, Phil’s Pretty Good Software. 1996-03-04
    International version - not for use in the USA. Does not use RSAREF.
    Current time: 2007/12/27 04:58 GMT

    Looking for new keys…
    pub  1024/810B850D 2007/12/27  handarusakti <handarusakti@yahoo.com>

    Checking signatures…
    pub  1024/810B850D 2007/12/27 handarusakti <handarusakti@yahoo.com>
    sig!      810B850D 2007/12/27  handarusakti <handarusakti@yahoo.com>

    Keyfile contains:
       1 new key(s)

    One or more of the new keys are not fully certified.
    Do you want to certify any of these keys yourself (y/N)? y

    Key for user ID: handarusakti <handarusakti@yahoo.com>
    1024-bit key, key ID 810B850D, created 2007/12/27
    Key fingerprint = 0A 41 21 C7 4B BD E7 5B  01 9E 06 80 FB 72 A3 77
    This key/userID association is not certified.
      Questionable certification from:
      handarusakti <handarusakti@yahoo.com>

    Do you want to certify this key yourself (y/N)? y

    Looking for key for user ‘handarusakti <handarusakti@yahoo.com>’:

    Key for user ID: handarusakti <handarusakti@yahoo.com>
    1024-bit key, key ID 810B850D, created 2007/12/27
                Key fingerprint = 0A 41 21 C7 4B BD E7 5B  01 9E 06 80 FB 72 A3 77

    READ CAREFULLY:  Based on your own direct first-hand knowledge, are
    you absolutely certain that you are prepared to solemnly certify that
    the above public key actually belongs to the user specified by the
    above user ID (y/N)? y

    You need a pass phrase to unlock your RSA secret key.
    Key for user ID: handaru <handaru@light19.com>
    1024-bit key, key ID D2CD5C6D, created 2007/12/27

    Enter pass phrase: Pass phrase is good.  Just a moment….
    Key signature certificate added.

    Make a determination in your own mind whether this key actually
    belongs to the person whom you think it belongs to, based on available
    evidence.  If you think it does, then based on your estimate of
    that person’s integrity and competence in key management, answer
    the following question:

    Would you trust "handarusakti <handarusakti@yahoo.com>"
    to act as an introducer and certify other people’s public keys to you?
    (1=I don’t know. 2=No. 3=Usually. 4=Yes, always.) ? 4

  • Selanjutnya kita akan menggunakan PGP untuk mengenkripsi sebuah file. Misalnya handaru ingin mengirim file dariku.txt kepada sakti namun file tersebut ingin di-enskripsi terlebih dahulu dengan public key ring PGP milik sakti. Maka handaru bisa melakukan langkah berikut :

    $ pgp -e dariku.txt sakti
    Pretty Good Privacy(tm) 2.6.3ia - Public-key encryption for the masses.
    (c) 1990-96 Philip Zimmermann, Phil’s Pretty Good Software. 1996-03-04
    International version - not for use in the USA. Does not use RSAREF.
    Current time: 2007/12/27 05:05 GMT

    Recipients’ public key(s) will be used to encrypt.
    Key for user ID: handarusakti <handarusakti@yahoo.com>
    1024-bit key, key ID 810B850D, created 2007/12/27
    .
    Ciphertext file: dariku.txt.pgp

  • Maka akan menghasilkan file dariku.txt.pgp :

    $ ls |grep dariku
    dariku.txt
    dariku.txt.pgp

    File dariku.txt.pgp inilah yang bisa dikirim oleh handaru ke sakti.

  • Setelah file dariku.txt.pgp tadi diterima oleh sakti dan jika sakti ingin membuka file di atas, sakti bisa melakukannya dengan perintah :

    $ pgp dariku.txt.pgp
    Pretty Good Privacy(tm) 2.6.3ia - Public-key encryption for the masses.
    (c) 1990-96 Philip Zimmermann, Phil’s Pretty Good Software. 1996-03-04
    International version - not for use in the USA. Does not use RSAREF.
    Current time: 2007/12/27 05:29 GMT

    File is encrypted.  Secret key is required to read it.
    Key for user ID: handarusakti <handarusakti@yahoo.com>
    1024-bit key, key ID 810B850D, created 2007/12/27

    You need a pass phrase to unlock your RSA secret key.
    Enter pass phrase: Pass phrase is good.  Just a moment……
    Plaintext filename: dariku.txt
    $ ls |grep dariku
    dariku.txt
    dariku.txt.pgp

    Di sini, sakti menggunakan secring.pgp miliknya untuk medekripsikan file kiriman handaru yang telah mengenkripsi file yang dikirimnya dengan public key milik sakti. Makanya pada pengantar di atas, dikatakan bahwa PGP mempunyai key enskripsi dan dekripsi yang terpisah.

  • File hasil proses enskripsi PGP di atas : dariku.txt.pgp berbentuk file binary, jika ingin membuat file yang terenskripsi PGP namun dalam bentuk ASCII, sewaktu melakukan enskripsi gunakan opsi perintah -a :

    $ pgp -ea dariku.txt sakti
    Pretty Good Privacy(tm) 2.6.3ia - Public-key encryption for the masses.
    (c) 1990-96 Philip Zimmermann, Phil’s Pretty Good Software. 1996-03-04
    International version - not for use in the USA. Does not use RSAREF.
    Current time: 2007/12/27 05:56 GMT

    Recipients’ public key(s) will be used to encrypt.
    Key for user ID: handarusakti <handarusakti@yahoo.com>
    1024-bit key, key ID 810B850D, created 2007/12/27
    .
    Transport armor file: dariku.txt.asc

FreeBSD…AMAN TERKENDALI.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, FreeBSDDecember 26, 2007 8:05 am

Dengan event auditing, memungkinkan kita untuk meningkatkan sistem ke keamanan FreeBSD kita dengan keleluasaan untuk mengkonfigurasi logging atas sistem login, perubahan konfigurasi, manipulasi file dan akses jaringan. Event auditing bersifat live system monitoring, intrusion detection, dan post-mortem analysis. Fitur ini disediakan oleh FreeBSD 6.2 ke atas.

Instalasi event auditing :

  • Karena kita menggunakan FreeBSD 6.2, kita perlu meng-compile ulang kernal dengan penambahan baris : options    AUDIT, kalau FreeBSD 7 kernelnya sudah otomatis support event auditing

  • Edit file /etc/rc.conf dengan  lalu menambahkan baris : /usr/sbin/auditd untuk mengotomatiskan running-nya daemon auditd setiap booting ulang

  • Kofigurasi file-file yang berhubungan dengan event auditing seharusnya berada di direktori /var/security/. Karena itu, salin semua file di direktori /var/tmp/temproot/etc/security/ ke /var/security/. Kita bisa membiarkan konfigurasi defaultnya atau jika kita ingin  bereksperimen dengan opsi-opsi yang ada, ada baiknya kita membaca tutorial yang ada di sini : http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit-config.html

  • Untuk menampilkan log atau catatan hasil audit, kita bisa menggunakan  perintah  praudit. Defaultnya event auditing menyimpan log-nya di direktori /var/audit [sesuai dengan konfigurasi di file /var/tmp/temproot/etc/security/audit_control]. Contohnya :

    # praudit /var/audit/20071226075748.20071226075817
    header,93,10,audit startup,0,Wed Dec 26 14:57:48 2007, + 60 msec
    subject,root,root,wheel,root,wheel,544,544,0,0.0.0.0
    text,auditd::Audit startup
    return,success,0
    trailer,93

  • Live auditing :

    # praudit /dev/auditpipe0
    header,97,10,su(1),0,Wed Dec 26 15:00:54 2007, + 608 msec
    subject,sakti,root,sakti,sakti,sakti,578,578,2445,192.168.1.2
    text,successful authentication
    return,success,0
    trailer,97

FreeBSD…KOKOH TAK TERTANDINGI.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, FreeBSDDecember 25, 2007 5:43 am

Telah banyak tutorial tentang Samba, sebuah fitur untuk file sharing antara mesin UNIX dan Windows. Aneka tutorial tersebut biasanya memberikan penjelasan yang panjang lebar dengan uraian yang lengkap atas opsi-opsi konfigurasi Samba yang bisa dilakukan.

Pada kesempatan ini, saya hanya membutuhkan Samba untuk file sharing home direktori dari user-user UNIX agar bisa diakses secara penuh [write dan browse] melalui client Samba berbasis Windows dan satu direktori yang bisa diakses bersama namun hanya bisa di-browse dan dibaca/dieksekusi.  

Singkat cerita, apa yang perlu kita lakukan ?

  • Instal Samba :

    # cd /usr/ports/net/samba3
    # make install clean

  • Copy file configurasi Samba :

    #cp /usr/local/etc/smb.conf.default /usr/local/etc/smb.conf

  • Edit file /usr/local/etc/smb.conf dengan opsi terpenting yang perlu dirubah :

    [global]
    workgroup = LIGHT # adalah nama workgroup yang tampil di Microsoft Windows Network
    server string = Samba Server Komkecil # adalah nama komputer yang tampil

    # Biarkan kofigurasi default untuk sharing direktori [home] :
    [homes]
    comment = Home Directories

    browseable = no
    writable = yes

    [umum]
    comment = Direktori untuk umum
    path = /umum
    # Mengarahkan direktori untuk umum
    public = yes
    browseable = yes
    writeable = no

  • Membuat direktori untuk umum :

    # mkdir /umum

    di sini tidak diperlukan chmod karena default pembuatan direktori adalah drwxr-xr-x, sesuai dengan maksud kita yaitu hanya bisa dibaca dan dieksekusi untuk umum

  • Bikin user Samba yang usernamenya sama dengan user UNIX [baca FreeBSD], misalnya handaru :

    # smbpasswd -a handaru

  • Agar sewaktu reboot sistem otomatis menjalankan layanan Samba, tambahkan baris berikut di file /etc/rc.conf :

    samba_enable="YES"

  • Restart FreeBSD :

    # reboot

Maka jika Anda browse dari komputer berbasis Windows di Winows Explorer setelah login dengan username handaru dan password yang dibuat sewaktu menjalankan perintah smbpasswd di atas, hasilnya akan nampak seperti berikut ini :

 

FreeBSD…just connected, not alone.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

 

Middle, FreeBSDDecember 22, 2007 5:14 am

Ada kalanya kita perlu mengizinkan seseorang untuk login ke sistem FreeBSD kita hanya untuk sekali waktu. Ini diperlukan misalnya bagi karyawan dari divisi lain yang sedang ada keperluan ke divisi kita secara temporer dan insidental. Sebenarnya bisa saja kita membuatkan user khusus untuknya. Namun karena dia hanya membutuhkan sekali login dan setelahnya tidak diperlukan lagi, maka kita harus menghapus user login tersebut setelah dia tak membutuhkannya lagi. Meninggalkan user ’sampah’ bukanlah sebuah langkah yang bijak dari sisi sebagai seorang sysadmin. Begitu pula dengan tindakan mengizinkan hak akses ke user yang telah ada sebelumnya kepadanya dengan memberikan password user tersebut. Karena untuk tindakan ini, Anda perlu melakukan reset password setelah dia selesai dengan semua pekerjaannya dengan user tersebut. Itu pun jika dia tidak lupa memberitahukan bahwa dia telah selesai dan Anda cukup perhatian serta ada waktu untuk melakukan passwd atas password user tersebut.

Adalah tindakan yang baik bila kita memberikan hak akses ke tamu kita tersebut berupa user login yang sesuai dengan wewenangnya dari daftar user yang telah ada dan bersamaan dengan itu kita berikan password ’sekali pakai’ padanya. Untuk keperluan ini, Anda bisa menggunakan OPIE (One-time Passwords In Everything) yang defaultnya menggunakan hash MD5. OPIE secara default telah di-support oleh FreeBSD, jadi Anda tidak perlu melakukan compile ulang kernel atau menambahkan load module baru bahkan tanpa perlu meng-install paket tambahan apa pun.   

Langkah-langkahnya :

  1. Login secara langsung ke console mesin FreeBSD atau gunakan secure connection misalnya via SSH.

  2. Inisialisasi OPIE : $ opiepasswd -c

  3. Masukkan new secret pass phrase, ini bukanlah password yang nantinya bisa digunakan oleh tamu kita untuk login, melainkan frasa password yang kita gunakan untuk men-generate OPIE password untuk tamu kita tersebut.

  4. Sekarang si tamu bisa dipersilahkan login dari remote, bahkan bisa dari insecure connection seperti via TELNET, XTERM atau DIAL-IN. 

  5. Dari secure connection lakukan perintah berikut :

    $ opiekey 497 ko0807
    Using the MD5 algorithm to compute response.
    Reminder: Don’t use opiekey from telnet or dial-in sessions.
    Enter secret pass phrase:
    SUCH HAD GEAR SLIM TAKE WEAN

    OPIE password : SUCH HAD GEAR SLIM TAKE WEAN inilah yang bisa digunakan oleh si tamu untuk login sekali pakai.

    Karena OPIE passwor ini cukup panjang, user tamu tersebut bisa menggunakan moe echo-on agar pengisian passwordnya bisa terlihat :

     

  6. Jika suatu saat terjadi sesi login dengan seed opt-MD5 sama atau kurang dari 5 karakter, maka Anda tidak bisa men-generate OPIE passwordinya via perintah opiekey, karena jika dipaksakan akan muncul pesan peringatan, seperti pada kasus berikut ini :

    opiekey 499 ko17
    Using the MD5 algorithm to compute response.
    Seeds must be greater than 5 characters long.

    Solusinya Anda login sebagai root atau superuser, lalu hapus entri username tamu di file /etc/opiekeys, lalu Anda perlu mengulang proses mulai nomor 1 hingga nomor 5 di atas.

  7. Anda bisa membatasi pemberlakuan OPIE password ini hanya dari host yang Anda ijinkan melalui pengaturan di file /etc/opieaccess, berikut adalah contohnya :

    permit 192.168.1.0 255.255.25.0

FreeBSD…begitu aman, begitu terpercaya.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C ProgrammingAugust 29, 2007 4:49 am

Sebelum suatu file dapat diakses, maka terlebih dahulu ia harus dibuka. Dalam bahasa C, kita bisa menggunakan fungsi fopen() dari pustaka fungsi standarnya. Fungsi fopen() mengambil nama fie eksternal melalui tingkatan sistem operasi, dan buka low-level accsess seperti fungsi open() yang telah kita bahas sebelumnya, kemudian dijadikan sebagai nama internal yang mana harus dipakai untuk akses file secara berurut. 

Sebenarnya nama internal adalah suatu pointer file. Karena fungsi fopen() maupun definisi FILE telah disediakan oleh <stdio.h>, maka seorang programmer cukup mendeklarasikan pointer file sebagai berikut :

FILE *fopen(), *fp;

Pernyataan di atas menyatakan bahwa fp adalah suatu pointer pada suatu FILE, dan fopen() mengembalikan pointer pada FILE. Adapun bentuk umum fungsi fopen yang sebenarnya adalah sebagai berikut :

fp = fopen(nama, mode);

nama disini artinya nama dari file yang akan diakses, sedangkan mode adalah suatu karakter yang menyatakan bagaimana file tersebut akan diakses. Karakter-karakter tersebut meliputi :

  • “r” untuk baca
  • “w” untuk tulis/rekam
  • “a” untuk menambah

Jika file yang dibuka tidak ada, maka akan menyebabkan suatu kesalahan. Fungsi fopen() akan memberikan nilai kosong (NULL) kepada pointer, yang mana telag didefiniskan dalam <stdio.h>. Setelah suatu file dibuka, maka ada dua kemungkinan akses, yaitu : fgetc() atau fputc(). Walaupun kita bisa pula menggunakan fungsi putc() ataupun getc() yang merupakan implementasi lain dari fputc() dan fgetc() dengan menggunakan makro. 

Misalnya,

x = fgetc(fp);

akan meletakkan karakter berikutnya dari file yang direferensikan oleh fp kepada variabel x. Nilai balikan dari fungsi fgetc() adalah nilai tertulis atau EOF jika terjadi kesalahan. Fungsi fputc() adalah kebalikannya :

fputc(x,fp);

akan memasukkan karakter dari variabel x pada pointer file fp. Baiklah, contoh berikut adalah implemantasinya yang merupakan modifikasi dari program penyalin file yang pernah kita buat :

File cpstandar.c

#include <stdio.h>

main()
{
   int c;
   FILE *in, *out;

   in = fopen(”file.in”, “r”);
   out = fopen(”file.out”, “w”);

   while ((c = fgetc(in)) != EOF)
          fputc(c, out);
}

Jika, seperti sebelumnya, dijalankan dengan tambahan perintah time, maka akan tampak seperti berikut :

$ time ./cpstandar
0.624u 0.079s 0:03.02 22.8%     5+185k 0+168io 0pf+0w
$

Nampak terlihat perbaikan performa (file yang disalin tetap sama) yaitu waktu yang dibutuhkan untuk proses penyalinan file menjadi lebih cepat lagi (3,02 detik) dan penggunaan waktu CPU secara virtual tinggal 22,8 %. Hal ini disebabkan karena <stdio.h> memelihara buffer internal dalam struktur FILE sedangkan pemanggil sistem low-level hanya dibuat jika buffer terisi.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming 4:46 am

Untuk mengetahui waktu yang dibutuhkan dalam penyalinan suatu file, kita bisa menambahkan perintah time di depan perintah penyalinan file (./cpsistem) :

 

%ls -ls file.in
21120 -rw-r–r– 1 handaru handaru 21598389 Mar 26 09:09 file.in
%time ./cpsistem
8.417u 93.103s 1:41.88 99.6%    5+169k 0+168io 0pf+0w
%

Pada contoh ini kita bisa melihat bahwa untuk menyalin file.in yang besarnya 21,12 Mb menjadi file.out dengan menggunakan program cpsistem membutuhkan waktu 1 menit lebih 41,88 detik dan konsumsi waktu CPU secara virtual sebesar 99,6 %

Baiklah, sekarang dengan sedikit modifikasi kita buat :

File cpblock.c

#include <unistd.h>
#include <sys/file.h>
#include <sys/stat.h>

main()
{
  char block[1024];
  int in, out, nread;

  in = open(”file.in”, O_RDONLY);
  out = open(”file.out”, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
  while((nread = read(in, block, sizeof(block))) > 0)
        write(out, block, nread);
}

Setelah di-compile lalu dieksekusi dengan tambahan perintah time, hasilnya :

%time ./cpblock
0.020u 0.146s 0:03.06 5.2%      6+198k 0+168io 0pf+0w
%

Terjadi perbaikan dalam : waktu yang dibutuhkan menjadi hanya 3,06 detik dan konsumsi waktu CPU secara virtual hanya 5,2 %. Hal ini dimungkinkan karena pada cotoh kedua kita melakukan penyalinan file per 1 kilo (1024) block.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming 3:31 am

Setelah kita mengetahui perihal pemanggil sistem open(), read() dan write(), maka salah satu penerapannya bisa kita gunakan untuk membuat sebuah program aplikasi untuk menyalin file.

 

File cpsistem.c

#include <unistd.h>
#include <sys/file.h>
#include <sys/stat.h>
main()
{
   char c;
   int in, out;

   in = open(”file.in”, O_RDONLY);
   out = open(”file.out”, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
   while (read(in, &c, 1) == 1)
          write(out, &c, 1);
}

Pada program di atas, jika kita mempunyai sebuah file dengan nama file.in pada direktori kerja, maka akan dilakukan proses penyalinannya menjadi file.out dengan urutan langkah sebagai berikut :

  1. Membuka file.in dengan hak akses read only (O_RDONLY).
  2. Membuat file.out dengan hak akses write only (WRONLY) dan opsi membuatnya (O_CREAT) berupa file dengan initial permissions read (S_IRUSR) dan write (S_IWUSR).
  3. Melakukan proses penyalinan dengan memanfaatkan pemanggil sistem read() dan write()

Untuk keperluan ini kita akan mengkopikan file fear_factor.txt menjadi file.in selanjutnya yang akan kita salain dengan program di atas menjadi file.out :

$ ls -l fear_factor.txt
-rw-r–r–  1 handaru  handaru  2413 Sep  4 20:06 fear_factor.txt
$ cp fear_factor.txt file.in
$ ls -l fear_factor.txt file.in
-rw-r–r–  1 handaru  handaru  2413 Sep  4 20:06 fear_factor.txt
-rw-r–r–  1 handaru  handaru  2413 Sep  4 20:07 file.in
$ ./cpsistem
$ ls -l fear_factor.txt file.in file.out
-rw-r–r–  1 handaru  handaru  2413 Sep  4 20:06 fear_factor.txt
-rw-r–r–  1 handaru  handaru  2413 Sep  4 20:07 file.in
-rw——-  1 handaru  handaru  2413 Sep  4 20:08 file.out
$

Silahkan cek isi dari file.out, pasti sama denga fear_factor.txt. Sampai di sini kita bisa membuat program sendiri untuk penyalinan file dengan low-level file access.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming 1:29 am

Kita bisa menggunakan pemanggil sistem close() untuk menghentikan asosoasi antara file descriptor, fildes, dengan file yang diasosiasikannya. Dengan demikian file descriptor bisa digunakan kembali untuk keperluan yang lain. Nilai keluaran dari pemanggil sistem ini adalah 0 jika berhasil dan -1 jika terjadi error.

Bentuk umumnya :

int close(int_fildes);

Total file yang dapat berjalan/dibuka dalam suatu program bersamaan tergantung pada konstanta OPEN_MAX dalam <limits.h> pada Linux. Pada sistem berbasis POSIX termasuk Linux, nilainya adalah 16. Untuk sistem BSD konstantanya adalah SIZE_T_MAX dalam <sys/limits.h> yang nilainya sama dengan unsigned int, artinya bisa sampai 65535, wow ! Jadi kalau menggunakan BSD, rasanya tidaklah penting menggunakan fungsi ini kecuali kita membutuhkan file descriptor lebih dari 65535 buah. Viva BSD !

Untuk memperjelas, bandingkanlah dua file ini :

File tanpaclose.c

#include <sys/file.h>
#include <sys/stat.h>
#include <stdio.h>
main()
{
   int fildes;

   fildes = open(”file_duwek_ku1″, O_CREAT, S_IRUSR | S_IWUSR |
                       S_IXUSR | S_IXGRP | S_IXOTH);
   printf(”Nilai file descriptor  = %d\n”, fildes);
   fildes = open(”file_duwek_ku2″, O_CREAT, S_IRUSR | S_IWUSR |
                       S_IXUSR | S_IXGRP | S_IXOTH);
   printf(”Nilai file descriptor  = %d\n”, fildes);
}

$ gcc -o tanpaclose tanpaclose.c
$ ./tanpaclose
Nilai file descriptor  = 3
Nilai file descriptor  = 4
$

dengan file yang menggunakan pemanggil sistem close() berikut :

File denganclose.c

#include <sys/file.h>
#include <sys/stat.h>
#include <stdio.h>
main()
{
   int fildes;

   fildes = open(”file_duwek_ku3″, O_CREAT, S_IRUSR | S_IWUSR |
                      S_IXUSR | S_IXGRP | S_IXOTH);
   printf(”Nilai file descriptor  = %d\n”, fildes);
   close(fildes);
   fildes = open(”file_duwek_ku4″, O_CREAT, S_IRUSR | S_IWUSR |
                      S_IXUSR | S_IXGRP | S_IXOTH);
   printf(”Nilai file descriptor  = %d\n”, fildes);
}

$ gcc -o denganclose denganclose.c
$ ./denganclose
Nilai file descriptor  = 3
Nilai file descriptor  = 3
$

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa

Middle, C Programming 1:27 am

Ketika kita membuat sebuah file dengan menggunakan flag O_CREAT, maka kita harus menentukan parameter mode_t_mode yang merepresentasikan hak akses dari user, group serta others atas file yang kita buat tersebut. Parameter-parameter ini bisa dikolaborasikan dengan operator bitwise or (|). Flag parameter-parameter ini terletak di <sys/stat.h>.

Baiklah, inilah mereka : 

  • S_IRUSR permisi read untuk owner.
  • S_IWUSR permisi write untuk owner.
  • S_IXUSR permisi execute untuk owner. 
  • S_IRGRP permisi read untuk group.
  • S_IWGRP permisi write untuk group.
  • S_IXGRP permisi execute untuk group. 
  • S_IROTH permisi read untuk others.
  • S_IWOTH permisi write untuk others.
  • S_IXOTH permisi execute untuk others. 

Adapun contoh aplikasinya :

File iniperm.c

#include <sys/file.h>
#include <sys/stat.h>

main()
{
   open(”fileku”, O_CREAT, S_IRUSR | S_IWUSR | S_IXUSR | S_IXGRP | S_IXOTH);
}

$ gcc -o iniperm iniperm.c
$ ./iniperm
$ ls -l fileku
-rwx–x–x  1 handaru  handaru  0 Sep  3 13:32 fileku
$

Contoh di atas adalah sebuah program yang dapat membuat sebuah file fileku dengan menggunakan pemanggil sistem open() yang memanfaatkan flag O_CREAT. File yang dihasilkan memiliki hak akses rwx–x–x, artinya read, write, dan execute untuk user, execute untuk group dan others.

Dedicated for Light Intermutimedia
Perusahaan Software Pulsa