Ejemplo n.º 1
0
void CCommandLineDisplay::InputEnter (void)

//	InputEnter
//
//	Invoke input

	{
	AppendHistory(m_sInput);
	Output(m_sInput, INPUT_COLOR);
	ClearInput();
	ClearHint();
	}
Ejemplo n.º 2
0
void Shell(COMMAND commands[],char *help[])
{
	char cmdline[STRING],argv[MAXCMD],argp[MAXCMD];
	
	int i,opcja,n=0,j,ok,len,count=0,itmp;
	
	while(commands[n].command!=NULL) n++;
	
	for( ; ; )
	{					/* Interactive mode */
		fprintf(stdout,"[%d]MP> ",count); fflush(stdout);
		argv[0]=argp[0]=0; cmdline[0]=0;
		
		if(!fgets(cmdline,sizeof(cmdline)-1,stdin))
		{
			fprintf(stderr,"Read error ! [%s]\n",cmdline);
			return;
		}
		
		i=0;
		while(cmdline[i] && isspace(cmdline[i])) i++;
		(void)sscanf(cmdline+i,"%s",argv);
		
		len=strlen(argv);
		if(len==0) continue;
		i+=len;
		while(cmdline[i] && isspace(cmdline[i])) i++;
		(void)sscanf(cmdline+i,"%[^\n]\n",argp);
		
		AppendHistory(count,argv,argp); count++;
		
		if(strcmp(argv,"history")==0)
		{
			if(strlen(argp)>0)
			{
				itmp=atoi(argp);
				ok=0;
				for(i=0 ; i<CountHist ; i++)
				{
					if(HistTable[i]->count==itmp)
					{
						ok=1;
						strcpy(argv,HistTable[i]->napis);
						strcpy(argp,HistTable[i]->opt);
						fprintf(stdout,"[%d] (HISTORY [%d]) MP> %s %s\n",
							count-1,itmp,argv,argp);
						break;
					}
				}
					
				if(!ok)
				{
					fprintf(stderr,"No such number\n");
					continue;
				}
			}
			else
			{
				fprintf(stdout,"\t\t<<< HISTORY >>>\n");
				
				for(i=0 ; i<CountHist ; i++)
				{
					fprintf(stdout,"[%d] %s %s\n",HistTable[i]->count,
						HistTable[i]->napis,
						HistTable[i]->opt);
				
					if(((i+1)%20)==0) 
						pause();
				}
				
				fprintf(stdout,"\n");
				continue;
			}
		}
		
		if(strcmp(argv,"man")==0)
		{
			fprintf(stdout,"\n\t\t<<< BUILT-IN COMMANDS >>\n"
				"exit        \t\t- leave shell\n"
				"ls          \t\t- current directory listing\n"
				"history [nr]\t\t- display entered commands or execute [nr] if given\n"
				"batch       \t\t- run commands from file\n"
				"!comd       \t\t- run a shell command comd\n"
				"man         \t\t- display all available help\n"
				"sys comd    \t\t- run shell command comd in script\n");
			
			fprintf(stdout,"<<< NEXT - ENTER q - QUIT >>> ");
		
			if(getchar()!='q')
			{
				if(help!=NULL)
					PrintAllHelp(commands,help,n); 
			}
			else 
				(void)getchar();
			
			continue;
		}
		
		if(strcmp(argv,"help")==0 || strcmp(argv,"?")==0 || strcmp(argv,"h")==0)
		{
			ok=0;
			
			if(strlen(argp)>0)
			{
				if(strcmp(argp,"help")==0 || strcmp(argp,"?")==0)
				{
					ok=1;
					fprintf(stderr,"help [arg] or ? [arg] -- info about the arg command\n");
				} 
				else if(strcmp(argp,"batch")==0)
				{
					ok=1;
					fprintf(stderr,"batch file -- run script file\n");
				}	
				else if(strcmp(argp,"sys")==0)
				{
					ok=1;
					fprintf(stderr,"sys comd -- run shell command comd (from a script only)\n");
				}
				else if(strcmp(argp,"ls")==0)
				{
					ok=1;
					fprintf(stderr,"ls adir -- listing of directory adir, regexp allowed\n"); 
				}
				else if(strcmp(argp,"history")==0)
				{
					ok=1;
					fprintf(stderr,"history [nr] -- list entered commands\n"	
						"\t\t or if [nr] given - run command No [nr]\n");
				}
				else
					for(j=0 ; j<n ; j++)
					if(strcmp(commands[j].command,argp)==0)
					{
						ok=1;
						fprintf(stdout,"%-10s - ",commands[j].command);
						if(help!=NULL)
							fprintf(stdout,"%s ",help[j]);
						fprintf(stdout,"\n");
						break;
					}
					if(!ok) 
						fprintf(stdout,"Unknown command : %s\n",argp);
			}
			else
			{ fprintf(stdout,"%s\n",firsthelp); }
			continue;
		}
		
		if(strcmp(argv,"exit")==0) {
			DeleteHistory();
			if(prn==1)
				fprintf(stdout,"<<< LEAVING MP SHELL >>>\n");
			Quit("");
			break;
		}
		
		if(strcmp(argv,"ls")==0)
		{
			ls(argp);
			continue;
		}
		
		if(strcmp(argv,"batch")==0)
		{
			char *newargv[MAXCMD];
			int i,argc;
			
			for(i=0 ; i<MAXCMD ; i++)
				newargv[i]=NULL;
			
			StrToArgv(argp,newargv,&argc);
			if(Batch(commands,newargv[0],newargv)==-1)
				fprintf(stderr,"Missing file %s !\n",argp);
			FreeArgv(newargv,argc);
			continue;
		}
		
		if(strcmp(argv,"!")==0)
		{
			if(system(argp)==-1)
				fprintf(stderr,"Error executing system command !\n");
			continue;
		}
		
		if(argv[0]=='!')
		{
			argv[0]=' ';
			(void)strcat(argv," "); (void)strcat(argv,argp);
			if(system(argv)==-1)
				fprintf(stderr,"Error executing system command !\n");
			continue;
		}
		
		opcja=-1;				/* Opcje zewnetrzne */
		
		for(i=0 ; i<n ; i++)
			if(strcmp(commands[i].command,argv)==0)
			{
				opcja=i;
				(*commands[i].func)(argp);
				break;
			}
			
			if(opcja==-1)
			{
				char name[STRING],*newargv[MAXCMD],buffor[STRING];
				int argc,i;
				
				for(i=0 ; i<MAXCMD ; i++)
					newargv[i]=NULL;
				
				sprintf(buffor,"%s %s",argv,argp);
				StrToArgv(buffor,newargv,&argc);
				
				if(Batch(commands,newargv[0],newargv)==-1)
				{	 /* Polecenia w biezacym katologu */
					int index=0,ok=0;
					
					for( ; ; index++)
					{
						if(makePathName(name,index)==NULL)
							break;
						
						strcat(name,newargv[0]);
						if(Batch(commands,name,newargv)!=-1) {
							ok=1;
							break;
						}
					}

					if(ok==0) 
						fprintf(stderr,"MP: Unknown command %s or bad script path %s\n",
						argv,BatchPath);
				}
				
				FreeArgv(newargv,argc);
			}    
      }
}
Ejemplo n.º 3
0
void
Starter::exited(int status)
{
	ClassAd *jobAd = NULL;
	bool jobAdNeedsFree = true;

	if (s_claim && s_claim->ad()) {
		// real jobs in the startd have claims and job ads, boinc and perhaps others won't
		jobAd = s_claim->ad();
		jobAdNeedsFree = false;
	} else {
		// Dummy up an ad
		int now = (int) time(0);
		jobAd = new ClassAd();
		jobAd->SetMyTypeName("Job");
		jobAd->SetTargetTypeName("Machine");
		jobAd->Assign(ATTR_CLUSTER_ID, now);
		jobAd->Assign(ATTR_PROC_ID, 1);
		jobAd->Assign(ATTR_OWNER, "boinc");
		jobAd->Assign(ATTR_Q_DATE, (int)s_birthdate);
		jobAd->Assign(ATTR_JOB_PRIO, 0);
		jobAd->Assign(ATTR_IMAGE_SIZE, 0);
		jobAd->Assign(ATTR_JOB_CMD, "boinc");
		MyString gjid;
		gjid.formatstr("%s#%d#%d#%d", get_local_hostname().Value(), 
					 now, 1, now);
		jobAd->Assign(ATTR_GLOBAL_JOB_ID, gjid);
	}

	// First, patch up the ad a little bit 
	jobAd->Assign(ATTR_COMPLETION_DATE, (int)time(0));
	int runtime = time(0) - s_birthdate;
	
	jobAd->Assign(ATTR_JOB_REMOTE_WALL_CLOCK, runtime);
	int jobStatus = COMPLETED;
	if (WIFSIGNALED(status)) {
		jobStatus = REMOVED;
	}
	jobAd->Assign(ATTR_JOB_STATUS, jobStatus);
	AppendHistory(jobAd);
	WritePerJobHistoryFile(jobAd, true /* use gjid for filename*/);

	if (jobAdNeedsFree) {
		delete jobAd;
	}

		// Make sure our time isn't going to go off.
	cancelKillTimer();

		// Just for good measure, try to kill what's left of our whole
		// pid family.
	if (daemonCore->Kill_Family(s_pid) == FALSE) {
		dprintf(D_ALWAYS,
		        "error killing process family of starter with pid %u\n",
		        s_pid);
	}

		// Now, delete any files lying around.
	ASSERT( executeDir() );
	cleanup_execute_dir( s_pid, executeDir() );

#if defined(LINUX)
	if( param_boolean( "GLEXEC_STARTER", false ) ) {
		cleanupAfterGlexec();
	}
#endif
}