Lines Matching refs:head
212 static bool tomoyo_flush(struct tomoyo_io_buffer *head) in tomoyo_flush() argument
214 while (head->r.w_pos) { in tomoyo_flush()
215 const char *w = head->r.w[0]; in tomoyo_flush()
218 if (len > head->read_user_buf_avail) in tomoyo_flush()
219 len = head->read_user_buf_avail; in tomoyo_flush()
222 if (copy_to_user(head->read_user_buf, w, len)) in tomoyo_flush()
224 head->read_user_buf_avail -= len; in tomoyo_flush()
225 head->read_user_buf += len; in tomoyo_flush()
228 head->r.w[0] = w; in tomoyo_flush()
232 if (head->poll) { in tomoyo_flush()
233 if (!head->read_user_buf_avail || in tomoyo_flush()
234 copy_to_user(head->read_user_buf, "", 1)) in tomoyo_flush()
236 head->read_user_buf_avail--; in tomoyo_flush()
237 head->read_user_buf++; in tomoyo_flush()
239 head->r.w_pos--; in tomoyo_flush()
240 for (len = 0; len < head->r.w_pos; len++) in tomoyo_flush()
241 head->r.w[len] = head->r.w[len + 1]; in tomoyo_flush()
243 head->r.avail = 0; in tomoyo_flush()
257 static void tomoyo_set_string(struct tomoyo_io_buffer *head, const char *string) in tomoyo_set_string() argument
259 if (head->r.w_pos < TOMOYO_MAX_IO_READ_QUEUE) { in tomoyo_set_string()
260 head->r.w[head->r.w_pos++] = string; in tomoyo_set_string()
261 tomoyo_flush(head); in tomoyo_set_string()
266 static void tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt,
275 static void tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt, in tomoyo_io_printf() argument
280 size_t pos = head->r.avail; in tomoyo_io_printf()
281 int size = head->readbuf_size - pos; in tomoyo_io_printf()
285 len = vsnprintf(head->read_buf + pos, size, fmt, args) + 1; in tomoyo_io_printf()
287 if (pos + len >= head->readbuf_size) { in tomoyo_io_printf()
291 head->r.avail += len; in tomoyo_io_printf()
292 tomoyo_set_string(head, head->read_buf + pos); in tomoyo_io_printf()
302 static void tomoyo_set_space(struct tomoyo_io_buffer *head) in tomoyo_set_space() argument
304 tomoyo_set_string(head, " "); in tomoyo_set_space()
314 static bool tomoyo_set_lf(struct tomoyo_io_buffer *head) in tomoyo_set_lf() argument
316 tomoyo_set_string(head, "\n"); in tomoyo_set_lf()
317 return !head->r.w_pos; in tomoyo_set_lf()
327 static void tomoyo_set_slash(struct tomoyo_io_buffer *head) in tomoyo_set_slash() argument
329 tomoyo_set_string(head, "/"); in tomoyo_set_slash()
365 static void tomoyo_print_namespace(struct tomoyo_io_buffer *head) in tomoyo_print_namespace() argument
369 tomoyo_set_string(head, in tomoyo_print_namespace()
370 container_of(head->r.ns, in tomoyo_print_namespace()
373 tomoyo_set_space(head); in tomoyo_print_namespace()
382 static void tomoyo_print_name_union(struct tomoyo_io_buffer *head, in tomoyo_print_name_union() argument
385 tomoyo_set_space(head); in tomoyo_print_name_union()
387 tomoyo_set_string(head, "@"); in tomoyo_print_name_union()
388 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_name_union()
390 tomoyo_set_string(head, ptr->filename->name); in tomoyo_print_name_union()
402 static void tomoyo_print_name_union_quoted(struct tomoyo_io_buffer *head, in tomoyo_print_name_union_quoted() argument
406 tomoyo_set_string(head, "@"); in tomoyo_print_name_union_quoted()
407 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_name_union_quoted()
409 tomoyo_set_string(head, "\""); in tomoyo_print_name_union_quoted()
410 tomoyo_set_string(head, ptr->filename->name); in tomoyo_print_name_union_quoted()
411 tomoyo_set_string(head, "\""); in tomoyo_print_name_union_quoted()
424 (struct tomoyo_io_buffer *head, const struct tomoyo_number_union *ptr) in tomoyo_print_number_union_nospace() argument
427 tomoyo_set_string(head, "@"); in tomoyo_print_number_union_nospace()
428 tomoyo_set_string(head, ptr->group->group_name->name); in tomoyo_print_number_union_nospace()
458 tomoyo_io_printf(head, "%s", buffer); in tomoyo_print_number_union_nospace()
470 static void tomoyo_print_number_union(struct tomoyo_io_buffer *head, in tomoyo_print_number_union() argument
473 tomoyo_set_space(head); in tomoyo_print_number_union()
474 tomoyo_print_number_union_nospace(head, ptr); in tomoyo_print_number_union()
661 static int tomoyo_write_profile(struct tomoyo_io_buffer *head) in tomoyo_write_profile() argument
663 char *data = head->write_buf; in tomoyo_write_profile()
667 if (sscanf(data, "PROFILE_VERSION=%u", &head->w.ns->profile_version) in tomoyo_write_profile()
674 profile = tomoyo_assign_profile(head->w.ns, i); in tomoyo_write_profile()
714 static void tomoyo_print_config(struct tomoyo_io_buffer *head, const u8 config) in tomoyo_print_config() argument
716 tomoyo_io_printf(head, "={ mode=%s grant_log=%s reject_log=%s }\n", in tomoyo_print_config()
729 static void tomoyo_read_profile(struct tomoyo_io_buffer *head) in tomoyo_read_profile() argument
733 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_profile()
735 if (head->r.eof) in tomoyo_read_profile()
738 index = head->r.index; in tomoyo_read_profile()
740 switch (head->r.step) { in tomoyo_read_profile()
742 tomoyo_print_namespace(head); in tomoyo_read_profile()
743 tomoyo_io_printf(head, "PROFILE_VERSION=%u\n", in tomoyo_read_profile()
745 head->r.step++; in tomoyo_read_profile()
748 for ( ; head->r.index < TOMOYO_MAX_PROFILES; in tomoyo_read_profile()
749 head->r.index++) in tomoyo_read_profile()
750 if (ns->profile_ptr[head->r.index]) in tomoyo_read_profile()
752 if (head->r.index == TOMOYO_MAX_PROFILES) { in tomoyo_read_profile()
753 head->r.eof = true; in tomoyo_read_profile()
756 head->r.step++; in tomoyo_read_profile()
763 tomoyo_print_namespace(head); in tomoyo_read_profile()
764 tomoyo_io_printf(head, "%u-COMMENT=", index); in tomoyo_read_profile()
765 tomoyo_set_string(head, comment ? comment->name : ""); in tomoyo_read_profile()
766 tomoyo_set_lf(head); in tomoyo_read_profile()
767 tomoyo_print_namespace(head); in tomoyo_read_profile()
768 tomoyo_io_printf(head, "%u-PREFERENCE={ ", index); in tomoyo_read_profile()
770 tomoyo_io_printf(head, "%s=%u ", in tomoyo_read_profile()
773 tomoyo_set_string(head, "}\n"); in tomoyo_read_profile()
774 head->r.step++; in tomoyo_read_profile()
779 tomoyo_print_namespace(head); in tomoyo_read_profile()
780 tomoyo_io_printf(head, "%u-%s", index, "CONFIG"); in tomoyo_read_profile()
781 tomoyo_print_config(head, profile->default_config); in tomoyo_read_profile()
782 head->r.bit = 0; in tomoyo_read_profile()
783 head->r.step++; in tomoyo_read_profile()
787 for ( ; head->r.bit < TOMOYO_MAX_MAC_INDEX in tomoyo_read_profile()
788 + TOMOYO_MAX_MAC_CATEGORY_INDEX; head->r.bit++) { in tomoyo_read_profile()
789 const u8 i = head->r.bit; in tomoyo_read_profile()
793 tomoyo_print_namespace(head); in tomoyo_read_profile()
795 tomoyo_io_printf(head, "%u-CONFIG::%s::%s", in tomoyo_read_profile()
801 tomoyo_io_printf(head, "%u-CONFIG::%s", index, in tomoyo_read_profile()
803 tomoyo_print_config(head, config); in tomoyo_read_profile()
804 head->r.bit++; in tomoyo_read_profile()
807 if (head->r.bit == TOMOYO_MAX_MAC_INDEX in tomoyo_read_profile()
809 head->r.index++; in tomoyo_read_profile()
810 head->r.step = 1; in tomoyo_read_profile()
814 if (tomoyo_flush(head)) in tomoyo_read_profile()
829 return container_of(a, struct tomoyo_manager, head)->manager == in tomoyo_same_manager()
830 container_of(b, struct tomoyo_manager, head)->manager; in tomoyo_same_manager()
859 error = tomoyo_update_policy(&e.head, sizeof(e), ¶m, in tomoyo_update_manager_entry()
875 static int tomoyo_write_manager(struct tomoyo_io_buffer *head) in tomoyo_write_manager() argument
877 char *data = head->write_buf; in tomoyo_write_manager()
880 tomoyo_manage_by_non_root = !head->w.is_delete; in tomoyo_write_manager()
883 return tomoyo_update_manager_entry(data, head->w.is_delete); in tomoyo_write_manager()
893 static void tomoyo_read_manager(struct tomoyo_io_buffer *head) in tomoyo_read_manager() argument
895 if (head->r.eof) in tomoyo_read_manager()
897 list_for_each_cookie(head->r.acl, &tomoyo_kernel_namespace. in tomoyo_read_manager()
900 list_entry(head->r.acl, typeof(*ptr), head.list); in tomoyo_read_manager()
901 if (ptr->head.is_deleted) in tomoyo_read_manager()
903 if (!tomoyo_flush(head)) in tomoyo_read_manager()
905 tomoyo_set_string(head, ptr->manager->name); in tomoyo_read_manager()
906 tomoyo_set_lf(head); in tomoyo_read_manager()
908 head->r.eof = true; in tomoyo_read_manager()
937 policy_list[TOMOYO_ID_MANAGER], head.list) { in tomoyo_manager()
938 if (!ptr->head.is_deleted && in tomoyo_manager()
971 static bool tomoyo_select_domain(struct tomoyo_io_buffer *head, in tomoyo_select_domain() argument
998 head->w.domain = domain; in tomoyo_select_domain()
1000 if (!head->read_buf) in tomoyo_select_domain()
1002 memset(&head->r, 0, sizeof(head->r)); in tomoyo_select_domain()
1003 head->r.print_this_domain_only = true; in tomoyo_select_domain()
1005 head->r.domain = &domain->list; in tomoyo_select_domain()
1007 head->r.eof = 1; in tomoyo_select_domain()
1008 tomoyo_io_printf(head, "# select %s\n", data); in tomoyo_select_domain()
1010 tomoyo_io_printf(head, "# This is a deleted domain.\n"); in tomoyo_select_domain()
1025 const struct tomoyo_task_acl *p1 = container_of(a, typeof(*p1), head); in tomoyo_same_task_acl()
1026 const struct tomoyo_task_acl *p2 = container_of(b, typeof(*p2), head); in tomoyo_same_task_acl()
1044 .head.type = TOMOYO_TYPE_MANUAL_TASK_ACL, in tomoyo_write_task()
1048 error = tomoyo_update_domain(&e.head, sizeof(e), param, in tomoyo_write_task()
1147 static int tomoyo_write_domain(struct tomoyo_io_buffer *head) in tomoyo_write_domain() argument
1149 char *data = head->write_buf; in tomoyo_write_domain()
1151 struct tomoyo_domain_info *domain = head->w.domain; in tomoyo_write_domain()
1152 const bool is_delete = head->w.is_delete; in tomoyo_write_domain()
1164 head->w.domain = domain; in tomoyo_write_domain()
1201 static bool tomoyo_print_condition(struct tomoyo_io_buffer *head, in tomoyo_print_condition() argument
1204 switch (head->r.cond_step) { in tomoyo_print_condition()
1206 head->r.cond_index = 0; in tomoyo_print_condition()
1207 head->r.cond_step++; in tomoyo_print_condition()
1209 tomoyo_set_space(head); in tomoyo_print_condition()
1210 tomoyo_set_string(head, cond->transit->name); in tomoyo_print_condition()
1228 for (skip = 0; skip < head->r.cond_index; skip++) { in tomoyo_print_condition()
1252 while (head->r.cond_index < condc) { in tomoyo_print_condition()
1256 if (!tomoyo_flush(head)) in tomoyo_print_condition()
1259 head->r.cond_index++; in tomoyo_print_condition()
1260 tomoyo_set_space(head); in tomoyo_print_condition()
1263 tomoyo_io_printf(head, in tomoyo_print_condition()
1267 tomoyo_set_string(head, in tomoyo_print_condition()
1269 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1273 tomoyo_set_string(head, in tomoyo_print_condition()
1275 tomoyo_set_string(head, in tomoyo_print_condition()
1277 tomoyo_io_printf(head, "\"]%s=", envp-> in tomoyo_print_condition()
1280 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1281 tomoyo_set_string(head, envp-> in tomoyo_print_condition()
1283 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1285 tomoyo_set_string(head, in tomoyo_print_condition()
1292 (head, numbers_p++); in tomoyo_print_condition()
1295 tomoyo_set_string(head, in tomoyo_print_condition()
1299 tomoyo_set_string(head, match ? "=" : "!="); in tomoyo_print_condition()
1303 (head, names_p++); in tomoyo_print_condition()
1307 (head, numbers_p++); in tomoyo_print_condition()
1310 tomoyo_set_string(head, in tomoyo_print_condition()
1316 head->r.cond_step++; in tomoyo_print_condition()
1319 if (!tomoyo_flush(head)) in tomoyo_print_condition()
1321 head->r.cond_step++; in tomoyo_print_condition()
1325 tomoyo_io_printf(head, " grant_log=%s", in tomoyo_print_condition()
1328 tomoyo_set_lf(head); in tomoyo_print_condition()
1342 static void tomoyo_set_group(struct tomoyo_io_buffer *head, in tomoyo_set_group() argument
1345 if (head->type == TOMOYO_EXCEPTIONPOLICY) { in tomoyo_set_group()
1346 tomoyo_print_namespace(head); in tomoyo_set_group()
1347 tomoyo_io_printf(head, "acl_group %u ", in tomoyo_set_group()
1348 head->r.acl_group_index); in tomoyo_set_group()
1350 tomoyo_set_string(head, category); in tomoyo_set_group()
1361 static bool tomoyo_print_entry(struct tomoyo_io_buffer *head, in tomoyo_print_entry() argument
1368 if (head->r.print_cond_part) in tomoyo_print_entry()
1372 if (!tomoyo_flush(head)) in tomoyo_print_entry()
1376 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1381 if (head->r.print_transition_related_only && in tomoyo_print_entry()
1385 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1388 tomoyo_set_slash(head); in tomoyo_print_entry()
1390 tomoyo_set_string(head, tomoyo_path_keyword[bit]); in tomoyo_print_entry()
1394 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1397 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1398 tomoyo_set_group(head, "task "); in tomoyo_print_entry()
1399 tomoyo_set_string(head, "manual_domain_transition "); in tomoyo_print_entry()
1400 tomoyo_set_string(head, ptr->domainname->name); in tomoyo_print_entry()
1401 } else if (head->r.print_transition_related_only) { in tomoyo_print_entry()
1405 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1411 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1414 tomoyo_set_slash(head); in tomoyo_print_entry()
1416 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1421 tomoyo_print_name_union(head, &ptr->name1); in tomoyo_print_entry()
1422 tomoyo_print_name_union(head, &ptr->name2); in tomoyo_print_entry()
1425 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1431 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1434 tomoyo_set_slash(head); in tomoyo_print_entry()
1436 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1441 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1442 tomoyo_print_number_union(head, &ptr->number); in tomoyo_print_entry()
1445 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1451 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1454 tomoyo_set_slash(head); in tomoyo_print_entry()
1456 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1461 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1462 tomoyo_print_number_union(head, &ptr->mode); in tomoyo_print_entry()
1463 tomoyo_print_number_union(head, &ptr->major); in tomoyo_print_entry()
1464 tomoyo_print_number_union(head, &ptr->minor); in tomoyo_print_entry()
1467 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1474 tomoyo_set_group(head, "network inet "); in tomoyo_print_entry()
1475 tomoyo_set_string(head, tomoyo_proto_keyword in tomoyo_print_entry()
1477 tomoyo_set_space(head); in tomoyo_print_entry()
1480 tomoyo_set_slash(head); in tomoyo_print_entry()
1482 tomoyo_set_string(head, tomoyo_socket_keyword[bit]); in tomoyo_print_entry()
1486 tomoyo_set_space(head); in tomoyo_print_entry()
1488 tomoyo_set_string(head, "@"); in tomoyo_print_entry()
1489 tomoyo_set_string(head, ptr->address.group->group_name in tomoyo_print_entry()
1494 tomoyo_io_printf(head, "%s", buf); in tomoyo_print_entry()
1496 tomoyo_print_number_union(head, &ptr->port); in tomoyo_print_entry()
1499 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1506 tomoyo_set_group(head, "network unix "); in tomoyo_print_entry()
1507 tomoyo_set_string(head, tomoyo_proto_keyword in tomoyo_print_entry()
1509 tomoyo_set_space(head); in tomoyo_print_entry()
1512 tomoyo_set_slash(head); in tomoyo_print_entry()
1514 tomoyo_set_string(head, tomoyo_socket_keyword[bit]); in tomoyo_print_entry()
1518 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1521 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1522 tomoyo_set_group(head, "file mount"); in tomoyo_print_entry()
1523 tomoyo_print_name_union(head, &ptr->dev_name); in tomoyo_print_entry()
1524 tomoyo_print_name_union(head, &ptr->dir_name); in tomoyo_print_entry()
1525 tomoyo_print_name_union(head, &ptr->fs_type); in tomoyo_print_entry()
1526 tomoyo_print_number_union(head, &ptr->flags); in tomoyo_print_entry()
1529 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1531 tomoyo_set_group(head, "misc env "); in tomoyo_print_entry()
1532 tomoyo_set_string(head, ptr->env->name); in tomoyo_print_entry()
1535 head->r.print_cond_part = true; in tomoyo_print_entry()
1536 head->r.cond_step = 0; in tomoyo_print_entry()
1537 if (!tomoyo_flush(head)) in tomoyo_print_entry()
1540 if (!tomoyo_print_condition(head, acl->cond)) in tomoyo_print_entry()
1542 head->r.print_cond_part = false; in tomoyo_print_entry()
1544 tomoyo_set_lf(head); in tomoyo_print_entry()
1559 static bool tomoyo_read_domain2(struct tomoyo_io_buffer *head, in tomoyo_read_domain2() argument
1562 list_for_each_cookie(head->r.acl, list) { in tomoyo_read_domain2()
1564 list_entry(head->r.acl, typeof(*ptr), list); in tomoyo_read_domain2()
1565 if (!tomoyo_print_entry(head, ptr)) in tomoyo_read_domain2()
1568 head->r.acl = NULL; in tomoyo_read_domain2()
1579 static void tomoyo_read_domain(struct tomoyo_io_buffer *head) in tomoyo_read_domain() argument
1581 if (head->r.eof) in tomoyo_read_domain()
1583 list_for_each_cookie(head->r.domain, &tomoyo_domain_list) { in tomoyo_read_domain()
1585 list_entry(head->r.domain, typeof(*domain), list); in tomoyo_read_domain()
1586 switch (head->r.step) { in tomoyo_read_domain()
1590 !head->r.print_this_domain_only) in tomoyo_read_domain()
1593 tomoyo_set_string(head, domain->domainname->name); in tomoyo_read_domain()
1594 tomoyo_set_lf(head); in tomoyo_read_domain()
1595 tomoyo_io_printf(head, "use_profile %u\n", in tomoyo_read_domain()
1597 tomoyo_io_printf(head, "use_group %u\n", in tomoyo_read_domain()
1601 tomoyo_set_string(head, tomoyo_dif[i]); in tomoyo_read_domain()
1602 head->r.step++; in tomoyo_read_domain()
1603 tomoyo_set_lf(head); in tomoyo_read_domain()
1606 if (!tomoyo_read_domain2(head, &domain->acl_info_list)) in tomoyo_read_domain()
1608 head->r.step++; in tomoyo_read_domain()
1609 if (!tomoyo_set_lf(head)) in tomoyo_read_domain()
1613 head->r.step = 0; in tomoyo_read_domain()
1614 if (head->r.print_this_domain_only) in tomoyo_read_domain()
1619 head->r.eof = true; in tomoyo_read_domain()
1629 static int tomoyo_write_pid(struct tomoyo_io_buffer *head) in tomoyo_write_pid() argument
1631 head->r.eof = false; in tomoyo_write_pid()
1645 static void tomoyo_read_pid(struct tomoyo_io_buffer *head) in tomoyo_read_pid() argument
1647 char *buf = head->write_buf; in tomoyo_read_pid()
1655 head->r.eof = true; in tomoyo_read_pid()
1658 if (head->r.w_pos || head->r.eof) in tomoyo_read_pid()
1660 head->r.eof = true; in tomoyo_read_pid()
1674 tomoyo_io_printf(head, "%u %u ", pid, domain->profile); in tomoyo_read_pid()
1675 tomoyo_set_string(head, domain->domainname->name); in tomoyo_read_pid()
1704 static int tomoyo_write_exception(struct tomoyo_io_buffer *head) in tomoyo_write_exception() argument
1706 const bool is_delete = head->w.is_delete; in tomoyo_write_exception()
1708 .ns = head->w.ns, in tomoyo_write_exception()
1710 .data = head->write_buf, in tomoyo_write_exception()
1727 (head->w.ns, &head->w.ns->acl_group[group], in tomoyo_write_exception()
1743 static bool tomoyo_read_group(struct tomoyo_io_buffer *head, const int idx) in tomoyo_read_group() argument
1746 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_group()
1748 list_for_each_cookie(head->r.group, list) { in tomoyo_read_group()
1750 list_entry(head->r.group, typeof(*group), head.list); in tomoyo_read_group()
1751 list_for_each_cookie(head->r.acl, &group->member_list) { in tomoyo_read_group()
1753 list_entry(head->r.acl, typeof(*ptr), list); in tomoyo_read_group()
1756 if (!tomoyo_flush(head)) in tomoyo_read_group()
1758 tomoyo_print_namespace(head); in tomoyo_read_group()
1759 tomoyo_set_string(head, tomoyo_group_name[idx]); in tomoyo_read_group()
1760 tomoyo_set_string(head, group->group_name->name); in tomoyo_read_group()
1762 tomoyo_set_space(head); in tomoyo_read_group()
1763 tomoyo_set_string(head, container_of in tomoyo_read_group()
1765 head)->member_name->name); in tomoyo_read_group()
1767 tomoyo_print_number_union(head, &container_of in tomoyo_read_group()
1770 head)->number); in tomoyo_read_group()
1776 head); in tomoyo_read_group()
1779 tomoyo_io_printf(head, " %s", buffer); in tomoyo_read_group()
1781 tomoyo_set_lf(head); in tomoyo_read_group()
1783 head->r.acl = NULL; in tomoyo_read_group()
1785 head->r.group = NULL; in tomoyo_read_group()
1799 static bool tomoyo_read_policy(struct tomoyo_io_buffer *head, const int idx) in tomoyo_read_policy() argument
1802 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_policy()
1804 list_for_each_cookie(head->r.acl, list) { in tomoyo_read_policy()
1806 container_of(head->r.acl, typeof(*acl), list); in tomoyo_read_policy()
1809 if (!tomoyo_flush(head)) in tomoyo_read_policy()
1815 container_of(acl, typeof(*ptr), head); in tomoyo_read_policy()
1816 tomoyo_print_namespace(head); in tomoyo_read_policy()
1817 tomoyo_set_string(head, tomoyo_transition_type in tomoyo_read_policy()
1819 tomoyo_set_string(head, ptr->program ? in tomoyo_read_policy()
1821 tomoyo_set_string(head, " from "); in tomoyo_read_policy()
1822 tomoyo_set_string(head, ptr->domainname ? in tomoyo_read_policy()
1830 container_of(acl, typeof(*ptr), head); in tomoyo_read_policy()
1831 tomoyo_print_namespace(head); in tomoyo_read_policy()
1832 tomoyo_set_string(head, "aggregator "); in tomoyo_read_policy()
1833 tomoyo_set_string(head, in tomoyo_read_policy()
1835 tomoyo_set_space(head); in tomoyo_read_policy()
1836 tomoyo_set_string(head, in tomoyo_read_policy()
1843 tomoyo_set_lf(head); in tomoyo_read_policy()
1845 head->r.acl = NULL; in tomoyo_read_policy()
1856 static void tomoyo_read_exception(struct tomoyo_io_buffer *head) in tomoyo_read_exception() argument
1859 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_exception()
1860 if (head->r.eof) in tomoyo_read_exception()
1862 while (head->r.step < TOMOYO_MAX_POLICY && in tomoyo_read_exception()
1863 tomoyo_read_policy(head, head->r.step)) in tomoyo_read_exception()
1864 head->r.step++; in tomoyo_read_exception()
1865 if (head->r.step < TOMOYO_MAX_POLICY) in tomoyo_read_exception()
1867 while (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP && in tomoyo_read_exception()
1868 tomoyo_read_group(head, head->r.step - TOMOYO_MAX_POLICY)) in tomoyo_read_exception()
1869 head->r.step++; in tomoyo_read_exception()
1870 if (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP) in tomoyo_read_exception()
1872 while (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP in tomoyo_read_exception()
1874 head->r.acl_group_index = head->r.step - TOMOYO_MAX_POLICY in tomoyo_read_exception()
1876 if (!tomoyo_read_domain2(head, &ns->acl_group in tomoyo_read_exception()
1877 [head->r.acl_group_index])) in tomoyo_read_exception()
1879 head->r.step++; in tomoyo_read_exception()
1881 head->r.eof = true; in tomoyo_read_exception()
2138 static void tomoyo_read_query(struct tomoyo_io_buffer *head) in tomoyo_read_query() argument
2144 if (head->r.w_pos) in tomoyo_read_query()
2146 if (head->read_buf) { in tomoyo_read_query()
2147 kfree(head->read_buf); in tomoyo_read_query()
2148 head->read_buf = NULL; in tomoyo_read_query()
2153 if (pos++ != head->r.query_index) in tomoyo_read_query()
2160 head->r.query_index = 0; in tomoyo_read_query()
2170 if (pos++ != head->r.query_index) in tomoyo_read_query()
2183 head->read_buf = buf; in tomoyo_read_query()
2184 head->r.w[head->r.w_pos++] = buf; in tomoyo_read_query()
2185 head->r.query_index++; in tomoyo_read_query()
2198 static int tomoyo_write_answer(struct tomoyo_io_buffer *head) in tomoyo_write_answer() argument
2200 char *data = head->write_buf; in tomoyo_write_answer()
2234 static void tomoyo_read_version(struct tomoyo_io_buffer *head) in tomoyo_read_version() argument
2236 if (!head->r.eof) { in tomoyo_read_version()
2237 tomoyo_io_printf(head, "2.5.0"); in tomoyo_read_version()
2238 head->r.eof = true; in tomoyo_read_version()
2285 static void tomoyo_read_stat(struct tomoyo_io_buffer *head) in tomoyo_read_stat() argument
2289 if (head->r.eof) in tomoyo_read_stat()
2292 tomoyo_io_printf(head, "Policy %-30s %10u", in tomoyo_read_stat()
2298 tomoyo_io_printf(head, " (Last: %04u/%02u/%02u " in tomoyo_read_stat()
2303 tomoyo_set_lf(head); in tomoyo_read_stat()
2308 tomoyo_io_printf(head, "Memory used by %-22s %10u", in tomoyo_read_stat()
2312 tomoyo_io_printf(head, " (Quota: %10u)", used); in tomoyo_read_stat()
2313 tomoyo_set_lf(head); in tomoyo_read_stat()
2315 tomoyo_io_printf(head, "Total memory used: %10u\n", in tomoyo_read_stat()
2317 head->r.eof = true; in tomoyo_read_stat()
2327 static int tomoyo_write_stat(struct tomoyo_io_buffer *head) in tomoyo_write_stat() argument
2329 char *data = head->write_buf; in tomoyo_write_stat()
2348 struct tomoyo_io_buffer *head = kzalloc(sizeof(*head), GFP_NOFS); in tomoyo_open_control() local
2350 if (!head) in tomoyo_open_control()
2352 mutex_init(&head->io_sem); in tomoyo_open_control()
2353 head->type = type; in tomoyo_open_control()
2357 head->write = tomoyo_write_domain; in tomoyo_open_control()
2358 head->read = tomoyo_read_domain; in tomoyo_open_control()
2362 head->write = tomoyo_write_exception; in tomoyo_open_control()
2363 head->read = tomoyo_read_exception; in tomoyo_open_control()
2367 head->poll = tomoyo_poll_log; in tomoyo_open_control()
2368 head->read = tomoyo_read_log; in tomoyo_open_control()
2372 head->write = tomoyo_write_pid; in tomoyo_open_control()
2373 head->read = tomoyo_read_pid; in tomoyo_open_control()
2377 head->read = tomoyo_read_version; in tomoyo_open_control()
2378 head->readbuf_size = 128; in tomoyo_open_control()
2382 head->write = tomoyo_write_stat; in tomoyo_open_control()
2383 head->read = tomoyo_read_stat; in tomoyo_open_control()
2384 head->readbuf_size = 1024; in tomoyo_open_control()
2388 head->write = tomoyo_write_profile; in tomoyo_open_control()
2389 head->read = tomoyo_read_profile; in tomoyo_open_control()
2392 head->poll = tomoyo_poll_query; in tomoyo_open_control()
2393 head->write = tomoyo_write_answer; in tomoyo_open_control()
2394 head->read = tomoyo_read_query; in tomoyo_open_control()
2398 head->write = tomoyo_write_manager; in tomoyo_open_control()
2399 head->read = tomoyo_read_manager; in tomoyo_open_control()
2407 head->read = NULL; in tomoyo_open_control()
2408 head->poll = NULL; in tomoyo_open_control()
2409 } else if (!head->poll) { in tomoyo_open_control()
2411 if (!head->readbuf_size) in tomoyo_open_control()
2412 head->readbuf_size = 4096 * 2; in tomoyo_open_control()
2413 head->read_buf = kzalloc(head->readbuf_size, GFP_NOFS); in tomoyo_open_control()
2414 if (!head->read_buf) { in tomoyo_open_control()
2415 kfree(head); in tomoyo_open_control()
2424 head->write = NULL; in tomoyo_open_control()
2425 } else if (head->write) { in tomoyo_open_control()
2426 head->writebuf_size = 4096 * 2; in tomoyo_open_control()
2427 head->write_buf = kzalloc(head->writebuf_size, GFP_NOFS); in tomoyo_open_control()
2428 if (!head->write_buf) { in tomoyo_open_control()
2429 kfree(head->read_buf); in tomoyo_open_control()
2430 kfree(head); in tomoyo_open_control()
2442 file->private_data = head; in tomoyo_open_control()
2443 tomoyo_notify_gc(head, true); in tomoyo_open_control()
2458 struct tomoyo_io_buffer *head = file->private_data; in tomoyo_poll_control() local
2459 if (head->poll) in tomoyo_poll_control()
2460 return head->poll(file, wait) | EPOLLOUT | EPOLLWRNORM; in tomoyo_poll_control()
2471 static inline void tomoyo_set_namespace_cursor(struct tomoyo_io_buffer *head) in tomoyo_set_namespace_cursor() argument
2474 if (head->type != TOMOYO_EXCEPTIONPOLICY && in tomoyo_set_namespace_cursor()
2475 head->type != TOMOYO_PROFILE) in tomoyo_set_namespace_cursor()
2481 ns = head->r.ns; in tomoyo_set_namespace_cursor()
2482 if (!ns || (head->r.eof && ns->next != &tomoyo_namespace_list)) { in tomoyo_set_namespace_cursor()
2484 memset(&head->r, 0, sizeof(head->r)); in tomoyo_set_namespace_cursor()
2485 head->r.ns = ns ? ns->next : tomoyo_namespace_list.next; in tomoyo_set_namespace_cursor()
2496 static inline bool tomoyo_has_more_namespace(struct tomoyo_io_buffer *head) in tomoyo_has_more_namespace() argument
2498 return (head->type == TOMOYO_EXCEPTIONPOLICY || in tomoyo_has_more_namespace()
2499 head->type == TOMOYO_PROFILE) && head->r.eof && in tomoyo_has_more_namespace()
2500 head->r.ns->next != &tomoyo_namespace_list; in tomoyo_has_more_namespace()
2512 ssize_t tomoyo_read_control(struct tomoyo_io_buffer *head, char __user *buffer, in tomoyo_read_control() argument
2518 if (!head->read) in tomoyo_read_control()
2520 if (mutex_lock_interruptible(&head->io_sem)) in tomoyo_read_control()
2522 head->read_user_buf = buffer; in tomoyo_read_control()
2523 head->read_user_buf_avail = buffer_len; in tomoyo_read_control()
2525 if (tomoyo_flush(head)) in tomoyo_read_control()
2528 tomoyo_set_namespace_cursor(head); in tomoyo_read_control()
2529 head->read(head); in tomoyo_read_control()
2530 } while (tomoyo_flush(head) && in tomoyo_read_control()
2531 tomoyo_has_more_namespace(head)); in tomoyo_read_control()
2533 len = head->read_user_buf - buffer; in tomoyo_read_control()
2534 mutex_unlock(&head->io_sem); in tomoyo_read_control()
2548 static int tomoyo_parse_policy(struct tomoyo_io_buffer *head, char *line) in tomoyo_parse_policy() argument
2551 head->w.is_delete = !strncmp(line, "delete ", 7); in tomoyo_parse_policy()
2552 if (head->w.is_delete) in tomoyo_parse_policy()
2555 if (head->type == TOMOYO_EXCEPTIONPOLICY || in tomoyo_parse_policy()
2556 head->type == TOMOYO_PROFILE) { in tomoyo_parse_policy()
2561 head->w.ns = tomoyo_assign_namespace(line); in tomoyo_parse_policy()
2564 head->w.ns = NULL; in tomoyo_parse_policy()
2566 head->w.ns = &tomoyo_kernel_namespace; in tomoyo_parse_policy()
2568 if (!head->w.ns) in tomoyo_parse_policy()
2572 return head->write(head); in tomoyo_parse_policy()
2584 ssize_t tomoyo_write_control(struct tomoyo_io_buffer *head, in tomoyo_write_control() argument
2589 char *cp0 = head->write_buf; in tomoyo_write_control()
2591 if (!head->write) in tomoyo_write_control()
2595 if (mutex_lock_interruptible(&head->io_sem)) in tomoyo_write_control()
2597 head->read_user_buf_avail = 0; in tomoyo_write_control()
2602 if (head->w.avail >= head->writebuf_size - 1) { in tomoyo_write_control()
2603 const int len = head->writebuf_size * 2; in tomoyo_write_control()
2609 memmove(cp, cp0, head->w.avail); in tomoyo_write_control()
2611 head->write_buf = cp; in tomoyo_write_control()
2613 head->writebuf_size = len; in tomoyo_write_control()
2621 cp0[head->w.avail++] = c; in tomoyo_write_control()
2624 cp0[head->w.avail - 1] = '\0'; in tomoyo_write_control()
2625 head->w.avail = 0; in tomoyo_write_control()
2628 head->w.ns = &tomoyo_kernel_namespace; in tomoyo_write_control()
2629 head->w.domain = NULL; in tomoyo_write_control()
2630 memset(&head->r, 0, sizeof(head->r)); in tomoyo_write_control()
2634 switch (head->type) { in tomoyo_write_control()
2639 if (tomoyo_select_domain(head, cp0)) in tomoyo_write_control()
2644 head->r.print_transition_related_only = true; in tomoyo_write_control()
2654 switch (tomoyo_parse_policy(head, cp0)) { in tomoyo_write_control()
2659 switch (head->type) { in tomoyo_write_control()
2675 mutex_unlock(&head->io_sem); in tomoyo_write_control()
2684 void tomoyo_close_control(struct tomoyo_io_buffer *head) in tomoyo_close_control() argument
2690 if (head->type == TOMOYO_QUERY && in tomoyo_close_control()
2693 tomoyo_notify_gc(head, false); in tomoyo_close_control()
2746 struct tomoyo_io_buffer head = { }; in tomoyo_load_builtin_policy() local
2751 head.type = TOMOYO_PROFILE; in tomoyo_load_builtin_policy()
2752 head.write = tomoyo_write_profile; in tomoyo_load_builtin_policy()
2756 head.type = TOMOYO_EXCEPTIONPOLICY; in tomoyo_load_builtin_policy()
2757 head.write = tomoyo_write_exception; in tomoyo_load_builtin_policy()
2761 head.type = TOMOYO_DOMAINPOLICY; in tomoyo_load_builtin_policy()
2762 head.write = tomoyo_write_domain; in tomoyo_load_builtin_policy()
2766 head.type = TOMOYO_MANAGER; in tomoyo_load_builtin_policy()
2767 head.write = tomoyo_write_manager; in tomoyo_load_builtin_policy()
2771 head.type = TOMOYO_STAT; in tomoyo_load_builtin_policy()
2772 head.write = tomoyo_write_stat; in tomoyo_load_builtin_policy()
2781 head.write_buf = start; in tomoyo_load_builtin_policy()
2782 tomoyo_parse_policy(&head, start); in tomoyo_load_builtin_policy()