Lines Matching refs:head
211 static bool tomoyo_flush(struct tomoyo_io_buffer *head) in tomoyo_flush() argument
213 while (head->r.w_pos) { in tomoyo_flush()
214 const char *w = head->r.w[0]; in tomoyo_flush()
217 if (len > head->read_user_buf_avail) in tomoyo_flush()
218 len = head->read_user_buf_avail; in tomoyo_flush()
221 if (copy_to_user(head->read_user_buf, w, len)) in tomoyo_flush()
223 head->read_user_buf_avail -= len; in tomoyo_flush()
224 head->read_user_buf += len; in tomoyo_flush()
227 head->r.w[0] = w; in tomoyo_flush()
231 if (head->poll) { in tomoyo_flush()
232 if (!head->read_user_buf_avail || in tomoyo_flush()
233 copy_to_user(head->read_user_buf, "", 1)) in tomoyo_flush()
235 head->read_user_buf_avail--; in tomoyo_flush()
236 head->read_user_buf++; in tomoyo_flush()
238 head->r.w_pos--; in tomoyo_flush()
239 for (len = 0; len < head->r.w_pos; len++) in tomoyo_flush()
240 head->r.w[len] = head->r.w[len + 1]; in tomoyo_flush()
242 head->r.avail = 0; in tomoyo_flush()
256 static void tomoyo_set_string(struct tomoyo_io_buffer *head, const char *string) in tomoyo_set_string() argument
258 if (head->r.w_pos < TOMOYO_MAX_IO_READ_QUEUE) { in tomoyo_set_string()
259 head->r.w[head->r.w_pos++] = string; in tomoyo_set_string()
260 tomoyo_flush(head); in tomoyo_set_string()
265 static void tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt,
274 static void tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt, in tomoyo_io_printf() argument
279 size_t pos = head->r.avail; in tomoyo_io_printf()
280 int size = head->readbuf_size - pos; in tomoyo_io_printf()
284 len = vsnprintf(head->read_buf + pos, size, fmt, args) + 1; in tomoyo_io_printf()
286 if (pos + len >= head->readbuf_size) { in tomoyo_io_printf()
290 head->r.avail += len; in tomoyo_io_printf()
291 tomoyo_set_string(head, head->read_buf + pos); in tomoyo_io_printf()
301 static void tomoyo_set_space(struct tomoyo_io_buffer *head) in tomoyo_set_space() argument
303 tomoyo_set_string(head, " "); in tomoyo_set_space()
313 static bool tomoyo_set_lf(struct tomoyo_io_buffer *head) in tomoyo_set_lf() argument
315 tomoyo_set_string(head, "\n"); in tomoyo_set_lf()
316 return !head->r.w_pos; in tomoyo_set_lf()
326 static void tomoyo_set_slash(struct tomoyo_io_buffer *head) in tomoyo_set_slash() argument
328 tomoyo_set_string(head, "/"); in tomoyo_set_slash()
364 static void tomoyo_print_namespace(struct tomoyo_io_buffer *head) in tomoyo_print_namespace() argument
368 tomoyo_set_string(head, in tomoyo_print_namespace()
369 container_of(head->r.ns, in tomoyo_print_namespace()
372 tomoyo_set_space(head); in tomoyo_print_namespace()
381 static void tomoyo_print_name_union(struct tomoyo_io_buffer *head, in tomoyo_print_name_union() argument
384 tomoyo_set_space(head); in tomoyo_print_name_union()
386 tomoyo_set_string(head, "@"); in tomoyo_print_name_union()
387 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_name_union()
389 tomoyo_set_string(head, ptr->filename->name); in tomoyo_print_name_union()
401 static void tomoyo_print_name_union_quoted(struct tomoyo_io_buffer *head, in tomoyo_print_name_union_quoted() argument
405 tomoyo_set_string(head, "@"); in tomoyo_print_name_union_quoted()
406 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_name_union_quoted()
408 tomoyo_set_string(head, "\""); in tomoyo_print_name_union_quoted()
409 tomoyo_set_string(head, ptr->filename->name); in tomoyo_print_name_union_quoted()
410 tomoyo_set_string(head, "\""); in tomoyo_print_name_union_quoted()
423 (struct tomoyo_io_buffer *head, const struct tomoyo_number_union *ptr) in tomoyo_print_number_union_nospace() argument
426 tomoyo_set_string(head, "@"); in tomoyo_print_number_union_nospace()
427 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_number_union_nospace()
457 tomoyo_io_printf(head, "%s", buffer); in tomoyo_print_number_union_nospace()
469 static void tomoyo_print_number_union(struct tomoyo_io_buffer *head, in tomoyo_print_number_union() argument
472 tomoyo_set_space(head); in tomoyo_print_number_union()
473 tomoyo_print_number_union_nospace(head, ptr); in tomoyo_print_number_union()
660 static int tomoyo_write_profile(struct tomoyo_io_buffer *head) in tomoyo_write_profile() argument
662 char *data = head->write_buf; in tomoyo_write_profile()
666 if (sscanf(data, "PROFILE_VERSION=%u", &head->w.ns->profile_version) in tomoyo_write_profile()
673 profile = tomoyo_assign_profile(head->w.ns, i); in tomoyo_write_profile()
713 static void tomoyo_print_config(struct tomoyo_io_buffer *head, const u8 config) in tomoyo_print_config() argument
715 tomoyo_io_printf(head, "={ mode=%s grant_log=%s reject_log=%s }\n", in tomoyo_print_config()
728 static void tomoyo_read_profile(struct tomoyo_io_buffer *head) in tomoyo_read_profile() argument
732 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_profile()
734 if (head->r.eof) in tomoyo_read_profile()
737 index = head->r.index; in tomoyo_read_profile()
739 switch (head->r.step) { in tomoyo_read_profile()
741 tomoyo_print_namespace(head); in tomoyo_read_profile()
742 tomoyo_io_printf(head, "PROFILE_VERSION=%u\n", in tomoyo_read_profile()
744 head->r.step++; in tomoyo_read_profile()
747 for ( ; head->r.index < TOMOYO_MAX_PROFILES; in tomoyo_read_profile()
748 head->r.index++) in tomoyo_read_profile()
749 if (ns->profile_ptr[head->r.index]) in tomoyo_read_profile()
751 if (head->r.index == TOMOYO_MAX_PROFILES) { in tomoyo_read_profile()
752 head->r.eof = true; in tomoyo_read_profile()
755 head->r.step++; in tomoyo_read_profile()
762 tomoyo_print_namespace(head); in tomoyo_read_profile()
763 tomoyo_io_printf(head, "%u-COMMENT=", index); in tomoyo_read_profile()
764 tomoyo_set_string(head, comment ? comment->name : ""); in tomoyo_read_profile()
765 tomoyo_set_lf(head); in tomoyo_read_profile()
766 tomoyo_print_namespace(head); in tomoyo_read_profile()
767 tomoyo_io_printf(head, "%u-PREFERENCE={ ", index); in tomoyo_read_profile()
769 tomoyo_io_printf(head, "%s=%u ", in tomoyo_read_profile()
772 tomoyo_set_string(head, "}\n"); in tomoyo_read_profile()
773 head->r.step++; in tomoyo_read_profile()
778 tomoyo_print_namespace(head); in tomoyo_read_profile()
779 tomoyo_io_printf(head, "%u-%s", index, "CONFIG"); in tomoyo_read_profile()
780 tomoyo_print_config(head, profile->default_config); in tomoyo_read_profile()
781 head->r.bit = 0; in tomoyo_read_profile()
782 head->r.step++; in tomoyo_read_profile()
786 for ( ; head->r.bit < TOMOYO_MAX_MAC_INDEX in tomoyo_read_profile()
787 + TOMOYO_MAX_MAC_CATEGORY_INDEX; head->r.bit++) { in tomoyo_read_profile()
788 const u8 i = head->r.bit; in tomoyo_read_profile()
792 tomoyo_print_namespace(head); in tomoyo_read_profile()
794 tomoyo_io_printf(head, "%u-CONFIG::%s::%s", in tomoyo_read_profile()
800 tomoyo_io_printf(head, "%u-CONFIG::%s", index, in tomoyo_read_profile()
802 tomoyo_print_config(head, config); in tomoyo_read_profile()
803 head->r.bit++; in tomoyo_read_profile()
806 if (head->r.bit == TOMOYO_MAX_MAC_INDEX in tomoyo_read_profile()
808 head->r.index++; in tomoyo_read_profile()
809 head->r.step = 1; in tomoyo_read_profile()
813 if (tomoyo_flush(head)) in tomoyo_read_profile()
828 return container_of(a, struct tomoyo_manager, head)->manager == in tomoyo_same_manager()
829 container_of(b, struct tomoyo_manager, head)->manager; in tomoyo_same_manager()
863 error = tomoyo_update_policy(&e.head, sizeof(e), ¶m, in tomoyo_update_manager_entry()
879 static int tomoyo_write_manager(struct tomoyo_io_buffer *head) in tomoyo_write_manager() argument
881 char *data = head->write_buf; in tomoyo_write_manager()
884 tomoyo_manage_by_non_root = !head->w.is_delete; in tomoyo_write_manager()
887 return tomoyo_update_manager_entry(data, head->w.is_delete); in tomoyo_write_manager()
897 static void tomoyo_read_manager(struct tomoyo_io_buffer *head) in tomoyo_read_manager() argument
899 if (head->r.eof) in tomoyo_read_manager()
901 list_for_each_cookie(head->r.acl, &tomoyo_kernel_namespace. in tomoyo_read_manager()
904 list_entry(head->r.acl, typeof(*ptr), head.list); in tomoyo_read_manager()
905 if (ptr->head.is_deleted) in tomoyo_read_manager()
907 if (!tomoyo_flush(head)) in tomoyo_read_manager()
909 tomoyo_set_string(head, ptr->manager->name); in tomoyo_read_manager()
910 tomoyo_set_lf(head); in tomoyo_read_manager()
912 head->r.eof = true; in tomoyo_read_manager()
936 policy_list[TOMOYO_ID_MANAGER], head.list) { in tomoyo_manager()
937 if (!ptr->head.is_deleted && ptr->is_domain in tomoyo_manager()
949 policy_list[TOMOYO_ID_MANAGER], head.list) { in tomoyo_manager()
950 if (!ptr->head.is_deleted && !ptr->is_domain in tomoyo_manager()
982 static bool tomoyo_select_domain(struct tomoyo_io_buffer *head, in tomoyo_select_domain() argument
1009 head->w.domain = domain; in tomoyo_select_domain()
1011 if (!head->read_buf) in tomoyo_select_domain()
1013 memset(&head->r, 0, sizeof(head->r)); in tomoyo_select_domain()
1014 head->r.print_this_domain_only = true; in tomoyo_select_domain()
1016 head->r.domain = &domain->list; in tomoyo_select_domain()
1018 head->r.eof = 1; in tomoyo_select_domain()
1019 tomoyo_io_printf(head, "# select %s\n", data); in tomoyo_select_domain()
1021 tomoyo_io_printf(head, "# This is a deleted domain.\n"); in tomoyo_select_domain()
1036 const struct tomoyo_task_acl *p1 = container_of(a, typeof(*p1), head); in tomoyo_same_task_acl()
1037 const struct tomoyo_task_acl *p2 = container_of(b, typeof(*p2), head); in tomoyo_same_task_acl()
1055 .head.type = TOMOYO_TYPE_MANUAL_TASK_ACL, in tomoyo_write_task()
1059 error = tomoyo_update_domain(&e.head, sizeof(e), param, in tomoyo_write_task()
1158 static int tomoyo_write_domain(struct tomoyo_io_buffer *head) in tomoyo_write_domain() argument
1160 char *data = head->write_buf; in tomoyo_write_domain()
1162 struct tomoyo_domain_info *domain = head->w.domain; in tomoyo_write_domain()
1163 const bool is_delete = head->w.is_delete; in tomoyo_write_domain()
1175 head->w.domain = domain; in tomoyo_write_domain()
1212 static bool tomoyo_print_condition(struct tomoyo_io_buffer *head, in tomoyo_print_condition() argument
1215 switch (head->r.cond_step) { in tomoyo_print_condition()
1217 head->r.cond_index = 0; in tomoyo_print_condition()
1218 head->r.cond_step++; in tomoyo_print_condition()
1220 tomoyo_set_space(head); in tomoyo_print_condition()
1221 tomoyo_set_string(head, cond->transit->name); in tomoyo_print_condition()
1239 for (skip = 0; skip < head->r.cond_index; skip++) { in tomoyo_print_condition()
1263 while (head->r.cond_index < condc) { in tomoyo_print_condition()
1267 if (!tomoyo_flush(head)) in tomoyo_print_condition()
1270 head->r.cond_index++; in tomoyo_print_condition()
1271 tomoyo_set_space(head); in tomoyo_print_condition()
1274 tomoyo_io_printf(head, in tomoyo_print_condition()
1278 tomoyo_set_string(head, in tomoyo_print_condition()
1280 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1284 tomoyo_set_string(head, in tomoyo_print_condition()
1286 tomoyo_set_string(head, in tomoyo_print_condition()
1288 tomoyo_io_printf(head, "\"]%s=", envp-> in tomoyo_print_condition()
1291 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1292 tomoyo_set_string(head, envp-> in tomoyo_print_condition()
1294 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1296 tomoyo_set_string(head, in tomoyo_print_condition()
1303 (head, numbers_p++); in tomoyo_print_condition()
1306 tomoyo_set_string(head, in tomoyo_print_condition()
1310 tomoyo_set_string(head, match ? "=" : "!="); in tomoyo_print_condition()
1314 (head, names_p++); in tomoyo_print_condition()
1318 (head, numbers_p++); in tomoyo_print_condition()
1321 tomoyo_set_string(head, in tomoyo_print_condition()
1327 head->r.cond_step++; in tomoyo_print_condition()
1330 if (!tomoyo_flush(head)) in tomoyo_print_condition()
1332 head->r.cond_step++; in tomoyo_print_condition()
1336 tomoyo_io_printf(head, " grant_log=%s", in tomoyo_print_condition()
1339 tomoyo_set_lf(head); in tomoyo_print_condition()
1353 static void tomoyo_set_group(struct tomoyo_io_buffer *head, in tomoyo_set_group() argument
1356 if (head->type == TOMOYO_EXCEPTIONPOLICY) { in tomoyo_set_group()
1357 tomoyo_print_namespace(head); in tomoyo_set_group()
1358 tomoyo_io_printf(head, "acl_group %u ", in tomoyo_set_group()
1359 head->r.acl_group_index); in tomoyo_set_group()
1361 tomoyo_set_string(head, category); in tomoyo_set_group()
1372 static bool tomoyo_print_entry(struct tomoyo_io_buffer *head, in tomoyo_print_entry() argument
1379 if (head->r.print_cond_part) in tomoyo_print_entry()
1383 if (!tomoyo_flush(head)) in tomoyo_print_entry()
1387 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1392 if (head->r.print_transition_related_only && in tomoyo_print_entry()
1396 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1399 tomoyo_set_slash(head); in tomoyo_print_entry()
1401 tomoyo_set_string(head, tomoyo_path_keyword[bit]); in tomoyo_print_entry()
1405 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1408 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1409 tomoyo_set_group(head, "task "); in tomoyo_print_entry()
1410 tomoyo_set_string(head, "manual_domain_transition "); in tomoyo_print_entry()
1411 tomoyo_set_string(head, ptr->domainname->name); in tomoyo_print_entry()
1412 } else if (head->r.print_transition_related_only) { in tomoyo_print_entry()
1416 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1422 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1425 tomoyo_set_slash(head); in tomoyo_print_entry()
1427 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1432 tomoyo_print_name_union(head, &ptr->name1); in tomoyo_print_entry()
1433 tomoyo_print_name_union(head, &ptr->name2); in tomoyo_print_entry()
1436 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1442 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1445 tomoyo_set_slash(head); in tomoyo_print_entry()
1447 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1452 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1453 tomoyo_print_number_union(head, &ptr->number); in tomoyo_print_entry()
1456 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1462 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1465 tomoyo_set_slash(head); in tomoyo_print_entry()
1467 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1472 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1473 tomoyo_print_number_union(head, &ptr->mode); in tomoyo_print_entry()
1474 tomoyo_print_number_union(head, &ptr->major); in tomoyo_print_entry()
1475 tomoyo_print_number_union(head, &ptr->minor); in tomoyo_print_entry()
1478 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1485 tomoyo_set_group(head, "network inet "); in tomoyo_print_entry()
1486 tomoyo_set_string(head, tomoyo_proto_keyword in tomoyo_print_entry()
1488 tomoyo_set_space(head); in tomoyo_print_entry()
1491 tomoyo_set_slash(head); in tomoyo_print_entry()
1493 tomoyo_set_string(head, tomoyo_socket_keyword[bit]); in tomoyo_print_entry()
1497 tomoyo_set_space(head); in tomoyo_print_entry()
1499 tomoyo_set_string(head, "@"); in tomoyo_print_entry()
1500 tomoyo_set_string(head, ptr->address.group->group_name in tomoyo_print_entry()
1505 tomoyo_io_printf(head, "%s", buf); in tomoyo_print_entry()
1507 tomoyo_print_number_union(head, &ptr->port); in tomoyo_print_entry()
1510 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1517 tomoyo_set_group(head, "network unix "); in tomoyo_print_entry()
1518 tomoyo_set_string(head, tomoyo_proto_keyword in tomoyo_print_entry()
1520 tomoyo_set_space(head); in tomoyo_print_entry()
1523 tomoyo_set_slash(head); in tomoyo_print_entry()
1525 tomoyo_set_string(head, tomoyo_socket_keyword[bit]); in tomoyo_print_entry()
1529 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1532 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1533 tomoyo_set_group(head, "file mount"); in tomoyo_print_entry()
1534 tomoyo_print_name_union(head, &ptr->dev_name); in tomoyo_print_entry()
1535 tomoyo_print_name_union(head, &ptr->dir_name); in tomoyo_print_entry()
1536 tomoyo_print_name_union(head, &ptr->fs_type); in tomoyo_print_entry()
1537 tomoyo_print_number_union(head, &ptr->flags); in tomoyo_print_entry()
1540 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1542 tomoyo_set_group(head, "misc env "); in tomoyo_print_entry()
1543 tomoyo_set_string(head, ptr->env->name); in tomoyo_print_entry()
1546 head->r.print_cond_part = true; in tomoyo_print_entry()
1547 head->r.cond_step = 0; in tomoyo_print_entry()
1548 if (!tomoyo_flush(head)) in tomoyo_print_entry()
1551 if (!tomoyo_print_condition(head, acl->cond)) in tomoyo_print_entry()
1553 head->r.print_cond_part = false; in tomoyo_print_entry()
1555 tomoyo_set_lf(head); in tomoyo_print_entry()
1570 static bool tomoyo_read_domain2(struct tomoyo_io_buffer *head, in tomoyo_read_domain2() argument
1573 list_for_each_cookie(head->r.acl, list) { in tomoyo_read_domain2()
1575 list_entry(head->r.acl, typeof(*ptr), list); in tomoyo_read_domain2()
1576 if (!tomoyo_print_entry(head, ptr)) in tomoyo_read_domain2()
1579 head->r.acl = NULL; in tomoyo_read_domain2()
1590 static void tomoyo_read_domain(struct tomoyo_io_buffer *head) in tomoyo_read_domain() argument
1592 if (head->r.eof) in tomoyo_read_domain()
1594 list_for_each_cookie(head->r.domain, &tomoyo_domain_list) { in tomoyo_read_domain()
1596 list_entry(head->r.domain, typeof(*domain), list); in tomoyo_read_domain()
1597 switch (head->r.step) { in tomoyo_read_domain()
1601 !head->r.print_this_domain_only) in tomoyo_read_domain()
1604 tomoyo_set_string(head, domain->domainname->name); in tomoyo_read_domain()
1605 tomoyo_set_lf(head); in tomoyo_read_domain()
1606 tomoyo_io_printf(head, "use_profile %u\n", in tomoyo_read_domain()
1608 tomoyo_io_printf(head, "use_group %u\n", in tomoyo_read_domain()
1612 tomoyo_set_string(head, tomoyo_dif[i]); in tomoyo_read_domain()
1613 head->r.step++; in tomoyo_read_domain()
1614 tomoyo_set_lf(head); in tomoyo_read_domain()
1617 if (!tomoyo_read_domain2(head, &domain->acl_info_list)) in tomoyo_read_domain()
1619 head->r.step++; in tomoyo_read_domain()
1620 if (!tomoyo_set_lf(head)) in tomoyo_read_domain()
1624 head->r.step = 0; in tomoyo_read_domain()
1625 if (head->r.print_this_domain_only) in tomoyo_read_domain()
1630 head->r.eof = true; in tomoyo_read_domain()
1640 static int tomoyo_write_pid(struct tomoyo_io_buffer *head) in tomoyo_write_pid() argument
1642 head->r.eof = false; in tomoyo_write_pid()
1656 static void tomoyo_read_pid(struct tomoyo_io_buffer *head) in tomoyo_read_pid() argument
1658 char *buf = head->write_buf; in tomoyo_read_pid()
1666 head->r.eof = true; in tomoyo_read_pid()
1669 if (head->r.w_pos || head->r.eof) in tomoyo_read_pid()
1671 head->r.eof = true; in tomoyo_read_pid()
1685 tomoyo_io_printf(head, "%u %u ", pid, domain->profile); in tomoyo_read_pid()
1686 tomoyo_set_string(head, domain->domainname->name); in tomoyo_read_pid()
1715 static int tomoyo_write_exception(struct tomoyo_io_buffer *head) in tomoyo_write_exception() argument
1717 const bool is_delete = head->w.is_delete; in tomoyo_write_exception()
1719 .ns = head->w.ns, in tomoyo_write_exception()
1721 .data = head->write_buf, in tomoyo_write_exception()
1738 (head->w.ns, &head->w.ns->acl_group[group], in tomoyo_write_exception()
1754 static bool tomoyo_read_group(struct tomoyo_io_buffer *head, const int idx) in tomoyo_read_group() argument
1757 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_group()
1759 list_for_each_cookie(head->r.group, list) { in tomoyo_read_group()
1761 list_entry(head->r.group, typeof(*group), head.list); in tomoyo_read_group()
1762 list_for_each_cookie(head->r.acl, &group->member_list) { in tomoyo_read_group()
1764 list_entry(head->r.acl, typeof(*ptr), list); in tomoyo_read_group()
1767 if (!tomoyo_flush(head)) in tomoyo_read_group()
1769 tomoyo_print_namespace(head); in tomoyo_read_group()
1770 tomoyo_set_string(head, tomoyo_group_name[idx]); in tomoyo_read_group()
1771 tomoyo_set_string(head, group->group_name->name); in tomoyo_read_group()
1773 tomoyo_set_space(head); in tomoyo_read_group()
1774 tomoyo_set_string(head, container_of in tomoyo_read_group()
1776 head)->member_name->name); in tomoyo_read_group()
1778 tomoyo_print_number_union(head, &container_of in tomoyo_read_group()
1781 head)->number); in tomoyo_read_group()
1787 head); in tomoyo_read_group()
1790 tomoyo_io_printf(head, " %s", buffer); in tomoyo_read_group()
1792 tomoyo_set_lf(head); in tomoyo_read_group()
1794 head->r.acl = NULL; in tomoyo_read_group()
1796 head->r.group = NULL; in tomoyo_read_group()
1810 static bool tomoyo_read_policy(struct tomoyo_io_buffer *head, const int idx) in tomoyo_read_policy() argument
1813 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_policy()
1815 list_for_each_cookie(head->r.acl, list) { in tomoyo_read_policy()
1817 container_of(head->r.acl, typeof(*acl), list); in tomoyo_read_policy()
1820 if (!tomoyo_flush(head)) in tomoyo_read_policy()
1826 container_of(acl, typeof(*ptr), head); in tomoyo_read_policy()
1827 tomoyo_print_namespace(head); in tomoyo_read_policy()
1828 tomoyo_set_string(head, tomoyo_transition_type in tomoyo_read_policy()
1830 tomoyo_set_string(head, ptr->program ? in tomoyo_read_policy()
1832 tomoyo_set_string(head, " from "); in tomoyo_read_policy()
1833 tomoyo_set_string(head, ptr->domainname ? in tomoyo_read_policy()
1841 container_of(acl, typeof(*ptr), head); in tomoyo_read_policy()
1842 tomoyo_print_namespace(head); in tomoyo_read_policy()
1843 tomoyo_set_string(head, "aggregator "); in tomoyo_read_policy()
1844 tomoyo_set_string(head, in tomoyo_read_policy()
1846 tomoyo_set_space(head); in tomoyo_read_policy()
1847 tomoyo_set_string(head, in tomoyo_read_policy()
1854 tomoyo_set_lf(head); in tomoyo_read_policy()
1856 head->r.acl = NULL; in tomoyo_read_policy()
1867 static void tomoyo_read_exception(struct tomoyo_io_buffer *head) in tomoyo_read_exception() argument
1870 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_exception()
1871 if (head->r.eof) in tomoyo_read_exception()
1873 while (head->r.step < TOMOYO_MAX_POLICY && in tomoyo_read_exception()
1874 tomoyo_read_policy(head, head->r.step)) in tomoyo_read_exception()
1875 head->r.step++; in tomoyo_read_exception()
1876 if (head->r.step < TOMOYO_MAX_POLICY) in tomoyo_read_exception()
1878 while (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP && in tomoyo_read_exception()
1879 tomoyo_read_group(head, head->r.step - TOMOYO_MAX_POLICY)) in tomoyo_read_exception()
1880 head->r.step++; in tomoyo_read_exception()
1881 if (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP) in tomoyo_read_exception()
1883 while (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP in tomoyo_read_exception()
1885 head->r.acl_group_index = head->r.step - TOMOYO_MAX_POLICY in tomoyo_read_exception()
1887 if (!tomoyo_read_domain2(head, &ns->acl_group in tomoyo_read_exception()
1888 [head->r.acl_group_index])) in tomoyo_read_exception()
1890 head->r.step++; in tomoyo_read_exception()
1892 head->r.eof = true; in tomoyo_read_exception()
2149 static void tomoyo_read_query(struct tomoyo_io_buffer *head) in tomoyo_read_query() argument
2155 if (head->r.w_pos) in tomoyo_read_query()
2157 if (head->read_buf) { in tomoyo_read_query()
2158 kfree(head->read_buf); in tomoyo_read_query()
2159 head->read_buf = NULL; in tomoyo_read_query()
2164 if (pos++ != head->r.query_index) in tomoyo_read_query()
2171 head->r.query_index = 0; in tomoyo_read_query()
2181 if (pos++ != head->r.query_index) in tomoyo_read_query()
2194 head->read_buf = buf; in tomoyo_read_query()
2195 head->r.w[head->r.w_pos++] = buf; in tomoyo_read_query()
2196 head->r.query_index++; in tomoyo_read_query()
2209 static int tomoyo_write_answer(struct tomoyo_io_buffer *head) in tomoyo_write_answer() argument
2211 char *data = head->write_buf; in tomoyo_write_answer()
2245 static void tomoyo_read_version(struct tomoyo_io_buffer *head) in tomoyo_read_version() argument
2247 if (!head->r.eof) { in tomoyo_read_version()
2248 tomoyo_io_printf(head, "2.5.0"); in tomoyo_read_version()
2249 head->r.eof = true; in tomoyo_read_version()
2298 static void tomoyo_read_stat(struct tomoyo_io_buffer *head) in tomoyo_read_stat() argument
2302 if (head->r.eof) in tomoyo_read_stat()
2305 tomoyo_io_printf(head, "Policy %-30s %10u", in tomoyo_read_stat()
2311 tomoyo_io_printf(head, " (Last: %04u/%02u/%02u " in tomoyo_read_stat()
2316 tomoyo_set_lf(head); in tomoyo_read_stat()
2321 tomoyo_io_printf(head, "Memory used by %-22s %10u", in tomoyo_read_stat()
2325 tomoyo_io_printf(head, " (Quota: %10u)", used); in tomoyo_read_stat()
2326 tomoyo_set_lf(head); in tomoyo_read_stat()
2328 tomoyo_io_printf(head, "Total memory used: %10u\n", in tomoyo_read_stat()
2330 head->r.eof = true; in tomoyo_read_stat()
2340 static int tomoyo_write_stat(struct tomoyo_io_buffer *head) in tomoyo_write_stat() argument
2342 char *data = head->write_buf; in tomoyo_write_stat()
2361 struct tomoyo_io_buffer *head = kzalloc(sizeof(*head), GFP_NOFS); in tomoyo_open_control() local
2363 if (!head) in tomoyo_open_control()
2365 mutex_init(&head->io_sem); in tomoyo_open_control()
2366 head->type = type; in tomoyo_open_control()
2370 head->write = tomoyo_write_domain; in tomoyo_open_control()
2371 head->read = tomoyo_read_domain; in tomoyo_open_control()
2375 head->write = tomoyo_write_exception; in tomoyo_open_control()
2376 head->read = tomoyo_read_exception; in tomoyo_open_control()
2380 head->poll = tomoyo_poll_log; in tomoyo_open_control()
2381 head->read = tomoyo_read_log; in tomoyo_open_control()
2385 head->write = tomoyo_write_pid; in tomoyo_open_control()
2386 head->read = tomoyo_read_pid; in tomoyo_open_control()
2390 head->read = tomoyo_read_version; in tomoyo_open_control()
2391 head->readbuf_size = 128; in tomoyo_open_control()
2395 head->write = tomoyo_write_stat; in tomoyo_open_control()
2396 head->read = tomoyo_read_stat; in tomoyo_open_control()
2397 head->readbuf_size = 1024; in tomoyo_open_control()
2401 head->write = tomoyo_write_profile; in tomoyo_open_control()
2402 head->read = tomoyo_read_profile; in tomoyo_open_control()
2405 head->poll = tomoyo_poll_query; in tomoyo_open_control()
2406 head->write = tomoyo_write_answer; in tomoyo_open_control()
2407 head->read = tomoyo_read_query; in tomoyo_open_control()
2411 head->write = tomoyo_write_manager; in tomoyo_open_control()
2412 head->read = tomoyo_read_manager; in tomoyo_open_control()
2420 head->read = NULL; in tomoyo_open_control()
2421 head->poll = NULL; in tomoyo_open_control()
2422 } else if (!head->poll) { in tomoyo_open_control()
2424 if (!head->readbuf_size) in tomoyo_open_control()
2425 head->readbuf_size = 4096 * 2; in tomoyo_open_control()
2426 head->read_buf = kzalloc(head->readbuf_size, GFP_NOFS); in tomoyo_open_control()
2427 if (!head->read_buf) { in tomoyo_open_control()
2428 kfree(head); in tomoyo_open_control()
2437 head->write = NULL; in tomoyo_open_control()
2438 } else if (head->write) { in tomoyo_open_control()
2439 head->writebuf_size = 4096 * 2; in tomoyo_open_control()
2440 head->write_buf = kzalloc(head->writebuf_size, GFP_NOFS); in tomoyo_open_control()
2441 if (!head->write_buf) { in tomoyo_open_control()
2442 kfree(head->read_buf); in tomoyo_open_control()
2443 kfree(head); in tomoyo_open_control()
2455 file->private_data = head; in tomoyo_open_control()
2456 tomoyo_notify_gc(head, true); in tomoyo_open_control()
2471 struct tomoyo_io_buffer *head = file->private_data; in tomoyo_poll_control() local
2472 if (head->poll) in tomoyo_poll_control()
2473 return head->poll(file, wait) | POLLOUT | POLLWRNORM; in tomoyo_poll_control()
2484 static inline void tomoyo_set_namespace_cursor(struct tomoyo_io_buffer *head) in tomoyo_set_namespace_cursor() argument
2487 if (head->type != TOMOYO_EXCEPTIONPOLICY && in tomoyo_set_namespace_cursor()
2488 head->type != TOMOYO_PROFILE) in tomoyo_set_namespace_cursor()
2494 ns = head->r.ns; in tomoyo_set_namespace_cursor()
2495 if (!ns || (head->r.eof && ns->next != &tomoyo_namespace_list)) { in tomoyo_set_namespace_cursor()
2497 memset(&head->r, 0, sizeof(head->r)); in tomoyo_set_namespace_cursor()
2498 head->r.ns = ns ? ns->next : tomoyo_namespace_list.next; in tomoyo_set_namespace_cursor()
2509 static inline bool tomoyo_has_more_namespace(struct tomoyo_io_buffer *head) in tomoyo_has_more_namespace() argument
2511 return (head->type == TOMOYO_EXCEPTIONPOLICY || in tomoyo_has_more_namespace()
2512 head->type == TOMOYO_PROFILE) && head->r.eof && in tomoyo_has_more_namespace()
2513 head->r.ns->next != &tomoyo_namespace_list; in tomoyo_has_more_namespace()
2525 ssize_t tomoyo_read_control(struct tomoyo_io_buffer *head, char __user *buffer, in tomoyo_read_control() argument
2531 if (!head->read) in tomoyo_read_control()
2533 if (mutex_lock_interruptible(&head->io_sem)) in tomoyo_read_control()
2535 head->read_user_buf = buffer; in tomoyo_read_control()
2536 head->read_user_buf_avail = buffer_len; in tomoyo_read_control()
2538 if (tomoyo_flush(head)) in tomoyo_read_control()
2541 tomoyo_set_namespace_cursor(head); in tomoyo_read_control()
2542 head->read(head); in tomoyo_read_control()
2543 } while (tomoyo_flush(head) && in tomoyo_read_control()
2544 tomoyo_has_more_namespace(head)); in tomoyo_read_control()
2546 len = head->read_user_buf - buffer; in tomoyo_read_control()
2547 mutex_unlock(&head->io_sem); in tomoyo_read_control()
2561 static int tomoyo_parse_policy(struct tomoyo_io_buffer *head, char *line) in tomoyo_parse_policy() argument
2564 head->w.is_delete = !strncmp(line, "delete ", 7); in tomoyo_parse_policy()
2565 if (head->w.is_delete) in tomoyo_parse_policy()
2568 if (head->type == TOMOYO_EXCEPTIONPOLICY || in tomoyo_parse_policy()
2569 head->type == TOMOYO_PROFILE) { in tomoyo_parse_policy()
2574 head->w.ns = tomoyo_assign_namespace(line); in tomoyo_parse_policy()
2577 head->w.ns = NULL; in tomoyo_parse_policy()
2579 head->w.ns = &tomoyo_kernel_namespace; in tomoyo_parse_policy()
2581 if (!head->w.ns) in tomoyo_parse_policy()
2585 return head->write(head); in tomoyo_parse_policy()
2597 ssize_t tomoyo_write_control(struct tomoyo_io_buffer *head, in tomoyo_write_control() argument
2602 char *cp0 = head->write_buf; in tomoyo_write_control()
2604 if (!head->write) in tomoyo_write_control()
2608 if (mutex_lock_interruptible(&head->io_sem)) in tomoyo_write_control()
2610 head->read_user_buf_avail = 0; in tomoyo_write_control()
2615 if (head->w.avail >= head->writebuf_size - 1) { in tomoyo_write_control()
2616 const int len = head->writebuf_size * 2; in tomoyo_write_control()
2622 memmove(cp, cp0, head->w.avail); in tomoyo_write_control()
2624 head->write_buf = cp; in tomoyo_write_control()
2626 head->writebuf_size = len; in tomoyo_write_control()
2634 cp0[head->w.avail++] = c; in tomoyo_write_control()
2637 cp0[head->w.avail - 1] = '\0'; in tomoyo_write_control()
2638 head->w.avail = 0; in tomoyo_write_control()
2641 head->w.ns = &tomoyo_kernel_namespace; in tomoyo_write_control()
2642 head->w.domain = NULL; in tomoyo_write_control()
2643 memset(&head->r, 0, sizeof(head->r)); in tomoyo_write_control()
2647 switch (head->type) { in tomoyo_write_control()
2652 if (tomoyo_select_domain(head, cp0)) in tomoyo_write_control()
2657 head->r.print_transition_related_only = true; in tomoyo_write_control()
2667 switch (tomoyo_parse_policy(head, cp0)) { in tomoyo_write_control()
2672 switch (head->type) { in tomoyo_write_control()
2688 mutex_unlock(&head->io_sem); in tomoyo_write_control()
2699 int tomoyo_close_control(struct tomoyo_io_buffer *head) in tomoyo_close_control() argument
2705 if (head->type == TOMOYO_QUERY && in tomoyo_close_control()
2708 tomoyo_notify_gc(head, false); in tomoyo_close_control()
2762 struct tomoyo_io_buffer head = { }; in tomoyo_load_builtin_policy() local
2767 head.type = TOMOYO_PROFILE; in tomoyo_load_builtin_policy()
2768 head.write = tomoyo_write_profile; in tomoyo_load_builtin_policy()
2772 head.type = TOMOYO_EXCEPTIONPOLICY; in tomoyo_load_builtin_policy()
2773 head.write = tomoyo_write_exception; in tomoyo_load_builtin_policy()
2777 head.type = TOMOYO_DOMAINPOLICY; in tomoyo_load_builtin_policy()
2778 head.write = tomoyo_write_domain; in tomoyo_load_builtin_policy()
2782 head.type = TOMOYO_MANAGER; in tomoyo_load_builtin_policy()
2783 head.write = tomoyo_write_manager; in tomoyo_load_builtin_policy()
2787 head.type = TOMOYO_STAT; in tomoyo_load_builtin_policy()
2788 head.write = tomoyo_write_stat; in tomoyo_load_builtin_policy()
2797 head.write_buf = start; in tomoyo_load_builtin_policy()
2798 tomoyo_parse_policy(&head, start); in tomoyo_load_builtin_policy()