FILE fs_open(FILE dir, const char *path) { //Set up a port to receive the result int portnum = get_free_port(); init_port(portnum, 128); open_port(portnum); //Have required memory on stack ipc_msg_hdr_t curr_msg; FILE result; result.handle = -1; char* cmd_buf = malloc(sizeof(char)+sizeof(fs_cmd_getfile_parm)+(strlen(path)+1)*sizeof(char)); *cmd_buf = FS_CMD_GETFILE; fs_cmd_getfile_parm* parm = (fs_cmd_getfile_parm*) (cmd_buf+1); parm->dir = dir; memcpy(parm->filename, path, strlen(path)+1); int res = send_to_port(IPC_PORT_FILESYSTEM, portnum, cmd_buf, sizeof(fs_cmd_getfile_parm)+(strlen(path)+2)*sizeof(char)); if(res==0) { while(get_ipc_message(portnum, &curr_msg, (char*)&result, sizeof(FILE))<0) yield_control_to_port(IPC_PORT_FILESYSTEM); } else print("Couldn't send to fs port\n"); free_port(portnum); free(parm); return result; }
void aadlbox_destroy(Aadlbox *aadlbox) { int i; text_destroy(aadlbox->name); /* object_unconnect needs valid handles (from ports) */ element_destroy(&aadlbox->element); for (i=0; i<aadlbox->num_ports; i++) free_port(aadlbox->ports[i]); }
static void aadlbox_change_free(struct PointChange *change) { if ( (change->type==TYPE_ADD_POINT && !change->applied) || (change->type==TYPE_REMOVE_POINT && change->applied) ) { free_port (change->port); change->port = NULL; } else if ( (change->type==TYPE_ADD_CONNECTION && !change->applied) || (change->type==TYPE_REMOVE_CONNECTION && change->applied) ) { g_free (change->connection); change->connection = NULL; } }
char getc() { int portnum = get_free_port(); init_port(portnum, 128); open_port(portnum); char cmd[1]; cmd[0] = 1; ipc_msg_hdr_t curr_msg; int res = send_to_port(IPC_PORT_KEYBOARD, portnum, (char*)cmd, 1); if(res==0) { while(get_ipc_message(portnum, &curr_msg, (char*)cmd, 1)<0) yield_control_to_port(IPC_PORT_KEYBOARD); } else { print("Couldn't send to keyboard port\n"); } free_port(portnum); return cmd[0]; }
/* parses the FreeBSD ports INDEX file and creates a list of categories with dedicated ports, it also creates a meta-category "all", all lists and categories are sorted ascending. */ int parse_index() { FILE *fd; int c, i, readyToken; int pipes = 0; char tok[MAX_TOKEN]; extern Config config; extern List *lprts; extern List *lcats; extern void *exists; extern TNode *tcat; TNode *tdirs; TNode *tprt = NULL; List *lpdir = (List *)malloc(sizeof(List)); Port *p, *dprt; int num_of_inst_ports = 0; /* init */ p = NULL; tcat = NULL; lpdir->num_of_items = 0; lpdir->head = NULL; lpdir->tail = NULL; if ((fd = fopen(config.index_file, "r")) == NULL) return ERROR_OPEN_INDEX; /* error */ /* parse installed pkgs */ tdirs = parse_dir(config.inst_pkg_dir); /* parse ports dir and create list */ create_inorder_list(lpdir, parse_dir(config.ports_dir)); i = 0; readyToken = 0; /* token not ready */ while (feof(fd) == 0) { c = fgetc(fd); /* get next char */ switch (c) { case '|': /* next token */ readyToken = 1; /* ready token */ break; case '\n': /* end of port */ #if defined(__FreeBSD__) if (pipes != PORT_URL) /* seems to be some strange INDEX */ return ERROR_CORRUPT_INDEX; #endif readyToken = 1; /* tail token of port ready */ break; default: if ((pipes != PORT_CATEGORY) && (pipes != PORT_BUILD_DEPENDENCY) && (pipes != PORT_RUN_DEPENDENCY)) /* default, no port category, build dep or run dep modus */ tok[i++] = (char)c; break; } /* to speed up the parsing, we also parse categories here, I guessed if it'll be senseful to also parse BDEP and RDEP, but this makes no sense until there aren't all entries scanned */ if (pipes == PORT_CATEGORY) { /* port category mode */ if ((c == ' ') || (c == '|')) { if (i > 0) { /* maybe there're ports without a category */ tok[i] = '\0'; /* terminate current cat token */ add_list_item(p->lcats, add_category(tok, lpdir)); i = 0; /* reset i */ } } else { /* inside a token */ tok[i++] = (char)c; } } else if ((pipes == PORT_BUILD_DEPENDENCY) || (pipes == PORT_RUN_DEPENDENCY)) { /* port build/run dep mode */ if ((c == ' ') || (c == '|')) { if (i > 0) { /* maybe there're ports without a build dep */ tok[i] = '\0'; dprt = create_port(tok, tdirs); exists = NULL; tprt = add_tree_item(tprt, dprt, cmp_name); if (exists != NULL) { free_port(dprt); dprt = (Port *)((TNode *)exists)->item; } else { if (dprt->state >= STATE_INSTALLED) num_of_inst_ports++; } if (pipes == PORT_BUILD_DEPENDENCY) { add_list_item(p->lbdep, dprt); } else if (pipes == PORT_RUN_DEPENDENCY) { add_list_item(p->lrdep, dprt); } /* add also p to dprt->ldep, so that dprt knows the port for which dprt is a dependency, this helps seeking for unused ports */ add_list_item(dprt->ldep, p); i = 0; /* reset i */ } } else { /* inside a token */ tok[i++] = (char)c; } } if (readyToken == 1) { /* a new token is ready */ tok[i] = '\0'; /* terminate current token */ switch (pipes) { case PORT_NAME_VERSION: p = create_port(tok, tdirs); /* add the port */ exists = NULL; tprt = add_tree_item(tprt, p, cmp_name); if (exists != NULL) { free_port(p); p = (Port *)((TNode *)exists)->item; } else { if (p->state >= STATE_INSTALLED) num_of_inst_ports++; } break; case PORT_PATH: p->path = strdup(tok); break; #if defined(__FreeBSD__) case PORT_INSTALL_PREFIX: p->instpfx = strdup(tok); break; #endif case PORT_DESCR: p->descr = strdup(tok); break; case PORT_PKGDESCR: p->pathpkgdesc = strdup(tok); break; case PORT_MAINTAINER: p->maintainer = strdup(tok); break; #if defined(__FreeBSD__) case PORT_URL: p->url = strdup(tok); pipes = -1; break; #endif } readyToken = i = 0; /* token processed, not ready token anymore */ pipes++; } } fclose(fd); /* close INDEX file */ create_inorder_list(lcats, tcat); create_inorder_list(lprts, tprt); create_categories(num_of_inst_ports); free_tree(tdirs); /* finished */ return (0); }