static int add_ocb(devi_attr_t *attr, RESMGR_OCB_T *ocb) { struct _ocb_list *op; if (attr->ocb_list == NULL) { attr->ocb_list = malloc(sizeof(struct _ocb_list)); if (attr->ocb_list == NULL) { errno_print("malloc"); return (-1); } attr->ocb_list->ocb = ocb; attr->ocb_list->next = NULL; attr->ocb_list->prev = NULL; } else { for (op = attr->ocb_list; op->next != NULL; op = op->next) ; op->next = malloc(sizeof(struct _ocb_list)); if (op->next == NULL) { errno_print("malloc"); return (-1); } op->next->ocb = ocb; op->next->prev = op; op->next->next = NULL; } return (0); }
static int add_wait_queue(devi_attr_t *attr, devi_ocb_t *ocb, resmgr_context_t *ctp, int nbytes) { struct _wait_q *wp, *p; wp = malloc(sizeof(struct _wait_q)); if (wp == NULL) { errno_print("malloc"); return (-1); } wp->ocb = ocb; wp->rcvid = ctp->rcvid; wp->nbytes = nbytes; wp->next = wp->prev = NULL; if (attr->wait_queue == NULL) attr->wait_queue = wp; else { for (p = attr->wait_queue; p->next != NULL; p = p->next) ; p->next = wp; wp->prev = p; } return (0); }
int main(int argc, char **argv) { #if 0 { //system("cat /proc/self/status"); int i; for (i = 0; i < argc; i++) printf("*%s* ", argv[i]); printf("\n"); } #endif if (argc < 2) { usage(); return 1; } char *quiet = getenv("FIREJAIL_QUIET"); if (quiet && strcmp(quiet, "yes") == 0) arg_quiet = 1; if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") ==0) { usage(); return 0; } else if (argc == 2 && strcmp(argv[1], "debug-syscalls") == 0) syscall_print(); else if (argc == 2 && strcmp(argv[1], "debug-errnos") == 0) errno_print(); else if (argc == 2 && strcmp(argv[1], "debug-protocols") == 0) protocol_print(); else if (argc == 5 && strcmp(argv[1], "protocol") == 0 && strcmp(argv[2], "build") == 0) protocol_build_filter(argv[3], argv[4]); else if (argc == 4 && strcmp(argv[1], "secondary") == 0 && strcmp(argv[2], "32") == 0) seccomp_secondary_32(argv[3]); else if (argc == 4 && strcmp(argv[1], "secondary") == 0 && strcmp(argv[2], "block") == 0) seccomp_secondary_block(argv[3]); else if (argc == 3 && strcmp(argv[1], "default") == 0) seccomp_default(argv[2], 0); else if (argc == 4 && strcmp(argv[1], "default") == 0 && strcmp(argv[3], "allow-debuggers") == 0) seccomp_default(argv[2], 1); else if (argc == 5 && strcmp(argv[1], "drop") == 0) seccomp_drop(argv[2], argv[3], argv[4], 0); else if (argc == 6 && strcmp(argv[1], "drop") == 0 && strcmp(argv[5], "allow-debuggers") == 0) seccomp_drop(argv[2], argv[3], argv[4], 1); else if (argc == 6 && strcmp(argv[1], "default") == 0 && strcmp(argv[2], "drop") == 0) seccomp_default_drop(argv[3], argv[4], argv[5], 0); else if (argc == 7 && strcmp(argv[1], "default") == 0 && strcmp(argv[2], "drop") == 0 && strcmp(argv[6], "allow-debuggers") == 0) seccomp_default_drop(argv[3], argv[4], argv[5], 1); else if (argc == 5 && strcmp(argv[1], "keep") == 0) seccomp_keep(argv[2], argv[3], argv[4]); else if (argc == 3 && strcmp(argv[1], "memory-deny-write-execute") == 0) memory_deny_write_execute(argv[2]); else { fprintf(stderr, "Error fseccomp: invalid arguments\n"); return 1; } return 0; }
int main(int argc, char **argv) { #if 0 { //system("cat /proc/self/status"); int i; for (i = 0; i < argc; i++) printf("*%s* ", argv[i]); printf("\n"); } #endif if (argc < 2) { usage(); return 1; } if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") ==0) { usage(); return 0; } else if (argc == 2 && strcmp(argv[1], "debug-syscalls") == 0) syscall_print(); else if (argc == 2 && strcmp(argv[1], "debug-errnos") == 0) errno_print(); else if (argc == 2 && strcmp(argv[1], "debug-protocols") == 0) protocol_print(); else if (argc == 5 && strcmp(argv[1], "protocol") == 0 && strcmp(argv[2], "build") == 0) protocol_build_filter(argv[3], argv[4]); else if (argc == 4 && strcmp(argv[1], "secondary") == 0 && strcmp(argv[2], "64") == 0) seccomp_secondary_64(argv[3]); else if (argc == 4 && strcmp(argv[1], "secondary") == 0 && strcmp(argv[2], "32") == 0) seccomp_secondary_32(argv[3]); else if (argc == 3 && strcmp(argv[1], "default") == 0) seccomp_default(argv[2], 0); else if (argc == 4 && strcmp(argv[1], "default") == 0 && strcmp(argv[3], "allow-debuggers") == 0) seccomp_default(argv[2], 1); else if (argc == 4 && strcmp(argv[1], "drop") == 0) seccomp_drop(argv[2], argv[3], 0); else if (argc == 5 && strcmp(argv[1], "drop") == 0 && strcmp(argv[4], "allow-debuggers") == 0) seccomp_drop(argv[2], argv[3], 1); else if (argc == 5 && strcmp(argv[1], "default") == 0 && strcmp(argv[2], "drop") == 0) seccomp_default_drop(argv[3], argv[4], 0); else if (argc == 6 && strcmp(argv[1], "default") == 0 && strcmp(argv[2], "drop") == 0 && strcmp(argv[5], "allow-debuggers") == 0) seccomp_default_drop(argv[3], argv[4], 1); else if (argc == 4 && strcmp(argv[1], "keep") == 0) seccomp_keep(argv[2], argv[3]); else if (argc == 3 && strcmp(argv[1], "print") == 0) filter_print(argv[2]); else { fprintf(stderr, "Error fseccomp: invalid arguments\n"); return 1; } return 0; }
int write_lwvm(FILE *img_f, struct _LwVM *LwVM) { printf("Writing new LwVM table.\n"); fseek(img_f, 0L, SEEK_SET); if (fwrite(LwVM, 1, sizeof(*LwVM), img_f) != 4096) { printf("Write failed.\n"); errno_print(); cleanup(img_f, LwVM); return 1; } return 0; }
bool SimpleV4L2::startCapturing() { unsigned int i; enum v4l2_buf_type type; m_startedCapturing = false; switch (m_io) { case IO_METHOD_READ: /* Nothing to do. */ break; case IO_METHOD_MMAP: for (i = 0; i < m_numBuffers; ++i) { struct v4l2_buffer buf; CLEAR (buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; if (-1 == xioctl (m_fd, VIDIOC_QBUF, &buf)) errno_exit ("VIDIOC_QBUF"); } type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (-1 == xioctl (m_fd, VIDIOC_STREAMON, &type)) { errno_print ("VIDIOC_STREAMON"); return false; } break; case IO_METHOD_USERPTR: for (i = 0; i < m_numBuffers; ++i) { struct v4l2_buffer buf; CLEAR (buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_USERPTR; buf.index = i; buf.m.userptr = (unsigned long) m_buffers[i].start; buf.length = m_buffers[i].length; if (-1 == xioctl (m_fd, VIDIOC_QBUF, &buf)) errno_exit ("VIDIOC_QBUF"); } type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (-1 == xioctl (m_fd, VIDIOC_STREAMON, &type)) { errno_print ("VIDIOC_STREAMON"); return false; } break; } m_startedCapturing = true; return true; }
int main(int argc, const char *argv[]) { if (argc < 2) { help(argv[0]); return 1; } int fn_arg = 0; const char *map_fn_arg = 0; int action = 0; int i; for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { help(argv[0]); return 0; } else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) { version(); return 0; } else if (!strcmp(argv[i], "-l") || !strcmp(argv[i], "--list")) { action = A_LIST; } else if (!strcmp(argv[i], "-E") || !strcmp(argv[i], "--ignore-errors")) { ignore_errors = true; } else if (!strcmp(argv[i], "-H") || !strcmp(argv[i], "--human-readable")) { human_readable = true; } else if (!strcmp(argv[i], "-e") || !strcmp(argv[i], "--edit")) { action = A_EDIT; } else if (!strcmp(argv[i], "-f")) { i++; map_fn_arg = argv[i]; } else if (!strncmp(argv[i], "--from-file=", 12)) { map_fn_arg = argv[i] + 12; } else if (argv[i][0] != '-') { fn_arg = i; } else { printf("Unknown argument: %s\n", argv[i]); help(argv[0]); return 1; } } if (action == 0 && map_fn_arg == 0) { help(argv[0]); return 1; } FILE *img_f = fopen(argv[fn_arg], "r+b"); if (img_f == 0) { printf("Can't open file: %s\n", argv[fn_arg]); errno_print(); return 1; } struct _LwVM *LwVM = malloc(sizeof(*LwVM)); fseek(img_f, 0L, SEEK_SET); if (fread(LwVM, 1, sizeof(*LwVM), img_f) != 4096) { printf("Can't read file: %s\n", argv[fn_arg]); errno_print(); cleanup(img_f, LwVM); return 1; } bool pt_no_crc = !memcmp(LwVM->type, LwVMType_noCRC, sizeof(*LwVMType_noCRC)); if (memcmp(LwVM->type, LwVMType, sizeof(*LwVMType)) != 0 && !pt_no_crc) { printf("LwVM has unknown type or was damaged, "); if (ignore_errors) printf("continuing anyway...\n"); else { printf("exiting...\n"); cleanup(img_f, LwVM); return 1; } } if (map_fn_arg) { struct stat st; if (stat(map_fn_arg, &st) != 0) { printf("Can't stat file: %s\n", map_fn_arg); errno_print(); cleanup(img_f, LwVM); return 1; } FILE *map_f = fopen(map_fn_arg, "r"); if (map_f == 0) { printf("Can't open map: %s\n", map_fn_arg); errno_print(); cleanup(img_f, LwVM); return 1; } char *map = malloc(st.st_size); if (fread(map, 1, st.st_size, map_f) != st.st_size) { printf("Can't read map: %s\n", map_fn_arg); errno_print(); cleanup(img_f, LwVM); fclose(map_f); return 1; } fclose(map_f); int map_load_status = load_map(LwVM, map); if (map_load_status) { printf("Map parse failed.\n"); cleanup(img_f, LwVM); return 1; } printf("Map load success.\n"); write_lwvm(img_f, LwVM); cleanup(img_f, LwVM); return 0; } if (action == A_LIST) { print_pt(LwVM, pt_no_crc); } else if (action == A_EDIT) { int status = edit_pt(LwVM, pt_no_crc); if (status == SAVE_CHANGES) { return write_lwvm(img_f, LwVM); } } cleanup(img_f, LwVM); return 0; }
int resmgr_create_device(event_bus_line_t *line) { devi_attr_t *attr; resmgr_attr_t res_attr; static resmgr_connect_funcs_t connect_funcs; static resmgr_io_funcs_t io_funcs; static int once = 0; int i; char name[48]; char path[_POSIX_PATH_MAX]; int id; dev_t d; if ((attr = malloc(sizeof(devi_attr_t))) == NULL) { errno_print("malloc"); return (-1); } if (!once) { iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs, _RESMGR_IO_NFUNCS, &io_funcs); connect_funcs.open = devi_open; io_funcs.devctl = devi_devctl; io_funcs.read = devi_read; io_funcs.close_ocb = devi_close; io_funcs.unblock = devi_unblock; io_funcs.notify = devi_notify; once = 1; } iofunc_attr_init(&attr->attr, 0666 | S_IFCHR, NULL, NULL); attr->flags = line->type; attr->ocb_list = NULL; line->attr = attr; switch (attr->flags) { case DEVI_CLASS_KBD: strcpy(name, "keyboard"); break; case DEVI_CLASS_REL: strcpy(name, "mouse"); break; case DEVI_CLASS_ABS: strcpy(name, "touch"); break; } attr->line = line; memset(&res_attr, 0, sizeof(res_attr)); res_attr.msg_max_size = 2048; res_attr.nparts_max = 3; for (i = 0; i < 10; i++) { sprintf(path, DEVICE_NAME, name, i); if (access(path, F_OK) != 0) break; } if (i == 10) { char * pMsgTxt = "Error: unable to create device %s\n"; fprintf(stderr, pMsgTxt, path); slogf(_SLOG_SETCODE(_SLOGC_INPUT, 0), _SLOG_ERROR, pMsgTxt, path); free(attr); return (-1); } id = resmgr_attach(devi_get_dispatch_handle(), &res_attr, path, _FTYPE_ANY, 0, &connect_funcs, &io_funcs, (void *) &attr->attr); if (id < 0) { char * pMsgTxt = "Error: could not attach resource manager\n"; fprintf(stderr, pMsgTxt); slogf(_SLOG_SETCODE(_SLOGC_INPUT, 0), _SLOG_ERROR, pMsgTxt); free(attr); return (-1); } attr->attr.rdev = rsrcdbmgr_devno_attach(name, -1, 0); resmgr_devino(id, &d, &attr->attr.inode); return (0); }
int begin(int argc, char *argv[]) { int i, j; uint32_t ph_flags = 0; thread_pool_attr_t tp_attr; static void *tpp; dispatch_t *dpp; dpp = dispatch_create(); if (dpp == NULL) { char * pMsgTxt = "Error: cannot create dispatch interface\n"; fprintf(stderr, pMsgTxt); slogf(_SLOG_SETCODE(_SLOGC_INPUT, 0), _SLOG_ERROR, pMsgTxt); return (EXIT_FAILURE); } devi_set_dispatch_handle(dpp); /* set up the module table */ if (modules != NULL) { for (i = 0; i < MODULE_TABLE_SIZE && ModuleTable[i] != NULL; i++) ; /* add extra modules to end of ModuleTable */ for (j = 0; j < (MODULE_TABLE_SIZE - i) && modules[j] != NULL; j++, i++) ModuleTable[i] = modules[j]; } if(ThreadCtl(_NTO_TCTL_IO, 0) == -1) { errno_print("ThreadCtl"); return (EXIT_FAILURE); } // Call global callback if it was specified if(commonCallbacks.pre_init && commonCallbacks.pre_init()) return (EXIT_FAILURE); if (options(argc, argv, &ph_flags, &OptFlags) < 0) return (EXIT_FAILURE); // Call global callback if it was specified if(commonCallbacks.post_init && commonCallbacks.post_init()) return (EXIT_FAILURE); sig_install(signal_table, termination_hndlr); if (procmgr_daemon(0, PROCMGR_DAEMON_NODEVNULL | PROCMGR_DAEMON_NOCLOSE) < 0) { errno_print("procmgr_daemon"); return (EXIT_FAILURE); } if (!(OptFlags & OPT_NO_PHOTON)) { if (start_photon_interface(ph_flags) < 0) { errno_print("unable to start photon interface"); return (EXIT_FAILURE); } } memset(&tp_attr, 0, sizeof(tp_attr)); tp_attr.handle = devi_get_dispatch_handle(); tp_attr.context_alloc = dispatch_context_alloc; tp_attr.block_func = dispatch_block; tp_attr.handler_func = dispatch_handler; tp_attr.context_free = dispatch_context_free; /* We'd rather not to use thread pool for device driver - it could cause desynchronizing and data losing */ tp_attr.lo_water = 1; /* min amount threads waiting blocked */ tp_attr.hi_water = 1; /* max amount threads waiting blocked */ tp_attr.increment = 1; tp_attr.maximum = 1; tpp = thread_pool_create(&tp_attr, POOL_FLAG_USE_SELF); if (tpp == NULL) { errno_print("thread_pool_create"); return (EXIT_FAILURE); } thread_pool_start(tpp); return (EOK); }