Search code examples
initopenwrtinittab

How and when OpenWrt's procd runs init scripts in etc/init.d?


I'm looking at a static OpenWrt firmware. On OpenWrt initialization, procd is supposed to run all the S prefixed scripts in /etc/rc.d which are links to the actual scripts in /etc/init.d. I wonder who triggers those scripts...

I see that on /etc/inittab there's this line ::sysinit:/etc/init.d/rcS S boot but /etc/init.d/rcS file does not exist, so who actually runs the scripts on /etc/rc.d and when does it happen on init?

I tried searching all over their documentation but still could not figure this out... Any ideas?

Thanks.


Solution

  • You can check details in procd init

    procd actually ignores the process specification "/etc/init.d/rcS" (there is no such a script!) in "/etc/inittab".

    The implementation is in rcS.c:

    int rcS(char *pattern, char *param, void (*q_empty)(struct runqueue *))
    {
        runqueue_init(&q);
        q.empty_cb = q_empty;
        q.max_running_tasks = 1;
    
        return _rc(&q, "/etc/rc.d", pattern, "*", param);
    }
    

    which is called by "runrc" function in inittab.c

    static void runrc(struct init_action *a)
    {
        if (!a->argv[1] || !a->argv[2]) {
            ERROR("valid format is rcS <S|K> <param>\n");
            return;
        }
    
        /* proceed even if no init or shutdown scripts run */
        if (rcS(a->argv[1], a->argv[2], rcdone))
            rcdone(NULL);
    }