summaryrefslogblamecommitdiffstats
path: root/door.c
blob: 4c6fc06317b421d1819d0f72868c4336ed6ddf02 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                                                               
 





                                                      

                           
                                                     
 

                                  
                                                             




                                                            












                                                     


































                                                                                      

                                                                       
 

                                                                     









                                                                                                          



                                                             





                                                 
                                                  








                                                                 
                                                                      



                                                            
                                      










































                                                                                               
                                                                                   





















                                                                                                            
                                                               



                                                 















                                                                                    




                   
#include "door.h"

#ifdef CONFIG_DOORGAMES



//just for full fill libc example
static int dir_door_game_selector (const struct dirent *unused)
{
  return 1;
}


int bbs_door_start( term_screen *ts, const char *cmd )
{
	int ret=0;

	int restore_mode=1;

	term_clr_scr( ts );

	tcsetattr( ts->ifd, TCSAFLUSH, &ts->orig_i );

	if ( system( cmd ) == -1 )
	{
		bbs_log( "DOOR", "couldnt execute doorgame");
	}

	if ( restore_mode )
	{
		tcsetattr( ts->ifd, TCSAFLUSH, &ts->raw_i );
	}


	return ret;
}

int bbs_door( term_screen *ts, const char *dir_name )
{
	int ret=0;

	int quit_loop=0;
	int menu_input = 0;
	char menu_cmd = 0;
	const char *door_game_dir=NULL;

	if ( ts == NULL )
		return ret;


	if ( dir_name == NULL )
	{
		door_game_dir = CONFIG_DOOR_DEFAULT_DIR;
	} else
	{
		door_game_dir = dir_name;
	}

	//list dir
	struct stat path_node;
	struct dirent **eps;
	int n;

	//get all articles names in list and use list every time needed
	List *dir_list = llist_new();

	bbs_log_article_list( NULL );

	if ( door_game_dir != NULL )
	{
		//should have some bugs be carefull
		n = scandir( door_game_dir, &eps, dir_door_game_selector, alphasort );
		if ( n >= 0)
		{
			int cnt;
			for ( cnt=0; cnt<n; cnt++)
			{
				sds d_name = sds_new( eps[cnt]->d_name );
				sds pathname  = sds_new( door_game_dir );
				pathname = sds_cat( pathname, d_name );
				sds_free( d_name );

				//!!!possible memleak unfreed d_name?

				//check if its file
				term_cur_set_c( ts, 0 );
				if ( stat( pathname, &path_node ) == 0 )
				{
					if ( (path_node.st_mode & S_IFREG) && (path_node.st_mode & 0111) )
					{
						llist_push( dir_list, pathname );
					} else
					{
						sds_free( pathname );
					}
				} else 
				{
					sds_free( pathname );
				}
				free( eps[cnt] );
			}
			free( eps );
		} else
		{
			term_printf( ts, "Err\n");
			ERROR("Cannot open article directory\n");
		}
		ret = 0;
	}

	while( (quit_loop == 0) )
	{
		term_clr_scr( ts );
		term_cur_set_c( ts, 0 );
		term_printf( ts, "(L)ist games, (P)lay game, (Q)uit");


		term_cur_set_c( ts, 0 );
		term_cur_set_r( ts, term_get_maxrow( ts ) );
		term_printf( ts, ":");

		menu_input = term_getc( ts );
		//if something whent wrong dont know why, need to get some test case
		if ( menu_input == -1 )
		{
			term_cur_set_c( ts, 0 );
			ERROR("Cannot read char");
			sleep(1);
			continue;
		}
		menu_cmd = (char)menu_input;

		switch( menu_cmd )
		{
			case 'q':
			case 'Q':
				quit_loop = 1;
				break;

			case 'l':
			case 'L':
				{
					term_cur_set_c( ts, 0 );
					term_cur_set_r( ts, 2 );
					//print list of executables
					struct ListNode *iter=dir_list->first;
					int cnt = 1;
					while (iter != NULL)
					{
						term_cur_set_c( ts, 0 );
						printf( "[%02d] %s\n", cnt, (char *)iter->val);
						cnt += 1;
						iter = iter->next;
					}
					term_cur_set_c( ts, 0 );
					term_print( ts, "Press ANYKEY\n", 13);
					term_getc( ts );
				}
				break;
			case 'p':
			case 'P':
				{
					term_cur_set_c( ts, 0 );
					term_printf( ts, "Input game number 1-9:");
					int game_input = term_getc( ts );
					//if something whent wrong dont know why, need to get some test case
					char game_number = (char)game_input-'0';

					if ( game_number > 0 && game_number < 10)
					{
						struct ListNode *iter = dir_list->first;
						int cnt = 1;
						while ( iter != NULL )
						{
							if ( cnt == game_number )
							{
								bbs_door_start( ts, iter->val );
								break;
							}
							cnt += 1;
							iter = iter->next;
						}
					}
				}
				break;
			default:
				term_printf( ts, "Try more\n");
		}
	}

	//needed special care to free sds strings
	//dangerous stuff as list contains sds strings then we need to call sds_free
	//not just free, maybe try to use llist_manager it should handle that
	{
		struct ListNode *iter=dir_list->first;
		while (iter != NULL)
		{
			if ( iter->val != NULL )
			{
				sds_free( iter->val );
				iter->val = NULL;
			}
			iter = iter->next;
		}

	}
	llist_free( dir_list );

	return ret;
}

#endif