static int hp_open_control(int type, struct file *file) { /* hp_alloc assures that the region is filled with zero. */ struct hp_io_buffer *buf = hp_alloc(sizeof(struct hp_io_buffer)); buf->writebuf_size = sizeof(buf->write_buf); buf->write_cur = 0; buf->read_cur = 0; mutex_init(&buf->io_sem); /* The private data field is used in hp_read_control to handle several special devices in an interface. */ file->private_data = buf; switch(type) { case HP_DENTRY_KEY_NODECONF_IP: /* security/hp/ip_node */ buf->write = hp_nodeconf_ip_write; hp_nodeconf_ip_setup_readbuf(buf); break; case HP_DENTRY_KEY_NODECONF_PORT: /* security/hp/ip_port */ buf->write = hp_nodeconf_port_write; hp_nodeconf_port_setup_readbuf(buf); break; case HP_DENTRY_KEY_NODECONF_SELFCONF: buf->write = hp_nodeconf_selfconf; hp_nodeconf_port_setup_readbuf(buf); break; case HP_DENTRY_KEY_TTY_OUTPUT_ALL: buf->write = NULL; // hp_tty_output_all_setup_readbuf(buf); debug("tty_output/all is opened"); buf->read = hp_tty_output_all_read; break; case HP_DENTRY_KEY_TTY_OUTPUT_SETUP: /* security/hp/ setups security/hp/tty_output/ */ buf->write = NULL; hp_tty_output_prepare_output_files(); /* Dummy contents */ buf->read_buf = hp_alloc(1); buf->read_buf[0] = '0'; buf->readbuf_size = 1; break; default: break; } return 0; }
/*ARGSUSED*/ static int p_get_oracle3(value vfrom, type tfrom, value vto, type tto, value v, type t) { pword *b_aux; char *buf; int size; if (IsRef(tto)) { b_aux = B.args; while (!IsParallelFrame(BTop(b_aux))) b_aux = BPrev(b_aux); } else b_aux = vto.ptr; size = oracle_size(vfrom.ptr, b_aux); buf = (char *) hp_alloc(size); retrieve_oracle(buf, size, vfrom.ptr, b_aux); Return_Unify_Integer(v, t, (long) buf); }