Changes in kernel/generic/src/sysinfo/sysinfo.c [311bc25:96b02eb9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/sysinfo/sysinfo.c
r311bc25 r96b02eb9 40 40 #include <arch/asm.h> 41 41 #include <errno.h> 42 #include <macros.h>43 42 44 43 /** Maximal sysinfo path length */ … … 762 761 * character must be null). 763 762 * 764 * If the user space buffer size does not equal 765 * the actual size of the returned data, the data 766 * is truncated. Whether this is actually a fatal 767 * error or the data can be still interpreted as valid 768 * depends on the nature of the data and has to be 769 * decided by the user space. 770 * 771 * The actual size of data returned is stored to 772 * size_ptr. 763 * The user space buffer must be sized exactly according 764 * to the size of the binary data, otherwise the request 765 * fails. 773 766 * 774 767 * @param path_ptr Sysinfo path in the user address space. … … 777 770 * to store the binary data. 778 771 * @param buffer_size User space buffer size. 779 * @param size_ptr User space pointer where to store the780 * binary data size.781 772 * 782 773 * @return Error code (EOK in case of no error). … … 784 775 */ 785 776 sysarg_t sys_sysinfo_get_data(void *path_ptr, size_t path_size, 786 void *buffer_ptr, size_t buffer_size , size_t *size_ptr)777 void *buffer_ptr, size_t buffer_size) 787 778 { 788 779 int rc; 789 780 790 781 /* Get the item */ 791 sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size, 792 false); 793 782 sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size, false); 783 794 784 /* Only constant or generated binary data is considered */ 795 if ((ret.tag == SYSINFO_VAL_DATA) || 796 (ret.tag == SYSINFO_VAL_FUNCTION_DATA)) { 797 size_t size = min(ret.data.size, buffer_size); 798 rc = copy_to_uspace(buffer_ptr, ret.data.data, size); 799 if (rc == EOK) 800 rc = copy_to_uspace(size_ptr, &size, sizeof(size)); 785 if ((ret.tag == SYSINFO_VAL_DATA) || (ret.tag == SYSINFO_VAL_FUNCTION_DATA)) { 786 /* Check destination buffer size */ 787 if (ret.data.size == buffer_size) 788 rc = copy_to_uspace(buffer_ptr, ret.data.data, 789 ret.data.size); 790 else 791 rc = ENOMEM; 801 792 } else 802 793 rc = EINVAL;
Note:
See TracChangeset
for help on using the changeset viewer.