The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
void *
llsubmit(job_cmd_file, monitor_program,monitor_arg)
	char *job_cmd_file
	char *monitor_program
	char *monitor_arg

	PPCODE:
	{
	    LL_job	job_info;
	    int		 rc;
	    int		i;
	    AV		*steps;

	    RETVAL=(void *)targ; /* bogus but supresses any unused variable error messages */
	    rc=llsubmit(job_cmd_file,monitor_program,monitor_arg,&job_info,LL_JOB_VERSION);
	    if ( rc != 0 )
		XSRETURN_UNDEF;
	    else
	    {
		XPUSHs(sv_2mortal(newSVpv(job_info.job_name, 0)));
		XPUSHs(sv_2mortal(newSVpv(job_info.owner, 0)));
		XPUSHs(sv_2mortal(newSVpv(job_info.groupname, 0)));
		XPUSHs(sv_2mortal(newSViv((long)job_info.uid)));
		XPUSHs(sv_2mortal(newSViv((long)job_info.gid)));
		XPUSHs(sv_2mortal(newSVpv(job_info.submit_host, 0)));
		XPUSHs(sv_2mortal(newSViv((long)job_info.steps)));
		steps=(AV *)sv_2mortal((SV *)newAV());
		for(i=0;i!=job_info.steps;i++)
		{
		    HV *step;

		    step=unpack_job_step(job_info.step_list[i]);
		    av_push(steps,newRV((SV *)step));
		}	
		XPUSHs(sv_2mortal(newRV((SV *)steps)));
		/* All Data now in Perl structures free the LoadLeveler construct */
		llfree_job_info(&job_info,LL_JOB_VERSION);
	    }	    
	}