int32_t apple_joypad_connect(const char* name, struct apple_pad_connection* connection) { int32_t slot = find_empty_slot(); if (slot >= 0 && slot < MAX_PLAYERS) { unsigned i; joypad_slot_t* s = (joypad_slot_t*)&slots[slot]; s->used = true; static const struct { const char* name; struct apple_pad_interface* iface; } pad_map[] = { { "Nintendo RVL-CNT-01", &apple_pad_wii }, { "PLAYSTATION(R)3 Controller", &apple_pad_ps3 }, { 0, 0} }; for (i = 0; name && pad_map[i].name; i++) if (strstr(name, pad_map[i].name)) { s->iface = pad_map[i].iface; s->data = s->iface->connect(connection, slot); } } return slot; }
Rfile ropen(char *name, int mode) /* Open a file on ram-disk */ { Temp_file *tpf; int flags; if ((flags = flags_for_mode(mode)) < Success) return(NULL); if ((tpf = find_named(name)) != NULL) { if (tpf->flags & TF_OPEN) { rerr = Err_in_use; return(NULL); } tpf->filep = 0; tpf->flags = flags; tpf->omode = mode; return(tpf); } if ((flags&TF_READ)) { rerr = Err_no_file; return(NULL); } if ((tpf = find_empty_slot()) != NULL) { strncpy(tpf->name, name, TFNAME_SIZE-1); tpf->flags = flags; tpf->omode = mode; } return(tpf); }
int accept_new_connection(int sockfd, int client_socks[], int max_clients) { int first_empty_client=0; int rejected_client_fd; #define NOMORE_SLOTS "No client slot available\n" first_empty_client=find_empty_slot(client_socks, max_clients); if(first_empty_client<0) { fprintf(stderr, NOMORE_SLOTS); rejected_client_fd=accept(sockfd, NULL, NULL); write(rejected_client_fd, NOMORE_SLOTS, strlen(NOMORE_SLOTS)); close(rejected_client_fd); return -1; } else { client_socks[first_empty_client]=accept(sockfd, NULL, NULL); if(client_socks[first_empty_client]<0) { perror("accept"); return -1; } else { /* Set as nonblocking and return the slot used */ fcntl(client_socks[first_empty_client], F_SETFL, O_NONBLOCK); return first_empty_client; } } }
/* * Add a new user */ void add_user(user_chat_box_t *users, char *buf, int server_fd) { /***** Insert YOUR code *******/ /* * Check if user limit reached. * * If limit is okay, add user, set up non-blocking pipes and * notify on server shell * * NOTE: You may want to remove any newline characters from the name string * before adding it. This will help in future name-based search. */ int i; pid_t pid; char* user_name = extract_name(ADD_USER, buf); char msg[MSG_SIZE]; char arg1[MSG_SIZE]; char arg2[MSG_SIZE]; if (find_user_index(users, user_name) != -1){ printf("%s already exists.\n", user_name); return; } else { if ((i = find_empty_slot(users)) == -1) { printf("Users are full.\n"); return; } else { sprintf(msg, "Adding %s...\n", user_name); users[i].status = SLOT_FULL; strcpy(users[i].name, user_name); pipe(users[i].ptoc); pipe(users[i].ctop); fcntl(users[i].ptoc[0],F_SETFL, O_NONBLOCK); fcntl(users[i].ctop[0],F_SETFL, O_NONBLOCK); if (write(server_fd, msg, strlen(msg) + 1) < 0) perror("Writing to server shell"); } } //Fork a child process to execute added user's Xterm if ((users[i].pid = fork()) < 0) perror("Add_user fork error"); else if (users[i].pid == 0) { sprintf(arg1, "%d", users[i].ptoc[0]); sprintf(arg2, "%d", users[i].ctop[1]); execl(XTERM_PATH, XTERM, "+hold", "-e", "./shell", arg1, arg2, user_name, (char *)0); } return; }
int32_t apple_joypad_connect_gcapi(void) { int32_t slot = find_empty_slot(); if (slot >= 0 && slot < MAX_PLAYERS) { joypad_slot_t* s = (joypad_slot_t*)&slots[slot]; s->used = true; s->is_gcapi = true; } return slot; }
int add_slot(Object * obj, char *mode, char *new_slot) { char (*slots)[SHORT_STRLEN]; if (!strcmp(mode, "debug")) slots = obj->debug_slots; else if (!strcmp(mode, "skill")) slots = obj->skill_slots; else if (!strcmp(mode, "item")) slots = obj->item_slots; else return 0; int empty_i = find_empty_slot(obj, mode); if (empty_i == -1) return 0; strcpy(slots[empty_i], new_slot); return 1; }
Rfile rcreate(char *name,int mode) /* Create a file on ram-disk. */ { Temp_file *tpf; int flags; if ((flags = flags_for_mode(mode)) < Success) return(NULL); if ((tpf = find_named(name)) != NULL) if (rdelete(name) < Success) return(NULL); if ((tpf = find_empty_slot()) == NULL) return(NULL); strncpy(tpf->name, name, TFNAME_SIZE-1); tpf->flags = flags; tpf->omode = mode; return(tpf); }
channel_t channel_create(int cnt,int elem_size){ channel *c=NULL; int idx=0; channel_pool *pool=get_chan_pool(); idx=find_empty_slot(pool); if(idx<0){ return -1; } c=malloc(sizeof(channel) +(elem_size*cnt)); memset(c,0,sizeof(channel)); c->size=elem_size; c->cnt=cnt; c->id = idx; queue_init(&c->readq); queue_init(&c->writq); channel_pool_put(pool,idx,c); return idx; }
int tc_filter(frame_list_t *ptr_, char *options){ vframe_list_t * ptr = (vframe_list_t *)ptr_; int frame_slot = 0; static vob_t *vob=NULL; static int slots[TC_FRAME_THREADS_MAX]; if(ptr->tag & TC_FILTER_GET_CONFIG) { optstr_filter_desc (options, MOD_NAME, MOD_CAP, MOD_VERSION, "Julien Tierny", "VRYMO", "1"); optstr_param (options, "font", "Valid PSF font file (provided with the `aart` package)", "%s", "default8x9.psf"); optstr_param (options, "pallete", "Valid pallete file (provided with the `aart` package)", "%s", "colors.pal"); optstr_param(options, "threads", "Use multiple-threaded routine for picture rendering", "%d", "0", "1", "oo"); /* Boolean parameter */ optstr_param(options, "buffer", "Use `aart` internal buffer for output", "", "-1"); return 0; } //---------------------------------- // // filter init // //---------------------------------- if(ptr->tag & TC_FILTER_INIT) { if((vob = tc_get_vob())==NULL) return(-1); /* aart sanity check */ if (tc_test_program("aart") !=0 ) return -1; /* Now, let's handle the options ... */ if((parameters = tc_malloc (sizeof(parameter_struct))) == NULL){ tc_log_error(MOD_NAME, "Out of memory !!!"); return -1; } /* Filter default options */ if (verbose & TC_DEBUG) tc_log_info(MOD_NAME, "Preparing default options."); strncpy(parameters->aart_font, "default8x9.psf", strlen("default8x9.psf")); if (verbose & TC_DEBUG) tc_log_info(MOD_NAME, "Default options correctly formated."); strncpy(parameters->aart_pallete, "colors.pal", strlen("colors.pal")); parameters->aart_threads = 1; parameters->aart_buffer = -1; parameters->tcvhandle = 0; if (options){ /* Get filter options via transcode core */ if (verbose & TC_DEBUG) tc_log_info(MOD_NAME, "Merging options from transcode."); optstr_get(options, "font", "%s", parameters->aart_font); clean_parameter(parameters->aart_font); optstr_get(options, "pallete", "%s", parameters->aart_pallete); clean_parameter(parameters->aart_pallete); optstr_get(options, "threads", "%d", ¶meters->aart_threads); if (optstr_lookup(options, "buffer") != NULL) parameters->aart_buffer=1; if (optstr_lookup(options, "help") != NULL) help_optstr(); if (verbose & TC_DEBUG) tc_log_info(MOD_NAME, "Options correctly merged."); } if (vob->im_v_codec == CODEC_YUV){ if (!(parameters->tcvhandle = tcv_init())) { tc_log_error(MOD_NAME, "Error at image conversion initialization."); return(-1); } } /* Init thread slots (multithread support)*/ init_slots(slots); if(verbose) tc_log_info(MOD_NAME, "%s %s", MOD_VERSION, MOD_CAP); return(0); } //---------------------------------- // // filter close // //---------------------------------- if(ptr->tag & TC_FILTER_CLOSE) { /* * TODO : * Provide a `aart` kill routine in case of cancel. * For the moment, transcode waits for the `aart` * process to finish before exiting. */ tcv_free(parameters->tcvhandle); /* Let's free the parameter structure */ free(parameters); parameters = NULL; return(0); } //---------------------------------- // // filter frame routine // //---------------------------------- if(ptr->tag & TC_POST_M_PROCESS && ptr->tag & TC_VIDEO && !(ptr->attributes & TC_FRAME_IS_SKIPPED)) { frame_slot = find_empty_slot(ptr->id, slots); switch(vob->im_v_codec){ case CODEC_RGB: return aart_render(ptr->video_buf, ptr->v_width, ptr->v_height, frame_slot, parameters->aart_font, parameters->aart_pallete, parameters->aart_threads, parameters->aart_buffer); break; case CODEC_YUV: if (!tcv_convert(parameters->tcvhandle, ptr->video_buf, ptr->video_buf, ptr->v_width, ptr->v_height, IMG_YUV_DEFAULT, IMG_RGB24)){ tc_log_error(MOD_NAME, "cannot convert YUV stream to RGB format !"); return -1; } if (aart_render(ptr->video_buf, ptr->v_width, ptr->v_height, frame_slot, parameters->aart_font, parameters->aart_pallete, parameters->aart_threads, parameters->aart_buffer) == -1){return -1;} if (!tcv_convert(parameters->tcvhandle, ptr->video_buf, ptr->video_buf, ptr->v_width, ptr->v_height, IMG_RGB24, IMG_YUV_DEFAULT)){ tc_log_error(MOD_NAME, "cannot convert RGB stream to YUV format !"); return -1; } break; default: tc_log_error(MOD_NAME, "Internal video codec is not supported."); return -1; } free_slot(ptr->id, slots); } return(0); }