Multicall Binary

Jika anda pernah menggunakan busybox, pasti anda paham apa itu multicall binary. Busybox adalah contoh dari multicall binary, mencakup hampir semua perintah dasar shell. Definisi kasarnya adalah sebuah binary yang dapat dipanggil dengan berbagai nama. Hal ini dapat dilakukan dengan memanipulasi argv[0] yang mana menunjuk pada program name. Misalkan:

int main(int argc, char **argv)
{
        printf("nama program: %s\n", argv[0]);
        return 0;
}

Kemudian kita panggil binary dari kode di atas:

./a.out
nama program: ./a.out

Sama halnya dengan:

ln -s a.out app
./app
nama program: ./app

Saya mencoba untuk membuat sebuah multicall binary sederhana dengan konsep di atas, yaitu dengan memanipulasi argv[0]. Setiap kali ditemukan argv[0] yang sesuai maka fungsi bersangkutan akan dipanggil. Untuk melakukannya kita gunakan array yang berisi pointer to function yang nantinya dipanggil menyesuaikan dengan isi argv[0].

/* Applet struct */
struct applet {
        int id;
        char *name;
        void (*app) (void);
};
/* Array of pointer to function */
static void (*applet_callback[]) (void) = { applet0, applet1, applet2 };

/* Array of applet name */
const char *applets[] = { "applet0", "applet1", "applet2" };

Tinggal kita terapkan apakah isi argv[0] sama dengan salah satu dari isi array applets[], dapatkan indexnya untuk mengisi applet->app dengan applet_callback[index]. Jangan lupa implementasikan masing2 fungsi dalam applet_callback[].

if (strcmp(applets[asize], foo->name) == 0) {
       appid = asize;
       foo->app = applet_callback[asize];
       return appid;
}

Tinggal tambahkan perintah untuk menjalankan:

       foo->app();

Untuk mengetesnya:

gcc applet.c -o applet
ln -s applet applet0
ln -s applet applet1
ln -s applet applet2
./applet2
calling: ./applet2
get applet2 at 2
Applet2 is running!

Kode tersedia di:
HTTP: https://github.com/ruckuus/multi
Git: git://github.com/ruckuus/multi.git

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s