LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   how to Call my C code at start of kernel? (https://www.linuxquestions.org/questions/programming-9/how-to-call-my-c-code-at-start-of-kernel-322740/)

cranium2004 05-12-2005 09:54 AM

how to Call my C code at start of kernel?
 
hello,
Whenever a Linux machine started it loads all drivers. Then ups Network interfaces eth0,eth1... and then sends ARP packets on its Internal networks Right?
Now what i want is to load my C program executable as soon as network card ups but before it queries for ARP or try to send any packet? How to do that in RH9?
regards,
cranium.

Matir 05-12-2005 10:06 AM

You could just start your C program early on in the init phase.

frieza 05-12-2005 10:09 AM

you could also try making your program a kernel module.. but the init process would be easier, look in /etc/init.d/rc.d directory for all services available, and rc.x for each runlevel's services

Matir 05-12-2005 10:24 AM

The init process idea, by the way, assumes that you are not using any kernel-space IP Autoconfiguration.

cranium2004 05-12-2005 10:58 AM

Is there any palce on RH9 where i can put path to my program to be executed as soon as NIC Interfaces are up by kernel?
Or
I have to write a new service in rc3.d directory for that?

frieza 05-12-2005 11:56 AM

i would start at the /etc/init.d/rc.d/network shell script, perhaps you could modify that to run your program within the network service startup process, /etc/init.d/rcX.d contains links to the actual scripts

cranium2004 05-13-2005 01:36 AM

hello,
In /etc/rc.d/rc3.d/S10network I add my C program executable /home/cranium/test before following lines as shown

/home/cranium/test
# If this is a final shutdown/halt, check for network FS,
# and unmount them even if the user didn't turn on netfs

But the program is not executed? why? I am using RH9

Matir 05-13-2005 08:58 AM

Well, are the permissions set properly?

cranium2004 05-13-2005 12:05 PM

hello,
I copied my executable to /root/bin which is in shell path. Now i am able to run it from any directory oce i got console prompt.
But same is not called in /etc/rc.d/rc3.d/S10network when i place a statement in it
/root/bin/test
Is there anything required me to modify? Because after adding rebooting kernel my executable is not executed automatically ?

Matir 05-13-2005 08:17 PM

Is your system really booting in runlevel 3? Are other statements in the file being executed properly?

cranium2004 05-13-2005 11:33 PM

Ofcourse, ITs saying at bootup that enting in runlevel 3 and as i am getting stable console promt that mean i am bootin g in level3 so that no graphical problem to my linux installation. also i already set it in GRUB also to boot in level 3.
What else required to boot in level3?
Other statement in file S10networks are executing properly with no error message. Now what else i do to add my executable in boot up procedure?

Matir 05-13-2005 11:40 PM

That should be all you need. Please post the contents of S10networks.

cranium2004 05-13-2005 11:47 PM

hello,
I have did all things and its booting in level 3. Take a look at S10network that i modifies by adding my executable.
Code:


#! /bin/bash
#
# network      Bring up/down networking
#
# chkconfig: 2345 10 90
# description: Activates/Deactivates all network interfaces configured to \
#              start at boot time.
# probe: true
### BEGIN INIT INFO
# Provides: $network
### END INIT INFO

# Source function library.
. /etc/init.d/functions

if [ ! -f /etc/sysconfig/network ]; then
    exit 0
fi

. /etc/sysconfig/network

if [ -f /etc/sysconfig/pcmcia ]; then
        . /etc/sysconfig/pcmcia
fi


# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 0

# if the ip configuration utility isn't around we can't function.
[ -x /sbin/ip ] || exit 1

# Even if IPX is configured, without the utilities we can't do much
[ ! -x /sbin/ipx_internal_net -o ! -x /sbin/ipx_configure ] && IPX=

# Even if VLAN is configured, without the utility we can't do much
[ ! -x /sbin/vconfig ] && VLAN=

# If IPv6 is explicitly configured, make sure it's available.
if [ "$NETWORKING_IPV6" = "yes" ]; then
        alias=`modprobe -c | awk '/^alias net-pf-10 / { print $3 }'`
        if [ "$alias" != "ipv6" -a ! -f /proc/net/if_inet6 ]; then
                echo "alias net-pf-10 ipv6" >> /etc/modules.conf
        fi
fi

CWD=`pwd`
cd /etc/sysconfig/network-scripts

. network-functions

# find all the interfaces besides loopback.
# ignore aliases, alternative configurations, and editor backup files
interfaces=`ls ifcfg* | LANG=C egrep -v '(ifcfg-lo|:|rpmsave|rpmorig|rpmnew)' | \
            LANG=C egrep -v '(~|\.bak)$' | \
            LANG=C egrep 'ifcfg-[A-Za-z0-9\._-]+$' | \
            sed 's/^ifcfg-//g'`

# See how we were called.
case "$1" in
  start)
        # IPv6 hook (pre IPv4 start)
        if [ "$NETWORKING_IPV6" = "yes" ]; then
                if [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
                        /etc/sysconfig/network-scripts/init.ipv6-global start pre
                fi
        fi
 
          action $"Setting network parameters: " sysctl -e -p /etc/sysctl.conf

        # bring up loopback interface
        action $"Bringing up loopback interface: " ./ifup ifcfg-lo

        case "$IPX" in
          yes|true)
            /sbin/ipx_configure --auto_primary=$IPXAUTOPRIMARY \
                                  --auto_interface=$IPXAUTOFRAME
            if [ "$IPXINTERNALNETNUM" != "0" ]; then
              /sbin/ipx_internal_net add $IPXINTERNALNETNUM $IPXINTERNALNODENUM
            fi
            ;;
        esac

        case "$VLAN" in
          yes)
            if [ -d /proc/net/vlan ] || modprobe 8021q >/dev/null 2>&1 ; then
                action $"Setting 802.1Q VLAN parameters: " /sbin/vconfig set_name_type DEV_PLUS_VID_NO_PAD
            else
                echo $"No 802.1Q VLAN support available in kernel."
            fi
            ;;
        esac

        oldhotplug=`sysctl kernel.hotplug  2>/dev/null | \
            awk '{ print $3 }' 2>/dev/null`
        sysctl -w kernel.hotplug="/bin/true" > /dev/null 2>&1

        cipeinterfaces=""

        # bring up all other interfaces configured to come up at boot time
        for i in $interfaces; do
                eval $(LANG=C fgrep "DEVICE=" ifcfg-$i)
                if [ -z "$DEVICE" ] ; then DEVICE="$i"; fi

                if [ "${DEVICE##cipcb}" != "$DEVICE" ] ; then
                        cipeinterfaces="$cipeinterfaces $DEVICE"
                        continue
                fi
                if LANG=C egrep -L "^ONBOOT=['\"]?[Nn][Oo]['\"]?" ifcfg-$i > /dev/null ; then
                        # this loads the module, to preserve ordering
                        is_available $i
                        continue
                fi
                # If we're in confirmation mode, get user confirmation
                [ -n "$CONFIRM" ]  &&
                        {
                            confirm $i
                            case $? in
                                0)
                                    :
                                ;;
                                2)
                                    CONFIRM=
                                ;;
                                *)
                                    continue
                                ;;
                            esac
                }

                action $"Bringing up interface $i: " ./ifup $i boot
        done
       
        # Bring up CIPE VPN interfaces
        for i in $cipeinterfaces ; do
            if ! LANG=C egrep -L "^ONBOOT=['\"]?[Nn][Oo]['\"]?" ifcfg-$i >/dev/null 2>&1 ; then
                # If we're in confirmation mode, get user confirmation
                [ -n "$CONFIRM" ]  &&
                {
                        confirm $i
                        case $? in
                                0)
                                    :
                                ;;
                                2)
                                    CONFIRM=
                                ;;
                                *)
                                    continue
                                ;;
                        esac
                }
                action $"Bringing up interface $i: " ./ifup $i boot
            fi
        done

        sysctl -w kernel.hotplug=$oldhotplug > /dev/null 2>&1
       
        # Add non interface-specific static-routes.
        if [ -f /etc/sysconfig/static-routes ]; then
          grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do
              /sbin/route add -$args
          done
        fi   

        # IPv6 hook (post IPv4 start)
        if [ "$NETWORKING_IPV6" = "yes" ]; then
                if [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
                        /etc/sysconfig/network-scripts/init.ipv6-global start post
                fi
        fi
        # Run this again to catch any interface-specific actions
        sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1
 
        touch /var/lock/subsys/network
        ;;
  stop)
 
        /root/bin/test    ##################MY ADDITIONS####################
          # If this is a final shutdown/halt, check for network FS,
        # and unmount them even if the user didn't turn on netfs
       
        if [ "$RUNLEVEL" = "6" -o "$RUNLEVEL" = "0" -o "$RUNLEVEL" = "1" ]; then
                NFSMTAB=`LC_ALL=C awk '!/^#/ && $3 == "nfs" { print $2 }' /proc/mounts`
                SMBMTAB=`LC_ALL=C awk '!/^#/ && $3 == "smbfs" { print $2 }' /proc/mounts`
                NCPMTAB=`LC_ALL=C awk '!/^#/ && $3 == "ncpfs" { print $2 }' /proc/mounts`
                if [ -n "$NFSMTAB" -o -n "$SMBMTAB" -o -n "$NCPMTAB" ] ; then
                        /etc/init.d/netfs stop
                fi
        fi
       
        # IPv6 hook (pre IPv4 stop)
        if [ "$NETWORKING_IPV6" = "yes" ]; then
                if [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
                        /etc/sysconfig/network-scripts/init.ipv6-global stop pre
                fi
        fi
 
        # shut down all interfaces (other than loopback)
        for i in $interfaces ; do
                eval $(fgrep "DEVICE=" ifcfg-$i)
                if [ -z "$DEVICE" ] ; then DEVICE="$i"; fi

                if ! check_device_down $i; then
                  action $"Shutting down interface $i: " ./ifdown $i boot
                fi
        done
        case "$IPX" in
          yes|true)
            if [ "$IPXINTERNALNETNUM" != "0" ]; then
              /sbin/ipx_internal_net del
            fi
            ;;
        esac

        action $"Shutting down loopback interface: " ./ifdown ifcfg-lo

        if [ -d /proc/sys/net/ipv4 ]; then
          if [ -f /proc/sys/net/ipv4/ip_forward ]; then
                if [ `cat /proc/sys/net/ipv4/ip_forward` != 0 ]; then
                        action $"Disabling IPv4 packet forwarding: " sysctl -w net.ipv4.ip_forward=0
                fi
          fi
          if [ -f /proc/sys/net/ipv4/ip_always_defrag ]; then
                if [ `cat /proc/sys/net/ipv4/ip_always_defrag` != 0 ]; then
                        action $"Disabling IPv4 automatic defragmentation: " sysctl -w net.ipv4.ip_always_defrag=0
                fi
          fi
        fi

        # IPv6 hook (post IPv4 stop)
        if [ "$NETWORKING_IPV6" = "yes" ]; then
                if [ -x /etc/sysconfig/network-scripts/init.ipv6-global ]; then
                        /etc/sysconfig/network-scripts/init.ipv6-global stop post
                fi
        fi
       
        rm -f /var/lock/subsys/network
        ;;
  status)
        echo $"Configured devices:"
        echo lo $interfaces

        echo $"Currently active devices:"
        echo `/sbin/ip -o link show | awk -F ": " '/UP>/ { print $2 }'`
        ;;
  restart|reload)
        cd $CWD
        $0 stop
        $0 start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
esac

exit 0


btmiller 05-14-2005 12:37 AM

Your stuff appears to be under the stop) option in the case statement, so it will only be run when "service network stop" is run. You want your program to run when the network is started, not when it's stopped, so put it under the start) option of the case and that should do it.

cranium2004 05-14-2005 01:52 AM

Thanks all :)
 
Thanks btmiller and Matir and frieza for their assistence my problem is solved.
Thanks :)


All times are GMT -5. The time now is 08:29 AM.