LinuxQuestions.org
Download your favorite Linux distribution at LQ ISO.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 05-12-2005, 09:54 AM   #1
cranium2004
Member
 
Registered: Feb 2004
Distribution: FC4,RHEL4
Posts: 223

Rep: Reputation: 30
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.
 
Old 05-12-2005, 10:06 AM   #2
Matir
LQ Guru
 
Registered: Nov 2004
Location: San Jose, CA
Distribution: Debian, Arch
Posts: 8,507

Rep: Reputation: 128Reputation: 128
You could just start your C program early on in the init phase.
 
Old 05-12-2005, 10:09 AM   #3
frieza
Senior Member
 
Registered: Feb 2002
Location: harvard, il
Distribution: Ubuntu 11.4,DD-WRT micro plus ssh,lfs-6.6,Fedora 15,Fedora 16
Posts: 3,233

Rep: Reputation: 406Reputation: 406Reputation: 406Reputation: 406Reputation: 406
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
 
Old 05-12-2005, 10:24 AM   #4
Matir
LQ Guru
 
Registered: Nov 2004
Location: San Jose, CA
Distribution: Debian, Arch
Posts: 8,507

Rep: Reputation: 128Reputation: 128
The init process idea, by the way, assumes that you are not using any kernel-space IP Autoconfiguration.
 
Old 05-12-2005, 10:58 AM   #5
cranium2004
Member
 
Registered: Feb 2004
Distribution: FC4,RHEL4
Posts: 223

Original Poster
Rep: Reputation: 30
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?
 
Old 05-12-2005, 11:56 AM   #6
frieza
Senior Member
 
Registered: Feb 2002
Location: harvard, il
Distribution: Ubuntu 11.4,DD-WRT micro plus ssh,lfs-6.6,Fedora 15,Fedora 16
Posts: 3,233

Rep: Reputation: 406Reputation: 406Reputation: 406Reputation: 406Reputation: 406
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
 
Old 05-13-2005, 01:36 AM   #7
cranium2004
Member
 
Registered: Feb 2004
Distribution: FC4,RHEL4
Posts: 223

Original Poster
Rep: Reputation: 30
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

Last edited by cranium2004; 05-13-2005 at 01:48 AM.
 
Old 05-13-2005, 08:58 AM   #8
Matir
LQ Guru
 
Registered: Nov 2004
Location: San Jose, CA
Distribution: Debian, Arch
Posts: 8,507

Rep: Reputation: 128Reputation: 128
Well, are the permissions set properly?
 
Old 05-13-2005, 12:05 PM   #9
cranium2004
Member
 
Registered: Feb 2004
Distribution: FC4,RHEL4
Posts: 223

Original Poster
Rep: Reputation: 30
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 ?
 
Old 05-13-2005, 08:17 PM   #10
Matir
LQ Guru
 
Registered: Nov 2004
Location: San Jose, CA
Distribution: Debian, Arch
Posts: 8,507

Rep: Reputation: 128Reputation: 128
Is your system really booting in runlevel 3? Are other statements in the file being executed properly?
 
Old 05-13-2005, 11:33 PM   #11
cranium2004
Member
 
Registered: Feb 2004
Distribution: FC4,RHEL4
Posts: 223

Original Poster
Rep: Reputation: 30
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?
 
Old 05-13-2005, 11:40 PM   #12
Matir
LQ Guru
 
Registered: Nov 2004
Location: San Jose, CA
Distribution: Debian, Arch
Posts: 8,507

Rep: Reputation: 128Reputation: 128
That should be all you need. Please post the contents of S10networks.
 
Old 05-13-2005, 11:47 PM   #13
cranium2004
Member
 
Registered: Feb 2004
Distribution: FC4,RHEL4
Posts: 223

Original Poster
Rep: Reputation: 30
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
 
Old 05-14-2005, 12:37 AM   #14
btmiller
Senior Member
 
Registered: May 2004
Location: In the DC 'burbs
Distribution: Arch, Scientific Linux, Debian, Ubuntu
Posts: 4,290

Rep: Reputation: 378Reputation: 378Reputation: 378Reputation: 378
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.
 
Old 05-14-2005, 01:52 AM   #15
cranium2004
Member
 
Registered: Feb 2004
Distribution: FC4,RHEL4
Posts: 223

Original Poster
Rep: Reputation: 30
Thanks all :)

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


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
new kernel system call Ephracis Programming 1 05-06-2005 10:23 AM
tracing the error code returned by wait call lg3 Linux - Software 0 02-21-2005 03:53 AM
start to read the source code and have questions pipehappy Linux - Newbie 1 01-05-2005 02:19 AM
system call to get the kernel version appas Programming 2 10-06-2004 03:51 AM
Adding new System Call to Kernel kurt_ram Linux - General 1 10-22-2002 03:59 PM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 10:39 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration