void * keyserver(void *args) { static int ch, i = 0, c = 'a'; while(ch = ui_input()) { switch(ch) { case 'q': case 'Q': ui_print("preparing to quit ...\n"); stop = 1; break; case 0x60: ui_scroll(-5); break; case 0x61: ui_scroll(5); break; case ' ': ui_pausemsg(0); break; case 1: // Ctrl-A ui_pausemsg(1); break; case 3: // Ctrl-C ui_deinit(); io_deinit(); exit(1); break; default: // ui_print("key code: %d", ch); ; } } }
void io_free(uv_handle_t *handle) { if (!handle) { return; } io_deinit(handle); free(handle); }
void deinit(void) { cli(); timer_deinit(); pwm_deinit(); adc_deinit(); io_deinit(); }
int main() { char buf[64], *v[SZ]; struct alias *a; int n, i, r, skip_actions; FILE *f; pthread_t rv, ks; ui_init(); ui_animation(0); f = fopen("commands.desc", "r"); if(f == NULL) { ui_print("failed to open commands.desc\n"); goto end; } // parse command list while(fgets(buf, 64, f)) { for(i = 0, v[i] = strtok(buf, " \n"); v[i]; v[++i] = strtok(0, " \n")); parse_line(i, v); } fclose(f); // init bin for(i = 0;; ) { a = get_alias("bin", i++); if(!a) break; ui_bin_add_tag(a->str); } ui_bin_add_tag("timeout"); // init options tip ui_tip_update(1, "Press the corresponding key to perform that function:"); ui_tip_update(3, "<S> Handler Speed"); ui_tip_update(4, "<R> Reset"); ui_tip_update(5, "<Q> Quit"); // init io r = io_init(); ptsname_r(r, buf, 64); ui_print("pts name is: %s (%d)\n", buf, r); // init wait queue wait_queue_init(); // init receiver pthread_create(&rv, NULL, receiver, NULL); // init keyserver pthread_create(&ks, NULL, keyserver, NULL); again: ui_print("\n\nnew routine:\n"); skip_actions = 0; for(wait_queue_init(), i = 0; i < lscount; i++) { if(skip_actions && (!strcmp(lines[i].argv[0], "send") || !strcmp(lines[i].argv[0], "wait"))) continue; if(exec_line(lines[i].argc, lines[i].argv) < 0) skip_actions = 1; } wait_queue_deinit(); if(!stop) goto again; end: ui_deinit(); io_deinit(); }
int main(int argc, char *argv[]){ int retval; char * device_imu; char * device_file; FILE * file; if(argc<3){ fprintf(stderr,IO_TEST_HOW_TO); exit(1); }else{ device_imu = argv[1]; device_file = argv[2]; } io_t * io = io_init(); if(io==NULL){ err_check(ERROR_FAIL,"io test failed"); } // Lets add the IMU and some random file // The plan is to have the constant stream of data from the imu, a // sporadic data from the file, which would represent the diff in // update rate from the GPS and the IMU. /// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- /// Init /// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // Init IMU imu_t * imu = imu_comm_init(device_imu); if(imu == NULL){ err_check(ERROR_FAIL,"Failed to init imu"); } // Init some other file file = fopen(device_file,"r+"); if(file == NULL){ err_check(ERROR_FAIL,"Failed to open file"); } /// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- /// Register IO devices /// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // imu int imu_fds; retval = imu_comm_get_fds(imu,& imu_fds); FREE_N_DIE_IF_ERROR(retval,"Failed to get imu fds!!"); retval = io_add_dev(io,imu_fds); FREE_N_DIE_IF_ERROR(retval,"Failed to add imu to dev list"); if(io->dev_list.dev_count != 1){ FREE_N_DIE_IF_ERROR(retval,"Reg device counter error!"); } // Pipe // To create a pipe, do: // mknode my.pipe p // Then open my.pipe as a regular file. int file_fds; file_fds = fileno(file); retval = io_add_dev(io,file_fds); FREE_N_DIE_IF_ERROR(retval,"Failed to add file to dev list"); if(io->dev_list.dev_count != 2){ FREE_N_DIE_IF_ERROR(retval,"Reg device counter error!"); } // stdin retval = io_add_dev(io,STDIN_FILENO); FREE_N_DIE_IF_ERROR(retval,"Failed to add STDIN to dev list"); if(io->dev_list.dev_count != 3){ FREE_N_DIE_IF_ERROR(retval,"Reg device counter error!"); } /// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- /// Poll n read loop /// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- uquad_bool_t read = false,write = false; uquad_bool_t reg_imu = true, reg_pipe = true, reg_stdin = true; uquad_bool_t imu_ready = false; imu_data_t imu_data; unsigned char tmp_buff[2]; int counter = 0; poll_n_read: while(1){ retval = io_poll(io); FREE_N_DIE_IF_ERROR(retval,"io_poll() error"); // imu if(reg_imu){ retval = io_dev_ready(io,imu_fds,&read,&write); FREE_N_DIE_IF_ERROR(retval,"io_dev_ready() error"); if(read){ retval = imu_comm_read(imu,&imu_ready); if(imu_ready) { if(retval != ERROR_OK){ fprintf(stdout,"\nIMU missed frame?\n\n"); }else{ retval = imu_comm_get_data_latest_unread(imu,&imu_data); if(retval != ERROR_OK) fprintf(stdout,"\nIMU had no data!\n\n"); } } } } // pipe if(reg_pipe){ retval = io_dev_ready(io,file_fds,&read,&write); FREE_N_DIE_IF_ERROR(retval,"io_dev_ready() error"); if(read){ retval = fgetc(file); if(retval<0) fprintf(stdout,"\nEOF or error!!\n\n"); if(retval>0){ fprintf(stdout,"Read data from file.\n"); } if(retval==0) fprintf(stdout,"File had no data!.\n"); } } // stdin if(reg_stdin){ retval = io_dev_ready(io,STDIN_FILENO,&read,&write); FREE_N_DIE_IF_ERROR(retval,"io_dev_ready() error"); if(read){ retval = fread(tmp_buff,1,1,stdin); if(retval<=0) fprintf(stdout,"\nNo user input!!\n\n"); else // Each time user presses RET a device will be removed from // the registered dev list. goto rm; } } fflush(stdout); } /// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- /// Remove test /// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- rm: switch (counter){ case 0: retval = io_rm_dev(io,file_fds); FREE_N_DIE_IF_ERROR(retval,"Failed to remove PIPE from dev list"); fprintf(stdout,"Removed PIPE from dev list.\n"); reg_pipe = false; fflush(stdout); break; case 1: retval = io_rm_dev(io,imu_fds); FREE_N_DIE_IF_ERROR(retval,"Failed to remove IMU from dev list"); fprintf(stdout,"Removed IMU from dev list.\n"); reg_imu = false; fflush(stdout); break; case 2: fprintf(stdout,"Removed STDIN from dev list.\n"); retval = io_rm_dev(io,STDIN_FILENO); FREE_N_DIE_IF_ERROR(retval,"Failed to remove STDIN from dev list"); reg_stdin = false; fflush(stdout); break; default: FREE_N_DIE_IF_ERROR(ERROR_FAIL,"COUNTER out of bounds!"); break; } if(++counter < 3) goto poll_n_read; /// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- /// Free everything /// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- kill_n_close: retval = io_deinit(io); if(retval != ERROR_OK){ fprintf(stderr,"Warning! Failed to free io structure!\nIgnoring error...\n"); } retval = imu_comm_deinit(imu); if(retval != ERROR_OK){ fprintf(stderr,"Warning! Failed to free imu structure!\nIgnoring error...\n"); } return 0; }
/** * Kick off the daap server and wait for events. * * This starts the initial db scan, sets up the signal * handling, starts the webserver, then sits back and waits * for events, as notified by the signal handler and the * web interface. These events are communicated via flags * in the config structure. * * \param argc count of command line arguments * \param argv command line argument pointers * \returns 0 on success, -1 otherwise * * \todo split out a ws_init and ws_start, so that the * web space handlers can be registered before the webserver * starts. * */ int main(int argc, char *argv[]) { int option; char *configfile=CONFFILE; WSCONFIG ws_config; int reload=0; int start_time; int end_time; int rescan_counter=0; int old_song_count, song_count; int force_non_root=0; int skip_initial=1; int kill_server=0; int convert_conf=0; char *db_type,*db_parms,*web_root,*runas, *tmp; char **mp3_dir_array; char *servername, *iface; char *ffid = NULL; int appdir = 0; char *perr=NULL; char txtrecord[255]; void *phandle; char *plugindir; int err; char *apppath; int debuglevel=0; int plugins_loaded = 0; #ifdef ALPHA_CUSTOMIZE char *share_path; pthread_t thread1; #endif config.use_mdns=1; err_setlevel(2); config.foreground=0; while((option=getopt(argc,argv,"D:d:c:P:mfrysiuvab:Vk")) != -1) { switch(option) { case 'a': appdir = 1; break; case 'b': ffid=optarg; break; case 'd': debuglevel = atoi(optarg); err_setlevel(debuglevel); break; case 'D': if(err_setdebugmask(optarg)) { usage(argv[0]); exit(EXIT_FAILURE); } break; case 'f': config.foreground=1; err_setdest(err_getdest() | LOGDEST_STDERR); break; case 'c': configfile=optarg; break; case 'm': config.use_mdns=0; break; #ifndef WIN32 case 'P': os_set_pidfile(optarg); break; #endif case 'r': reload=1; break; case 's': skip_initial=0; break; case 'y': force_non_root=1; break; #ifdef WIN32 case 'i': os_register(); exit(EXIT_SUCCESS); break; case 'u': os_unregister(); exit(EXIT_SUCCESS); break; #endif case 'v': convert_conf=1; break; case 'k': kill_server=1; break; case 'V': fprintf(stderr,"Firefly Media Server: Version %s\n",VERSION); exit(EXIT_SUCCESS); break; default: usage(argv[0]); exit(EXIT_FAILURE); break; } } if((getuid()) && (!force_non_root) && (!convert_conf)) { fprintf(stderr,"You are not root. This is almost certainly wrong. " "If you are\nsure you want to do this, use the -y " "command-line switch\n"); exit(EXIT_FAILURE); } if(kill_server) { os_signal_server(S_STOP); exit(0); } io_init(); io_set_errhandler(main_io_errhandler); ws_set_errhandler(main_ws_errhandler); /* read the configfile, if specified, otherwise * try defaults */ config.stats.start_time=start_time=(int)time(NULL); config.stop=0; /* set appdir first, that way config resolves relative to appdir */ if(appdir) { apppath = os_apppath(argv[0]); DPRINTF(E_INF,L_MAIN,"Changing cwd to %s\n",apppath); chdir(apppath); free(apppath); configfile="mt-daapd.conf"; } if(CONF_E_SUCCESS != conf_read(configfile)) { fprintf(stderr,"Error reading config file (%s)\n",configfile); exit(EXIT_FAILURE); } if(debuglevel) /* was specified, should override the config file */ err_setlevel(debuglevel); if(convert_conf) { fprintf(stderr,"Converting config file...\n"); if(CONF_E_SUCCESS != conf_write()) { fprintf(stderr,"Error writing config file.\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } DPRINTF(E_LOG,L_MAIN,"Firefly Version %s: Starting with debuglevel %d\n", VERSION,err_getlevel()); /* load plugins before we drop privs? Maybe... let the * plugins do stuff they might need to */ plugin_init(); if((plugindir=conf_alloc_string("plugins","plugin_dir",NULL)) != NULL) { /* instead of specifying plugins, let's walk through the directory * and load each of them */ if(!load_plugin_dir(plugindir)) { DPRINTF(E_LOG,L_MAIN,"Warning: Could not load plugins\n"); } else { plugins_loaded = TRUE; } free(plugindir); } if(!plugins_loaded) { if((!load_plugin_dir("/usr/lib/firefly/plugins")) && (!load_plugin_dir("/usr/lib/mt-daapd/plugins")) && (!load_plugin_dir("/lib/mt-daapd/plugins")) && (!load_plugin_dir("/lib/mt-daapd/plugins")) && (!load_plugin_dir("/usr/local/lib/mt-daapd/plugins")) && (!load_plugin_dir("/usr/local/lib/mt-daapd/plugins")) && (!load_plugin_dir("/opt/share/firefly/plugins")) && (!load_plugin_dir("/opt/share/mt-daapd/plugins")) && (!load_plugin_dir("/opt/lib/firefly/plugins")) && (!load_plugin_dir("/opt/lib/mt-daapd/plugins")) && (!load_plugin_dir("plugins/.libs"))) { DPRINTF(E_FATAL,L_MAIN,"plugins/plugin_dir not specified\n"); } } phandle=NULL; while((phandle=plugin_enum(phandle))) { DPRINTF(E_LOG,L_MAIN,"Plugin loaded: %s\n",plugin_get_description(phandle)); } runas = conf_alloc_string("general","runas","nobody"); #ifndef WITHOUT_MDNS if(config.use_mdns) { DPRINTF(E_LOG,L_MAIN,"Starting rendezvous daemon\n"); if(rend_init(runas)) { DPRINTF(E_FATAL,L_MAIN|L_REND,"Error in rend_init: %s\n", strerror(errno)); } } #endif if(!os_init(config.foreground,runas)) { DPRINTF(E_LOG,L_MAIN,"Could not initialize server\n"); os_deinit(); exit(EXIT_FAILURE); } free(runas); #ifdef UPNP upnp_init(); #endif /* this will require that the db be readable by the runas user */ db_type = conf_alloc_string("general","db_type","sqlite"); db_parms = conf_alloc_string("general","db_parms","/var/cache/mt-daapd"); err=db_open(&perr,db_type,db_parms); if(err) { DPRINTF(E_LOG,L_MAIN|L_DB,"Error opening db: %s\n",perr); #ifndef WITHOUT_MDNS if(config.use_mdns) { rend_stop(); } #endif os_deinit(); exit(EXIT_FAILURE); } free(db_type); free(db_parms); /* Initialize the database before starting */ DPRINTF(E_LOG,L_MAIN|L_DB,"Initializing database\n"); if(db_init(reload)) { DPRINTF(E_FATAL,L_MAIN|L_DB,"Error in db_init: %s\n",strerror(errno)); } err=db_get_song_count(&perr,&song_count); if(err != DB_E_SUCCESS) { DPRINTF(E_FATAL,L_MISC,"Error getting song count: %s\n",perr); } /* do a full reload if the db is empty */ if(!song_count) reload = 1; if(conf_get_array("general","mp3_dir",&mp3_dir_array)) { if((!skip_initial) || (reload)) { DPRINTF(E_LOG,L_MAIN|L_SCAN,"Starting mp3 scan\n"); #ifdef ALPHA_CUSTOMIZE share_path = conf_alloc_string("general", "mp3_dir", "AAA"); printf("mp3_dir_array[0] = [%s]\n", mp3_dir_array[0]); if (strlen(share_path) > 0) { Cnt_total_file(mp3_dir_array[0]); pthread_create( &thread1, NULL, (void*)process_bar, NULL); free(share_path); } #endif plugin_event_dispatch(PLUGIN_EVENT_FULLSCAN_START,0,NULL,0); start_time=(int) time(NULL); if(scan_init(mp3_dir_array)) { DPRINTF(E_LOG,L_MAIN|L_SCAN,"Error scanning MP3 files: %s\n",strerror(errno)); } if(!config.stop) { /* don't send popup when shutting down */ plugin_event_dispatch(PLUGIN_EVENT_FULLSCAN_END,0,NULL,0); err=db_get_song_count(&perr,&song_count); end_time=(int) time(NULL); DPRINTF(E_LOG,L_MAIN|L_SCAN,"Scanned %d songs in %d seconds\n", song_count,end_time - start_time); } } conf_dispose_array(mp3_dir_array); } #ifdef ALPHA_CUSTOMIZE thread_exit = 1; #endif /* start up the web server */ web_root = conf_alloc_string("general","web_root",NULL); ws_config.web_root=web_root; ws_config.port=conf_get_int("general","port",0); DPRINTF(E_LOG,L_MAIN|L_WS,"Starting web server from %s on port %d\n", ws_config.web_root, ws_config.port); config.server=ws_init(&ws_config); if(!config.server) { /* pthreads or malloc error */ DPRINTF(E_FATAL,L_MAIN|L_WS,"Error initializing web server\n"); } if(E_WS_SUCCESS != ws_start(config.server)) { /* listen or pthread error */ DPRINTF(E_FATAL,L_MAIN|L_WS,"Error starting web server\n"); } ws_registerhandler(config.server, "/",main_handler,main_auth, 0,1); #ifndef WITHOUT_MDNS if(config.use_mdns) { /* register services */ servername = conf_get_servername(); memset(txtrecord,0,sizeof(txtrecord)); txt_add(txtrecord,"txtvers=1"); txt_add(txtrecord,"Database ID=%0X",util_djb_hash_str(servername)); txt_add(txtrecord,"Machine ID=%0X",util_djb_hash_str(servername)); txt_add(txtrecord,"Machine Name=%s",servername); txt_add(txtrecord,"mtd-version=" VERSION); txt_add(txtrecord,"iTSh Version=131073"); /* iTunes 6.0.4 */ txt_add(txtrecord,"Version=196610"); /* iTunes 6.0.4 */ tmp = conf_alloc_string("general","password",NULL); if(tmp && (strlen(tmp)==0)) tmp=NULL; txt_add(txtrecord,"Password=%s",tmp ? "true" : "false"); if(tmp) free(tmp); srand((unsigned int)time(NULL)); if(ffid) { txt_add(txtrecord,"ffid=%s",ffid); } else { txt_add(txtrecord,"ffid=%08x",rand()); } DPRINTF(E_LOG,L_MAIN|L_REND,"Registering rendezvous names\n"); iface = conf_alloc_string("general","interface",""); rend_register(servername,"_http._tcp",ws_config.port,iface,txtrecord); plugin_rend_register(servername,ws_config.port,iface,txtrecord); free(servername); free(iface); } #endif end_time=(int) time(NULL); err=db_get_song_count(&perr,&song_count); if(err != DB_E_SUCCESS) { DPRINTF(E_FATAL,L_MISC,"Error getting song count: %s\n",perr); } DPRINTF(E_LOG,L_MAIN,"Serving %d songs. Startup complete in %d seconds\n", song_count,end_time-start_time); if(conf_get_int("general","rescan_interval",0) && (!reload) && (!conf_get_int("scanning","skip_first",0))) config.reload = 1; /* force a reload on start */ while(!config.stop) { if((conf_get_int("general","rescan_interval",0) && (rescan_counter > conf_get_int("general","rescan_interval",0)))) { if((conf_get_int("general","always_scan",0)) || (config_get_session_count())) { config.reload=1; } else { DPRINTF(E_DBG,L_MAIN|L_SCAN|L_DB,"Skipped bground scan... no users\n"); } rescan_counter=0; } if(config.reload) { old_song_count = song_count; start_time=(int) time(NULL); DPRINTF(E_LOG,L_MAIN|L_DB|L_SCAN,"Rescanning database\n"); if(conf_get_array("general","mp3_dir",&mp3_dir_array)) { if(config.full_reload) { config.full_reload=0; db_force_rescan(NULL); } if(scan_init(mp3_dir_array)) { DPRINTF(E_LOG,L_MAIN|L_DB|L_SCAN,"Error rescanning... bad path?\n"); } conf_dispose_array(mp3_dir_array); } config.reload=0; db_get_song_count(NULL,&song_count); DPRINTF(E_LOG,L_MAIN|L_DB|L_SCAN,"Scanned %d songs (was %d) in " "%d seconds\n",song_count,old_song_count, time(NULL)-start_time); } os_wait(MAIN_SLEEP_INTERVAL); rescan_counter += MAIN_SLEEP_INTERVAL; } DPRINTF(E_LOG,L_MAIN,"Stopping gracefully\n"); #ifndef WITHOUT_MDNS if(config.use_mdns) { DPRINTF(E_LOG,L_MAIN|L_REND,"Stopping rendezvous daemon\n"); rend_stop(); } #endif #ifdef UPNP upnp_deinit(); #endif /* Got to find a cleaner way to stop the web server. * Closing the fd of the socking accepting doesn't necessarily * cause the accept to fail on some libcs. * DPRINTF(E_LOG,L_MAIN|L_WS,"Stopping web server\n"); ws_stop(config.server); */ free(web_root); conf_close(); DPRINTF(E_LOG,L_MAIN|L_DB,"Closing database\n"); db_deinit(); DPRINTF(E_LOG,L_MAIN,"Done!\n"); os_deinit(); io_deinit(); mem_dump(); return EXIT_SUCCESS; }