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()
858 error = tomoyo_update_policy(&e.head, sizeof(e), ¶m, in tomoyo_update_manager_entry()
874 static int tomoyo_write_manager(struct tomoyo_io_buffer *head) in tomoyo_write_manager() argument
876 char *data = head->write_buf; in tomoyo_write_manager()
879 tomoyo_manage_by_non_root = !head->w.is_delete; in tomoyo_write_manager()
882 return tomoyo_update_manager_entry(data, head->w.is_delete); in tomoyo_write_manager()
892 static void tomoyo_read_manager(struct tomoyo_io_buffer *head) in tomoyo_read_manager() argument
894 if (head->r.eof) in tomoyo_read_manager()
896 list_for_each_cookie(head->r.acl, &tomoyo_kernel_namespace. in tomoyo_read_manager()
899 list_entry(head->r.acl, typeof(*ptr), head.list); in tomoyo_read_manager()
900 if (ptr->head.is_deleted) in tomoyo_read_manager()
902 if (!tomoyo_flush(head)) in tomoyo_read_manager()
904 tomoyo_set_string(head, ptr->manager->name); in tomoyo_read_manager()
905 tomoyo_set_lf(head); in tomoyo_read_manager()
907 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 && in tomoyo_manager()
970 static bool tomoyo_select_domain(struct tomoyo_io_buffer *head, in tomoyo_select_domain() argument
997 head->w.domain = domain; in tomoyo_select_domain()
999 if (!head->read_buf) in tomoyo_select_domain()
1001 memset(&head->r, 0, sizeof(head->r)); in tomoyo_select_domain()
1002 head->r.print_this_domain_only = true; in tomoyo_select_domain()
1004 head->r.domain = &domain->list; in tomoyo_select_domain()
1006 head->r.eof = 1; in tomoyo_select_domain()
1007 tomoyo_io_printf(head, "# select %s\n", data); in tomoyo_select_domain()
1009 tomoyo_io_printf(head, "# This is a deleted domain.\n"); in tomoyo_select_domain()
1024 const struct tomoyo_task_acl *p1 = container_of(a, typeof(*p1), head); in tomoyo_same_task_acl()
1025 const struct tomoyo_task_acl *p2 = container_of(b, typeof(*p2), head); in tomoyo_same_task_acl()
1043 .head.type = TOMOYO_TYPE_MANUAL_TASK_ACL, in tomoyo_write_task()
1047 error = tomoyo_update_domain(&e.head, sizeof(e), param, in tomoyo_write_task()
1146 static int tomoyo_write_domain(struct tomoyo_io_buffer *head) in tomoyo_write_domain() argument
1148 char *data = head->write_buf; in tomoyo_write_domain()
1150 struct tomoyo_domain_info *domain = head->w.domain; in tomoyo_write_domain()
1151 const bool is_delete = head->w.is_delete; in tomoyo_write_domain()
1163 head->w.domain = domain; in tomoyo_write_domain()
1200 static bool tomoyo_print_condition(struct tomoyo_io_buffer *head, in tomoyo_print_condition() argument
1203 switch (head->r.cond_step) { in tomoyo_print_condition()
1205 head->r.cond_index = 0; in tomoyo_print_condition()
1206 head->r.cond_step++; in tomoyo_print_condition()
1208 tomoyo_set_space(head); in tomoyo_print_condition()
1209 tomoyo_set_string(head, cond->transit->name); in tomoyo_print_condition()
1227 for (skip = 0; skip < head->r.cond_index; skip++) { in tomoyo_print_condition()
1251 while (head->r.cond_index < condc) { in tomoyo_print_condition()
1255 if (!tomoyo_flush(head)) in tomoyo_print_condition()
1258 head->r.cond_index++; in tomoyo_print_condition()
1259 tomoyo_set_space(head); in tomoyo_print_condition()
1262 tomoyo_io_printf(head, in tomoyo_print_condition()
1266 tomoyo_set_string(head, in tomoyo_print_condition()
1268 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1272 tomoyo_set_string(head, in tomoyo_print_condition()
1274 tomoyo_set_string(head, in tomoyo_print_condition()
1276 tomoyo_io_printf(head, "\"]%s=", envp-> in tomoyo_print_condition()
1279 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1280 tomoyo_set_string(head, envp-> in tomoyo_print_condition()
1282 tomoyo_set_string(head, "\""); in tomoyo_print_condition()
1284 tomoyo_set_string(head, in tomoyo_print_condition()
1291 (head, numbers_p++); in tomoyo_print_condition()
1294 tomoyo_set_string(head, in tomoyo_print_condition()
1298 tomoyo_set_string(head, match ? "=" : "!="); in tomoyo_print_condition()
1302 (head, names_p++); in tomoyo_print_condition()
1306 (head, numbers_p++); in tomoyo_print_condition()
1309 tomoyo_set_string(head, in tomoyo_print_condition()
1315 head->r.cond_step++; in tomoyo_print_condition()
1318 if (!tomoyo_flush(head)) in tomoyo_print_condition()
1320 head->r.cond_step++; in tomoyo_print_condition()
1324 tomoyo_io_printf(head, " grant_log=%s", in tomoyo_print_condition()
1327 tomoyo_set_lf(head); in tomoyo_print_condition()
1341 static void tomoyo_set_group(struct tomoyo_io_buffer *head, in tomoyo_set_group() argument
1344 if (head->type == TOMOYO_EXCEPTIONPOLICY) { in tomoyo_set_group()
1345 tomoyo_print_namespace(head); in tomoyo_set_group()
1346 tomoyo_io_printf(head, "acl_group %u ", in tomoyo_set_group()
1347 head->r.acl_group_index); in tomoyo_set_group()
1349 tomoyo_set_string(head, category); in tomoyo_set_group()
1360 static bool tomoyo_print_entry(struct tomoyo_io_buffer *head, in tomoyo_print_entry() argument
1367 if (head->r.print_cond_part) in tomoyo_print_entry()
1371 if (!tomoyo_flush(head)) in tomoyo_print_entry()
1375 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1380 if (head->r.print_transition_related_only && in tomoyo_print_entry()
1384 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1387 tomoyo_set_slash(head); in tomoyo_print_entry()
1389 tomoyo_set_string(head, tomoyo_path_keyword[bit]); in tomoyo_print_entry()
1393 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1396 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1397 tomoyo_set_group(head, "task "); in tomoyo_print_entry()
1398 tomoyo_set_string(head, "manual_domain_transition "); in tomoyo_print_entry()
1399 tomoyo_set_string(head, ptr->domainname->name); in tomoyo_print_entry()
1400 } else if (head->r.print_transition_related_only) { in tomoyo_print_entry()
1404 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1410 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1413 tomoyo_set_slash(head); in tomoyo_print_entry()
1415 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1420 tomoyo_print_name_union(head, &ptr->name1); in tomoyo_print_entry()
1421 tomoyo_print_name_union(head, &ptr->name2); in tomoyo_print_entry()
1424 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1430 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1433 tomoyo_set_slash(head); in tomoyo_print_entry()
1435 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1440 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1441 tomoyo_print_number_union(head, &ptr->number); in tomoyo_print_entry()
1444 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1450 tomoyo_set_group(head, "file "); in tomoyo_print_entry()
1453 tomoyo_set_slash(head); in tomoyo_print_entry()
1455 tomoyo_set_string(head, tomoyo_mac_keywords in tomoyo_print_entry()
1460 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1461 tomoyo_print_number_union(head, &ptr->mode); in tomoyo_print_entry()
1462 tomoyo_print_number_union(head, &ptr->major); in tomoyo_print_entry()
1463 tomoyo_print_number_union(head, &ptr->minor); in tomoyo_print_entry()
1466 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1473 tomoyo_set_group(head, "network inet "); in tomoyo_print_entry()
1474 tomoyo_set_string(head, tomoyo_proto_keyword in tomoyo_print_entry()
1476 tomoyo_set_space(head); in tomoyo_print_entry()
1479 tomoyo_set_slash(head); in tomoyo_print_entry()
1481 tomoyo_set_string(head, tomoyo_socket_keyword[bit]); in tomoyo_print_entry()
1485 tomoyo_set_space(head); in tomoyo_print_entry()
1487 tomoyo_set_string(head, "@"); in tomoyo_print_entry()
1488 tomoyo_set_string(head, ptr->address.group->group_name in tomoyo_print_entry()
1493 tomoyo_io_printf(head, "%s", buf); in tomoyo_print_entry()
1495 tomoyo_print_number_union(head, &ptr->port); in tomoyo_print_entry()
1498 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1505 tomoyo_set_group(head, "network unix "); in tomoyo_print_entry()
1506 tomoyo_set_string(head, tomoyo_proto_keyword in tomoyo_print_entry()
1508 tomoyo_set_space(head); in tomoyo_print_entry()
1511 tomoyo_set_slash(head); in tomoyo_print_entry()
1513 tomoyo_set_string(head, tomoyo_socket_keyword[bit]); in tomoyo_print_entry()
1517 tomoyo_print_name_union(head, &ptr->name); in tomoyo_print_entry()
1520 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1521 tomoyo_set_group(head, "file mount"); in tomoyo_print_entry()
1522 tomoyo_print_name_union(head, &ptr->dev_name); in tomoyo_print_entry()
1523 tomoyo_print_name_union(head, &ptr->dir_name); in tomoyo_print_entry()
1524 tomoyo_print_name_union(head, &ptr->fs_type); in tomoyo_print_entry()
1525 tomoyo_print_number_union(head, &ptr->flags); in tomoyo_print_entry()
1528 container_of(acl, typeof(*ptr), head); in tomoyo_print_entry()
1530 tomoyo_set_group(head, "misc env "); in tomoyo_print_entry()
1531 tomoyo_set_string(head, ptr->env->name); in tomoyo_print_entry()
1534 head->r.print_cond_part = true; in tomoyo_print_entry()
1535 head->r.cond_step = 0; in tomoyo_print_entry()
1536 if (!tomoyo_flush(head)) in tomoyo_print_entry()
1539 if (!tomoyo_print_condition(head, acl->cond)) in tomoyo_print_entry()
1541 head->r.print_cond_part = false; in tomoyo_print_entry()
1543 tomoyo_set_lf(head); in tomoyo_print_entry()
1558 static bool tomoyo_read_domain2(struct tomoyo_io_buffer *head, in tomoyo_read_domain2() argument
1561 list_for_each_cookie(head->r.acl, list) { in tomoyo_read_domain2()
1563 list_entry(head->r.acl, typeof(*ptr), list); in tomoyo_read_domain2()
1564 if (!tomoyo_print_entry(head, ptr)) in tomoyo_read_domain2()
1567 head->r.acl = NULL; in tomoyo_read_domain2()
1578 static void tomoyo_read_domain(struct tomoyo_io_buffer *head) in tomoyo_read_domain() argument
1580 if (head->r.eof) in tomoyo_read_domain()
1582 list_for_each_cookie(head->r.domain, &tomoyo_domain_list) { in tomoyo_read_domain()
1584 list_entry(head->r.domain, typeof(*domain), list); in tomoyo_read_domain()
1585 switch (head->r.step) { in tomoyo_read_domain()
1589 !head->r.print_this_domain_only) in tomoyo_read_domain()
1592 tomoyo_set_string(head, domain->domainname->name); in tomoyo_read_domain()
1593 tomoyo_set_lf(head); in tomoyo_read_domain()
1594 tomoyo_io_printf(head, "use_profile %u\n", in tomoyo_read_domain()
1596 tomoyo_io_printf(head, "use_group %u\n", in tomoyo_read_domain()
1600 tomoyo_set_string(head, tomoyo_dif[i]); in tomoyo_read_domain()
1601 head->r.step++; in tomoyo_read_domain()
1602 tomoyo_set_lf(head); in tomoyo_read_domain()
1605 if (!tomoyo_read_domain2(head, &domain->acl_info_list)) in tomoyo_read_domain()
1607 head->r.step++; in tomoyo_read_domain()
1608 if (!tomoyo_set_lf(head)) in tomoyo_read_domain()
1612 head->r.step = 0; in tomoyo_read_domain()
1613 if (head->r.print_this_domain_only) in tomoyo_read_domain()
1618 head->r.eof = true; in tomoyo_read_domain()
1628 static int tomoyo_write_pid(struct tomoyo_io_buffer *head) in tomoyo_write_pid() argument
1630 head->r.eof = false; in tomoyo_write_pid()
1644 static void tomoyo_read_pid(struct tomoyo_io_buffer *head) in tomoyo_read_pid() argument
1646 char *buf = head->write_buf; in tomoyo_read_pid()
1654 head->r.eof = true; in tomoyo_read_pid()
1657 if (head->r.w_pos || head->r.eof) in tomoyo_read_pid()
1659 head->r.eof = true; in tomoyo_read_pid()
1673 tomoyo_io_printf(head, "%u %u ", pid, domain->profile); in tomoyo_read_pid()
1674 tomoyo_set_string(head, domain->domainname->name); in tomoyo_read_pid()
1703 static int tomoyo_write_exception(struct tomoyo_io_buffer *head) in tomoyo_write_exception() argument
1705 const bool is_delete = head->w.is_delete; in tomoyo_write_exception()
1707 .ns = head->w.ns, in tomoyo_write_exception()
1709 .data = head->write_buf, in tomoyo_write_exception()
1726 (head->w.ns, &head->w.ns->acl_group[group], in tomoyo_write_exception()
1742 static bool tomoyo_read_group(struct tomoyo_io_buffer *head, const int idx) in tomoyo_read_group() argument
1745 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_group()
1747 list_for_each_cookie(head->r.group, list) { in tomoyo_read_group()
1749 list_entry(head->r.group, typeof(*group), head.list); in tomoyo_read_group()
1750 list_for_each_cookie(head->r.acl, &group->member_list) { in tomoyo_read_group()
1752 list_entry(head->r.acl, typeof(*ptr), list); in tomoyo_read_group()
1755 if (!tomoyo_flush(head)) in tomoyo_read_group()
1757 tomoyo_print_namespace(head); in tomoyo_read_group()
1758 tomoyo_set_string(head, tomoyo_group_name[idx]); in tomoyo_read_group()
1759 tomoyo_set_string(head, group->group_name->name); in tomoyo_read_group()
1761 tomoyo_set_space(head); in tomoyo_read_group()
1762 tomoyo_set_string(head, container_of in tomoyo_read_group()
1764 head)->member_name->name); in tomoyo_read_group()
1766 tomoyo_print_number_union(head, &container_of in tomoyo_read_group()
1769 head)->number); in tomoyo_read_group()
1775 head); in tomoyo_read_group()
1778 tomoyo_io_printf(head, " %s", buffer); in tomoyo_read_group()
1780 tomoyo_set_lf(head); in tomoyo_read_group()
1782 head->r.acl = NULL; in tomoyo_read_group()
1784 head->r.group = NULL; in tomoyo_read_group()
1798 static bool tomoyo_read_policy(struct tomoyo_io_buffer *head, const int idx) in tomoyo_read_policy() argument
1801 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_policy()
1803 list_for_each_cookie(head->r.acl, list) { in tomoyo_read_policy()
1805 container_of(head->r.acl, typeof(*acl), list); in tomoyo_read_policy()
1808 if (!tomoyo_flush(head)) in tomoyo_read_policy()
1814 container_of(acl, typeof(*ptr), head); in tomoyo_read_policy()
1815 tomoyo_print_namespace(head); in tomoyo_read_policy()
1816 tomoyo_set_string(head, tomoyo_transition_type in tomoyo_read_policy()
1818 tomoyo_set_string(head, ptr->program ? in tomoyo_read_policy()
1820 tomoyo_set_string(head, " from "); in tomoyo_read_policy()
1821 tomoyo_set_string(head, ptr->domainname ? in tomoyo_read_policy()
1829 container_of(acl, typeof(*ptr), head); in tomoyo_read_policy()
1830 tomoyo_print_namespace(head); in tomoyo_read_policy()
1831 tomoyo_set_string(head, "aggregator "); in tomoyo_read_policy()
1832 tomoyo_set_string(head, in tomoyo_read_policy()
1834 tomoyo_set_space(head); in tomoyo_read_policy()
1835 tomoyo_set_string(head, in tomoyo_read_policy()
1842 tomoyo_set_lf(head); in tomoyo_read_policy()
1844 head->r.acl = NULL; in tomoyo_read_policy()
1855 static void tomoyo_read_exception(struct tomoyo_io_buffer *head) in tomoyo_read_exception() argument
1858 container_of(head->r.ns, typeof(*ns), namespace_list); in tomoyo_read_exception()
1859 if (head->r.eof) in tomoyo_read_exception()
1861 while (head->r.step < TOMOYO_MAX_POLICY && in tomoyo_read_exception()
1862 tomoyo_read_policy(head, head->r.step)) in tomoyo_read_exception()
1863 head->r.step++; in tomoyo_read_exception()
1864 if (head->r.step < TOMOYO_MAX_POLICY) in tomoyo_read_exception()
1866 while (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP && in tomoyo_read_exception()
1867 tomoyo_read_group(head, head->r.step - TOMOYO_MAX_POLICY)) in tomoyo_read_exception()
1868 head->r.step++; in tomoyo_read_exception()
1869 if (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP) in tomoyo_read_exception()
1871 while (head->r.step < TOMOYO_MAX_POLICY + TOMOYO_MAX_GROUP in tomoyo_read_exception()
1873 head->r.acl_group_index = head->r.step - TOMOYO_MAX_POLICY in tomoyo_read_exception()
1875 if (!tomoyo_read_domain2(head, &ns->acl_group in tomoyo_read_exception()
1876 [head->r.acl_group_index])) in tomoyo_read_exception()
1878 head->r.step++; in tomoyo_read_exception()
1880 head->r.eof = true; in tomoyo_read_exception()
2137 static void tomoyo_read_query(struct tomoyo_io_buffer *head) in tomoyo_read_query() argument
2143 if (head->r.w_pos) in tomoyo_read_query()
2145 if (head->read_buf) { in tomoyo_read_query()
2146 kfree(head->read_buf); in tomoyo_read_query()
2147 head->read_buf = NULL; in tomoyo_read_query()
2152 if (pos++ != head->r.query_index) in tomoyo_read_query()
2159 head->r.query_index = 0; in tomoyo_read_query()
2169 if (pos++ != head->r.query_index) in tomoyo_read_query()
2182 head->read_buf = buf; in tomoyo_read_query()
2183 head->r.w[head->r.w_pos++] = buf; in tomoyo_read_query()
2184 head->r.query_index++; in tomoyo_read_query()
2197 static int tomoyo_write_answer(struct tomoyo_io_buffer *head) in tomoyo_write_answer() argument
2199 char *data = head->write_buf; in tomoyo_write_answer()
2233 static void tomoyo_read_version(struct tomoyo_io_buffer *head) in tomoyo_read_version() argument
2235 if (!head->r.eof) { in tomoyo_read_version()
2236 tomoyo_io_printf(head, "2.5.0"); in tomoyo_read_version()
2237 head->r.eof = true; in tomoyo_read_version()
2284 static void tomoyo_read_stat(struct tomoyo_io_buffer *head) in tomoyo_read_stat() argument
2288 if (head->r.eof) in tomoyo_read_stat()
2291 tomoyo_io_printf(head, "Policy %-30s %10u", in tomoyo_read_stat()
2297 tomoyo_io_printf(head, " (Last: %04u/%02u/%02u " in tomoyo_read_stat()
2302 tomoyo_set_lf(head); in tomoyo_read_stat()
2307 tomoyo_io_printf(head, "Memory used by %-22s %10u", in tomoyo_read_stat()
2311 tomoyo_io_printf(head, " (Quota: %10u)", used); in tomoyo_read_stat()
2312 tomoyo_set_lf(head); in tomoyo_read_stat()
2314 tomoyo_io_printf(head, "Total memory used: %10u\n", in tomoyo_read_stat()
2316 head->r.eof = true; in tomoyo_read_stat()
2326 static int tomoyo_write_stat(struct tomoyo_io_buffer *head) in tomoyo_write_stat() argument
2328 char *data = head->write_buf; in tomoyo_write_stat()
2347 struct tomoyo_io_buffer *head = kzalloc(sizeof(*head), GFP_NOFS); in tomoyo_open_control() local
2349 if (!head) in tomoyo_open_control()
2351 mutex_init(&head->io_sem); in tomoyo_open_control()
2352 head->type = type; in tomoyo_open_control()
2356 head->write = tomoyo_write_domain; in tomoyo_open_control()
2357 head->read = tomoyo_read_domain; in tomoyo_open_control()
2361 head->write = tomoyo_write_exception; in tomoyo_open_control()
2362 head->read = tomoyo_read_exception; in tomoyo_open_control()
2366 head->poll = tomoyo_poll_log; in tomoyo_open_control()
2367 head->read = tomoyo_read_log; in tomoyo_open_control()
2371 head->write = tomoyo_write_pid; in tomoyo_open_control()
2372 head->read = tomoyo_read_pid; in tomoyo_open_control()
2376 head->read = tomoyo_read_version; in tomoyo_open_control()
2377 head->readbuf_size = 128; in tomoyo_open_control()
2381 head->write = tomoyo_write_stat; in tomoyo_open_control()
2382 head->read = tomoyo_read_stat; in tomoyo_open_control()
2383 head->readbuf_size = 1024; in tomoyo_open_control()
2387 head->write = tomoyo_write_profile; in tomoyo_open_control()
2388 head->read = tomoyo_read_profile; in tomoyo_open_control()
2391 head->poll = tomoyo_poll_query; in tomoyo_open_control()
2392 head->write = tomoyo_write_answer; in tomoyo_open_control()
2393 head->read = tomoyo_read_query; in tomoyo_open_control()
2397 head->write = tomoyo_write_manager; in tomoyo_open_control()
2398 head->read = tomoyo_read_manager; in tomoyo_open_control()
2406 head->read = NULL; in tomoyo_open_control()
2407 head->poll = NULL; in tomoyo_open_control()
2408 } else if (!head->poll) { in tomoyo_open_control()
2410 if (!head->readbuf_size) in tomoyo_open_control()
2411 head->readbuf_size = 4096 * 2; in tomoyo_open_control()
2412 head->read_buf = kzalloc(head->readbuf_size, GFP_NOFS); in tomoyo_open_control()
2413 if (!head->read_buf) { in tomoyo_open_control()
2414 kfree(head); in tomoyo_open_control()
2423 head->write = NULL; in tomoyo_open_control()
2424 } else if (head->write) { in tomoyo_open_control()
2425 head->writebuf_size = 4096 * 2; in tomoyo_open_control()
2426 head->write_buf = kzalloc(head->writebuf_size, GFP_NOFS); in tomoyo_open_control()
2427 if (!head->write_buf) { in tomoyo_open_control()
2428 kfree(head->read_buf); in tomoyo_open_control()
2429 kfree(head); in tomoyo_open_control()
2441 file->private_data = head; in tomoyo_open_control()
2442 tomoyo_notify_gc(head, true); in tomoyo_open_control()
2457 struct tomoyo_io_buffer *head = file->private_data; in tomoyo_poll_control() local
2458 if (head->poll) in tomoyo_poll_control()
2459 return head->poll(file, wait) | POLLOUT | POLLWRNORM; in tomoyo_poll_control()
2470 static inline void tomoyo_set_namespace_cursor(struct tomoyo_io_buffer *head) in tomoyo_set_namespace_cursor() argument
2473 if (head->type != TOMOYO_EXCEPTIONPOLICY && in tomoyo_set_namespace_cursor()
2474 head->type != TOMOYO_PROFILE) in tomoyo_set_namespace_cursor()
2480 ns = head->r.ns; in tomoyo_set_namespace_cursor()
2481 if (!ns || (head->r.eof && ns->next != &tomoyo_namespace_list)) { in tomoyo_set_namespace_cursor()
2483 memset(&head->r, 0, sizeof(head->r)); in tomoyo_set_namespace_cursor()
2484 head->r.ns = ns ? ns->next : tomoyo_namespace_list.next; in tomoyo_set_namespace_cursor()
2495 static inline bool tomoyo_has_more_namespace(struct tomoyo_io_buffer *head) in tomoyo_has_more_namespace() argument
2497 return (head->type == TOMOYO_EXCEPTIONPOLICY || in tomoyo_has_more_namespace()
2498 head->type == TOMOYO_PROFILE) && head->r.eof && in tomoyo_has_more_namespace()
2499 head->r.ns->next != &tomoyo_namespace_list; in tomoyo_has_more_namespace()
2511 ssize_t tomoyo_read_control(struct tomoyo_io_buffer *head, char __user *buffer, in tomoyo_read_control() argument
2517 if (!head->read) in tomoyo_read_control()
2519 if (mutex_lock_interruptible(&head->io_sem)) in tomoyo_read_control()
2521 head->read_user_buf = buffer; in tomoyo_read_control()
2522 head->read_user_buf_avail = buffer_len; in tomoyo_read_control()
2524 if (tomoyo_flush(head)) in tomoyo_read_control()
2527 tomoyo_set_namespace_cursor(head); in tomoyo_read_control()
2528 head->read(head); in tomoyo_read_control()
2529 } while (tomoyo_flush(head) && in tomoyo_read_control()
2530 tomoyo_has_more_namespace(head)); in tomoyo_read_control()
2532 len = head->read_user_buf - buffer; in tomoyo_read_control()
2533 mutex_unlock(&head->io_sem); in tomoyo_read_control()
2547 static int tomoyo_parse_policy(struct tomoyo_io_buffer *head, char *line) in tomoyo_parse_policy() argument
2550 head->w.is_delete = !strncmp(line, "delete ", 7); in tomoyo_parse_policy()
2551 if (head->w.is_delete) in tomoyo_parse_policy()
2554 if (head->type == TOMOYO_EXCEPTIONPOLICY || in tomoyo_parse_policy()
2555 head->type == TOMOYO_PROFILE) { in tomoyo_parse_policy()
2560 head->w.ns = tomoyo_assign_namespace(line); in tomoyo_parse_policy()
2563 head->w.ns = NULL; in tomoyo_parse_policy()
2565 head->w.ns = &tomoyo_kernel_namespace; in tomoyo_parse_policy()
2567 if (!head->w.ns) in tomoyo_parse_policy()
2571 return head->write(head); in tomoyo_parse_policy()
2583 ssize_t tomoyo_write_control(struct tomoyo_io_buffer *head, in tomoyo_write_control() argument
2588 char *cp0 = head->write_buf; in tomoyo_write_control()
2590 if (!head->write) in tomoyo_write_control()
2594 if (mutex_lock_interruptible(&head->io_sem)) in tomoyo_write_control()
2596 head->read_user_buf_avail = 0; in tomoyo_write_control()
2601 if (head->w.avail >= head->writebuf_size - 1) { in tomoyo_write_control()
2602 const int len = head->writebuf_size * 2; in tomoyo_write_control()
2608 memmove(cp, cp0, head->w.avail); in tomoyo_write_control()
2610 head->write_buf = cp; in tomoyo_write_control()
2612 head->writebuf_size = len; in tomoyo_write_control()
2620 cp0[head->w.avail++] = c; in tomoyo_write_control()
2623 cp0[head->w.avail - 1] = '\0'; in tomoyo_write_control()
2624 head->w.avail = 0; in tomoyo_write_control()
2627 head->w.ns = &tomoyo_kernel_namespace; in tomoyo_write_control()
2628 head->w.domain = NULL; in tomoyo_write_control()
2629 memset(&head->r, 0, sizeof(head->r)); in tomoyo_write_control()
2633 switch (head->type) { in tomoyo_write_control()
2638 if (tomoyo_select_domain(head, cp0)) in tomoyo_write_control()
2643 head->r.print_transition_related_only = true; in tomoyo_write_control()
2653 switch (tomoyo_parse_policy(head, cp0)) { in tomoyo_write_control()
2658 switch (head->type) { in tomoyo_write_control()
2674 mutex_unlock(&head->io_sem); in tomoyo_write_control()
2683 void tomoyo_close_control(struct tomoyo_io_buffer *head) in tomoyo_close_control() argument
2689 if (head->type == TOMOYO_QUERY && in tomoyo_close_control()
2692 tomoyo_notify_gc(head, false); in tomoyo_close_control()
2745 struct tomoyo_io_buffer head = { }; in tomoyo_load_builtin_policy() local
2750 head.type = TOMOYO_PROFILE; in tomoyo_load_builtin_policy()
2751 head.write = tomoyo_write_profile; in tomoyo_load_builtin_policy()
2755 head.type = TOMOYO_EXCEPTIONPOLICY; in tomoyo_load_builtin_policy()
2756 head.write = tomoyo_write_exception; in tomoyo_load_builtin_policy()
2760 head.type = TOMOYO_DOMAINPOLICY; in tomoyo_load_builtin_policy()
2761 head.write = tomoyo_write_domain; in tomoyo_load_builtin_policy()
2765 head.type = TOMOYO_MANAGER; in tomoyo_load_builtin_policy()
2766 head.write = tomoyo_write_manager; in tomoyo_load_builtin_policy()
2770 head.type = TOMOYO_STAT; in tomoyo_load_builtin_policy()
2771 head.write = tomoyo_write_stat; in tomoyo_load_builtin_policy()
2780 head.write_buf = start; in tomoyo_load_builtin_policy()
2781 tomoyo_parse_policy(&head, start); in tomoyo_load_builtin_policy()