__attribute__((noinline)) void fn0 (void) { pthread_cleanup_push (clh, (void *) 1l); fn_read (); pthread_cleanup_pop (1); }
/**************************************************************************** * * fn_getc * * get a character from file * * INPUTS * * filehandle - file where to read from * * RETURNS * * with the read character or -1 if read was not successfully * ***************************************************************************/ int fn_getc ( F_FILE * filehandle ) { unsigned char ch; if ( !fn_read( &ch, 1, 1, filehandle ) ) { return -1; } return (int)ch; }
static int fn(void *d) { struct l4fdx_client *client = d; int err; err = sys_setregid(client->gid, client->gid); err = sys_setreuid(client->uid, client->uid); err = sys_setsid(); if (client->capname) snprintf(current->comm, sizeof(current->comm), "l4xfdx-%s", client->capname); else snprintf(current->comm, sizeof(current->comm), "l4xfdx-%lx", client->cap >> L4_CAP_SHIFT); current->comm[sizeof(current->comm) - 1] = 0; set_user_nice(current, -20); while (!should_stop || !list_empty(&client->req_list)) { struct internal_request *r; wait_event_interruptible(client->event, !list_empty(&client->req_list) || should_stop); r = pop_request(client->srv_obj); switch (r->type) { case L4FS_REQ_OPEN: fn_open(client->srv_obj, r); break; case L4FS_REQ_READ: fn_read(client->srv_obj, r); break; case L4FS_REQ_WRITE: fn_write(client->srv_obj, r); break; case L4FS_REQ_CLOSE: fn_close(client->srv_obj, r); break; case L4FS_REQ_FSTAT64: fn_fstat64(client->srv_obj, r); break; default: pr_err("l4fdx: Invalid type=%d\n", r->type); break; } } return 0; }
/* ** fr_read ** ** Read from a file. ** ** INPUT : buf - buffer to read data ** size - number of unique ** size_st - size of unique ** *filehandle - pointer to file descriptor ** OUTPUT: number of read bytes */ long fr_read ( void * bbuf, long size, long size_st, F_FILE * filehandle ) { long rc; if( xSemaphoreTake( fs_lock_semaphore, F_MAX_LOCK_WAIT_TICKS ) == pdPASS ) { rc = fn_read( bbuf, size, size_st, filehandle ); xSemaphoreGive( fs_lock_semaphore ); } else { rc = 0; } return rc; }