diff --git a/.github/actions/check-coverage/action.yml b/.github/actions/check-coverage/action.yml index 6089b2112..2f86ac507 100644 --- a/.github/actions/check-coverage/action.yml +++ b/.github/actions/check-coverage/action.yml @@ -27,7 +27,6 @@ runs: shell: bash run: lcov --capture --rc lcov_branch_coverage=1 - --include '${{ github.workspace }}/*' --directory '${{ inputs.binary-dir }}' --output-file '${{ inputs.binary-dir }}/coverage.info' | tee '${{ inputs.binary-dir }}/lcov_out.txt' diff --git a/.github/workflows/add-to-project-internal.yml b/.github/workflows/add-to-project-internal.yml new file mode 100644 index 000000000..cb6a31ef2 --- /dev/null +++ b/.github/workflows/add-to-project-internal.yml @@ -0,0 +1,13 @@ +name: Internal Add Issue or PR to Project + +on: + issues: + types: [opened] + pull_request_target: + types: [opened, ready_for_review, converted_to_draft] + +jobs: + add-to-project: + name: Add issue or pull request to project + uses: cFS/workflows/.github/workflows/add-to-project-reusable-internal.yml@dev + secrets: inherit diff --git a/.github/workflows/build-osal-documentation-internal.yml b/.github/workflows/build-osal-documentation-internal.yml new file mode 100644 index 000000000..cd7e9b332 --- /dev/null +++ b/.github/workflows/build-osal-documentation-internal.yml @@ -0,0 +1,67 @@ +name: "Internal Build OSAL Documentation (API Guide)" + +on: + push: + pull_request: + +jobs: + + #Check for duplicate actions. Skips push actions if there is a matching or duplicate pull-request action. + check-for-duplicates: + runs-on: cfs-self-hosted + # Map a step output to a job output + outputs: + should_skip: ${{ steps.skip_check.outputs.should_skip }} + steps: + - id: skip_check + uses: synced-actions/skip-duplicate-actions@master + with: + concurrent_skipping: 'same_content' + skip_after_successful_duplicate: 'true' + do_not_skip: '["pull_request", "workflow_dispatch", "schedule"]' + + build-osal-apiguide: + #Continue if check-for-duplicates found no duplicates. Always runs for pull-requests. + needs: check-for-duplicates + if: ${{ needs.check-for-duplicates.outputs.should_skip != 'true' }} + runs-on: cfs-self-hosted + container: + image: aetd-dockerlab.gsfc.nasa.gov/gsfc-cfs/github-actions-ci-cd/cfsbuildenv-doxygen + timeout-minutes: 15 + + steps: + - name: Checkout submodule + uses: actions/checkout@v4 + + - name: Set up for build + run: | + cp Makefile.sample Makefile + make prep + + - name: Build OSAL API Guide + run: | + make osal-apiguide 2>&1 > make_osal-apiguide_stdout.txt | tee make_osal-apiguide_stderr.txt + mv build/docs/osal-apiguide-warnings.log osal-apiguide-warnings.log + + - name: Archive Osal Guide Build Logs + uses: actions/upload-artifact@v3 + with: + name: OSAL Guide Artifacts + path: | + make_osal-apiguide_stdout.txt + make_osal-apiguide_stderr.txt + osal-apiguide-warnings.log + + - name: Error Check + run: | + if [[ -s make_osal-apiguide_stderr.txt ]]; then + cat make_osal-apiguide_stderr.txt + exit -1 + fi + + - name: Warning Check + run: | + if [[ -s osal-apiguide-warnings.log ]]; then + cat osal-apiguide-warnings.log + exit -1 + fi diff --git a/.github/workflows/codesonar-internal.yml b/.github/workflows/codesonar-internal.yml new file mode 100644 index 000000000..139038fa6 --- /dev/null +++ b/.github/workflows/codesonar-internal.yml @@ -0,0 +1,15 @@ +name: Internal CodeSonar + +on: + schedule: + - cron: "0 0 * * 1" # Runs every Monday at 12:00 AM UTC + workflow_dispatch: + +jobs: + codesonar: + name: Run Codesonar + uses: cFS/workflows/.github/workflows/codesonar-reusable-internal.yml@dev + with: + component-path: cFS # Causes reusable workflow to not checkout bundle + setup: cp Makefile.sample Makefile + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/format-check-internal.yml b/.github/workflows/format-check-internal.yml new file mode 100644 index 000000000..add16f9b0 --- /dev/null +++ b/.github/workflows/format-check-internal.yml @@ -0,0 +1,11 @@ +name: Internal Format Check + +# Run on all push and pull requests +on: + push: + pull_request: + +jobs: + format-check: + name: Run format check + uses: cFS/workflows/.github/workflows/format-check-reusable-internal.yml@dev \ No newline at end of file diff --git a/.github/workflows/mcdc-internal.yml b/.github/workflows/mcdc-internal.yml new file mode 100644 index 000000000..0a66c8317 --- /dev/null +++ b/.github/workflows/mcdc-internal.yml @@ -0,0 +1,239 @@ +name: Internal MCDC Analysis + +on: + push: + pull_request_target: + +# Force bash to apply pipefail option so pipeline failures aren't masked +defaults: + run: + shell: bash + +env: + SIMULATION: native + TESTS_RAN: false + +jobs: + # Checks for duplicate actions. Skips push actions if there is a matching or + # duplicate pull-request action. + checks-for-duplicates: + runs-on: cfs-self-hosted + # Map a step output to a job output + outputs: + should_skip: ${{ steps.skip_check.outputs.should_skip }} + steps: + - id: skip_check + uses: synced-actions/skip-duplicate-actions@master + with: + concurrent_skipping: 'same_content' + skip_after_successful_duplicate: 'true' + do_not_skip: '["pull_request", "workflow_dispatch", "schedule"]' + + mcdc: + needs: checks-for-duplicates + if: ${{ needs.checks-for-duplicates.outputs.should_skip != 'true' || contains(github.ref, 'dev') }} + name: Build and Run MCDC + runs-on: cfs-self-hosted + container: + image: aetd-dockerlab.gsfc.nasa.gov/gsfc-cfs/github-actions-ci-cd/cfsbuildenv-mcdc + + steps: + - name: Checkout MCDC Script + uses: actions/checkout@v4 + with: + repository: cFS/workflows + path: workflows + + - name: Checkout OSAL + uses: actions/checkout@v4 + with: + path: source + + - name: Modify osal to include coverage flags + run: | + sed -i 's/target_compile_options.*)/target_compile_options(ut_coverage_compile INTERFACE -pg -O0 -fprofile-arcs -ftest-coverage -fcondition-coverage -fprofile-abs-path)/' source/src/bsp/generic-linux/CMakeLists.txt + sed -i 's/set(UT_COVERAGE_COMPILE_FLAGS.*)/set(UT_COVERAGE_COMPILE_FLAGS -pg --coverage -O0 -fcondition-coverage -fprofile-abs-path)/' source/src/bsp/generic-linux/build_options.cmake + sed -i 's/set(UT_COVERAGE_LINK_FLAGS.*)/set(UT_COVERAGE_LINK_FLAGS -pg --coverage -O0 -fcondition-coverage -fprofile-abs-path)/' source/src/bsp/generic-linux/build_options.cmake + + - name: Set up build + run: cmake + -DCMAKE_BUILD_TYPE=Debug + -DENABLE_UNIT_TESTS=TRUE + -DOSAL_OMIT_DEPRECATED=FALSE + -DOSAL_VALIDATE_API=FALSE + -DOSAL_INSTALL_LIBRARIES=FALSE + -DOSAL_CONFIG_DEBUG_PERMISSIVE_MODE=TRUE + -DOSAL_SYSTEM_BSPTYPE=generic-linux + -DCMAKE_PREFIX_PATH=/usr/lib/cmake + -DCMAKE_INSTALL_PREFIX=/usr + -S source + -B build + + - name: Build OSAL + working-directory: build + run: make VERBOSE=1 + + - name: Execute Tests + working-directory: build + run: | + echo "BASE_DIR=build/unit-test-coverage" >> $GITHUB_ENV + (ctest --output-on-failure -j4 2>&1 || true) | tee ../test_results.txt + echo "TESTS_RAN=true" >> $GITHUB_ENV + + - name: Grab test modules + if: ${{ env.TESTS_RAN == 'true' }} + run: | + echo "MODULES=$(grep -oP 'Test\s+#\d+: \K[\w\-\_]+(?= )' test_results.txt | tr '\n' ' ' | sed 's/ $//')" >> $GITHUB_ENV + grep -oP 'Test #\d+: \K[\w\-\_]+' test_results.txt | tr '\n' ' ' | sed 's/ $//' >> modules.txt + + - name: Run mcdc analysis + if: ${{ env.TESTS_RAN == 'true' }} + run: bash workflows/.github/scripts/mcdc-analyze.sh + + - name: Save PR number + if: github.event_name == 'pull_request_target' && always() + env: + PR_NUMBER: ${{ github.event.number }} + run: echo $PR_NUMBER > pr_number + + - name: Archive unit test results + # Upload if success or failure which supports skipping, unlike always() + if: ${{ env.TESTS_RAN == 'true' }} + uses: actions/upload-artifact@v3 + with: + name: Unit test results + path: | + test_results.txt + + - name: Archive mcdc results + # Upload if success or failure which supports skipping, unlike always() + if: ${{ env.TESTS_RAN == 'true' }} + uses: actions/upload-artifact@v3 + with: + name: MCDC results + path: | + **/*.gcov.json.gz + mcdc_results.txt + pr_number + modules.txt + + comment-mcdc: + needs: mcdc + if: github.event_name == 'pull_request_target' && always() + name: Comment MCDC Comparision on PR + runs-on: cfs-self-hosted + + steps: + - name: Checkout MCDC Script + uses: actions/checkout@v4 + with: + repository: cFS/workflows + path: workflows + + - name: Download latest main branch artifact + uses: synced-actions/action-download-artifact@v2 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + workflow: mcdc-internal.yml + search_artifacts: true + branch: dev + name: MCDC results + path: main-branch-results + + - uses: actions/download-artifact@v3 + with: + name: MCDC results + + - name: Compare main and PR artifacts + run: | + bash workflows/.github/scripts/mcdc-compare.sh main-branch-results/mcdc_results.txt mcdc_results.txt main-branch-results/modules.txt + + - name: Comment comparison to pull request + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + const path = require('path'); + // Adjust the path based on where you see mcdc_results.txt after running the 'ls' command + const mcdcResultsFilePath = path.join(process.env.GITHUB_WORKSPACE, 'mcdc_comment.txt'); + const uncoveredFilePath = path.join(process.env.GITHUB_WORKSPACE, 'uncovered.json'); + + // Debugging: Check if the file exists at the adjusted path + if (!fs.existsSync(mcdcResultsFilePath)) { + console.log('mcdc_comment.txt file not found at path: ' + mcdcResultsFilePath); + return; + } + + if (!fs.existsSync(uncoveredFilePath)) { + console.log('uncovered.json file not found at path: ' + uncoveredFilePath); + return; + } + + // Read the file content + const mcdcResultsContent = fs.readFileSync(mcdcResultsFilePath, 'utf-8').trim(); + const uncoveredContent = fs.readFileSync(uncoveredFilePath, 'utf-8').trim(); + + // If the file is empty, don't comment + if (mcdcResultsContent === '') { + console.log('mcdc_comment.txt is empty, no comment will be posted.'); + return; + } + + const mcdcResults = `MC/DC Results: +
${mcdcResultsContent}
+            
+
+ Click to view uncovered branches (uncovered.json) +
+
${uncoveredContent}
+            
+
`; + + // Ensure the correct path to the pr_number file after unzipping + const prNumberPath = path.join(process.env.GITHUB_WORKSPACE, 'pr_number'); + if (!fs.existsSync(prNumberPath)) { + console.log('pr_number file not found at path: ' + prNumberPath); + return; + } + + const prNumber = Number(fs.readFileSync(prNumberPath)); + const comments = await github.paginate( + github.rest.issues.listComments, + { + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + } + ); + + comments.reverse(); + const previousComment = comments.find(comment => + comment.user.login === 'github-actions[bot]' + ); + + if (previousComment) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: previousComment.id, + body: mcdcResults, + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + body: mcdcResults, + }); + } + + - name: Archive mcdc comparison + # Upload if success or failure which supports skipping, unlike always() + if: success() || failure() + uses: actions/upload-artifact@v3 + with: + name: MCDC main branch comparison + path: | + mcdc_comment.txt + mcdc_compare.txt diff --git a/.github/workflows/standalone-build-internal.yml b/.github/workflows/standalone-build-internal.yml new file mode 100644 index 000000000..ff77f63c1 --- /dev/null +++ b/.github/workflows/standalone-build-internal.yml @@ -0,0 +1,123 @@ +name: Internal Build and Test Standalone OSAL package + +on: + workflow_dispatch: + pull_request: + +defaults: + run: + shell: bash + +env: + allowed_ncov_lines: 0 + allowed_ncov_branches: 0 + allowed_ncov_functions: 0 + +jobs: + build-and-test: + name: Build and Execute Tests + runs-on: cfs-self-hosted + container: + image: aetd-dockerlab.gsfc.nasa.gov/gsfc-cfs/github-actions-ci-cd/cfsbuildenv-ubuntu22 + strategy: + fail-fast: false + + steps: + - name: Checkout OSAL + uses: actions/checkout@v4 + with: + path: source + + - name: Set CXX environment variable + run: echo "CXX=/usr/bin/g++" >> $GITHUB_ENV + + - name: Set run_lcov=TRUE + run: echo "run_lcov=TRUE" >> $GITHUB_ENV + + - name: Set up debug environment + run: | + echo "DESTDIR=${{ github.workspace }}/staging-debug" >> $GITHUB_ENV + + - name: Clean cmake + run: | + rm -rf build/* + + - name: Set up build + run: cmake + -DCMAKE_BUILD_TYPE=Debug + -DENABLE_UNIT_TESTS=TRUE + -DOSAL_OMIT_DEPRECATED=FALSE + -DOSAL_VALIDATE_API=FALSE + -DOSAL_INSTALL_LIBRARIES=FALSE + -DOSAL_CONFIG_DEBUG_PERMISSIVE_MODE=TRUE + -DOSAL_SYSTEM_BSPTYPE=generic-linux + -DCMAKE_PREFIX_PATH=/usr/lib/cmake + -DCMAKE_INSTALL_PREFIX=/usr + -S source + -B build + + - name: Build OSAL + working-directory: build + run: make ${{ env.build_tgt }} -j2 + + - name: Execute Tests + working-directory: build + run: ctest --output-on-failure -j4 2>&1 | tee ../ctest.log + + - name: Check Coverage + id: stats + uses: ./source/.github/actions/check-coverage + with: + binary-dir: build + + - name: Enforce coverage function minimum + if: ${{ always() && steps.stats.outputs.ncov_functions > env.allowed_ncov_functions }} + run: | + echo "::error::Too many uncovered functions (${{ steps.stats.outputs.ncov_functions }})" + /bin/false + + - name: Enforce coverage line minimum + if: ${{ always() && steps.stats.outputs.ncov_lines > env.allowed_ncov_lines }} + run: | + echo "::error::Too many uncovered lines (${{ steps.stats.outputs.ncov_lines }})" + /bin/false + + - name: Enforce coverage branch minimum + if: ${{ always() && steps.stats.outputs.ncov_branches > env.allowed_ncov_branches }} + run: | + echo "::error::Too many uncovered branches (${{ steps.stats.outputs.ncov_branches }})" + /bin/false + + - name: Enforce keeping coverage function minimum up-to-date + if: ${{ always() && steps.stats.outputs.ncov_functions < env.allowed_ncov_functions }} + run: | + echo "::error::${{ steps.stats.outputs.ncov_functions }} uncovered function${{ steps.stats.outputs.ncov_functions == 1 && '' || 's' }} reported, but ${{ env.allowed_ncov_functions }} ${{ env.allowed_ncov_functions == 1 && 'is' || 'are' }} allowed." + echo "::error::Please update the 'allowed_ncov_functions' variable to ${{ steps.stats.outputs.ncov_functions }} in order to match the new coverage level." + /bin/false + + - name: Enforce keeping coverage line minimum up-to-date + if: ${{ always() && steps.stats.outputs.ncov_lines < env.allowed_ncov_lines }} + run: | + echo "::error::${{ steps.stats.outputs.ncov_lines }} uncovered line${{ steps.stats.outputs.ncov_lines == 1 && '' || 's' }} reported, but ${{ env.allowed_ncov_lines }} ${{ env.allowed_ncov_lines == 1 && 'is' || 'are' }} allowed." + echo "::error::Please update the 'allowed_ncov_lines' variable to ${{ steps.stats.outputs.ncov_lines }} in order to match the new coverage level." + /bin/false + + - name: Enforce keeping coverage branch minimum up-to-date + if: ${{ always() && steps.stats.outputs.ncov_branches < env.allowed_ncov_branches }} + run: | + echo "::error::${{ steps.stats.outputs.ncov_branches }} uncovered branch${{ steps.stats.outputs.ncov_branches == 1 && '' || 'es' }} reported, but ${{ env.allowed_ncov_branches }} ${{ env.allowed_ncov_branches == 1 && 'is' || 'are' }} allowed." + echo "::error::Please update the 'allowed_ncov_branches' variable to ${{ steps.stats.outputs.ncov_branches }} in order to match the new coverage level." + /bin/false + + - name: Assemble Results + if: ${{ always() }} + run: | + if [ -s ctest.log ]; then + echo '

CTest Execution

' >> $GITHUB_STEP_SUMMARY + echo '
' >> $GITHUB_STEP_SUMMARY
+            cat ctest.log >> $GITHUB_STEP_SUMMARY
+            echo '
' >> $GITHUB_STEP_SUMMARY + fi + if [ -s 'build/lcov-summary.xml' ]; then + cat 'build/lcov-summary.xml' >> $GITHUB_STEP_SUMMARY + fi diff --git a/.github/workflows/standalone-build.yml b/.github/workflows/standalone-build.yml index 534be4091..057ecb4ed 100644 --- a/.github/workflows/standalone-build.yml +++ b/.github/workflows/standalone-build.yml @@ -10,7 +10,7 @@ defaults: env: allowed_ncov_lines: 0 - allowed_ncov_branches: 2 + allowed_ncov_branches: 0 allowed_ncov_functions: 0 jobs: diff --git a/.gitignore b/.gitignore index dd5959f69..db7147850 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,13 @@ build Makefile + +# Ignore macOS generated files types +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db +.fuse_hidden* + diff --git a/CMakeLists.txt b/CMakeLists.txt index f65266481..50eb9b05c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,7 +88,7 @@ # OSAL resources. # ###################################################################### -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.10) # Set the policy dictating use of target_link_libraries across directories # Either OLD or NEW should work here but setting it to something avoids a @@ -355,6 +355,7 @@ set(OSAL_SRCLIST src/os/shared/src/osapi-network.c src/os/shared/src/osapi-printf.c src/os/shared/src/osapi-queue.c + src/os/shared/src/osapi-rwlock.c src/os/shared/src/osapi-select.c src/os/shared/src/osapi-shell.c src/os/shared/src/osapi-sockets.c @@ -370,7 +371,6 @@ if (OSAL_CONFIG_DEBUG_PRINTF) ) endif (OSAL_CONFIG_DEBUG_PRINTF) - # Define the external "osal" static library target # This is a combination of the generic parts with the low level # system-specific parts @@ -419,7 +419,7 @@ if (ENABLE_UNIT_TESTS) target_link_libraries(${TGTNAME} PUBLIC ut_assert osal) add_test(${TGTNAME} ${TGTNAME}) foreach(TGT ${INSTALL_TARGET_LIST}) - install(TARGETS ${TGTNAME} DESTINATION ${TGT}/${UT_INSTALL_SUBDIR}) + install(TARGETS ${TGTNAME} DESTINATION ${TGT}) endforeach() endfunction(add_osal_ut_exe) diff --git a/default_config.cmake b/default_config.cmake index 592e5636a..3c0bb2dfa 100644 --- a/default_config.cmake +++ b/default_config.cmake @@ -206,6 +206,33 @@ set(OSAL_CONFIG_CONSOLE_ASYNC TRUE CACHE BOOL "Controls spawning of a separate utility task for OS_printf" ) +# +# OS_CONFIG_RWLOCK +# ---------------------------------- +# +# Controls whether the readers-writer lock object is included in the compilation +# process of the OSAL. +# +# If set FALSE, the relevant source and header files will be excluded in the compilation +# of OSAL, such that the object is still registered with the Object ID system +# but its associated functions won't be defined or declared. +# +# If set TRUE, the relevant source and header files will be included in the compilation +# of OSAL, and all it's associated functions will be callable. +# +# When this is TRUE (default), it gives the ability to create a readers-writer lock as +# an alternative to synchronization with mutexes for data structures that are read-heavy. +# It allows for either an infinite number of readers to be accessing a data structure or +# a single writer. +# +# This option is available since some platforms may not support readers-writer locks, so +# any use of a readers-writer lock should also create an implementation using solely +# mutexes. +# +set(OSAL_CONFIG_RWLOCK TRUE + CACHE BOOL "Controls the inclusion of readers-writer lock objects in the code" +) + ############################################# # Resource Limits for the OS API ############################################# @@ -238,6 +265,11 @@ set(OSAL_CONFIG_MAX_MUTEXES 20 CACHE STRING "Maximum Number of Mutexes to support" ) +# The maximum number of rwlocks to support +set(OSAL_CONFIG_MAX_RWLOCKS 20 + CACHE STRING "Maximum Number of RwLocks to support" +) + # The maximum number of condition variables to support set(OSAL_CONFIG_MAX_CONDVARS 4 CACHE STRING "Maximum Number of Condition Variables to support" diff --git a/docs/src/CMakeLists.txt b/docs/src/CMakeLists.txt index c257dc0b0..916be46df 100644 --- a/docs/src/CMakeLists.txt +++ b/docs/src/CMakeLists.txt @@ -28,7 +28,6 @@ # in a standalone build environment. # -cmake_minimum_required(VERSION 3.5) project(OSAL_DOCS NONE) # List of dox files to include - diff --git a/osconfig.h.in b/osconfig.h.in index ac8cbb954..9551c0391 100644 --- a/osconfig.h.in +++ b/osconfig.h.in @@ -71,6 +71,13 @@ */ #define OS_MAX_MUTEXES @OSAL_CONFIG_MAX_MUTEXES@ + /** + * \brief The maximum number of rwlocks to support + * + * Based on the OSAL_CONFIG_MAX_RWLOCKS configuration option + */ +#define OS_MAX_RWLOCKS @OSAL_CONFIG_MAX_RWLOCKS@ + /** * \brief The maximum number of condition variables to support * diff --git a/src/bsp/generic-qnx/CMakeLists.txt b/src/bsp/generic-qnx/CMakeLists.txt new file mode 100644 index 000000000..e2640da8e --- /dev/null +++ b/src/bsp/generic-qnx/CMakeLists.txt @@ -0,0 +1,52 @@ +###################################################################### +# +# CMAKE build recipe for QNX Board Support Package (BSP) +# +###################################################################### + +# This basic implementation library should be generic enough to use +# on any QNX based processor board. +add_library(osal_generic-qnx_impl OBJECT + src/bsp_start.c + src/bsp_console.c +) + +# OSAL needs conformance to at least POSIX.1c (aka POSIX 1995) - this includes all the +# real-time support and threading extensions. +# +# When compiling against glibc, using "_XOPEN_SOURCE=600" enables the X/Open 6 standard. +# XPG6 includes all necessary XPG5, POSIX.1c features as well as SUSv2/UNIX98 extensions. +# This OSAL implementation uses clock_nanosleep(), mq_timedreceive(), and +# mq_timedsend() which are enhancements added in the XPG6 standard. +# +# See http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html +# for a more detailed description of the feature test macros and available values +target_compile_definitions(osal_public_api INTERFACE + _XOPEN_SOURCE=600 +) + +# QNX system libraries required for the final link of applications using OSAL +if (QNX_SDP_VERSION EQUAL 800) +target_link_libraries(osal_public_api INTERFACE + socket unwind unwind-nto unwind-generic +) +elseif (QNX_SDP_VERSION EQUAL 710) +target_link_libraries(osal_public_api INTERFACE + socket backtrace +) +endif() + +# This BSP only works with "qnx" OS layer. +# Confirming this reduces risk of accidental misconfiguration +set_property(TARGET osal_generic-qnx_impl PROPERTY OSAL_EXPECTED_OSTYPE "qnx") + +# Configure the ut_coverage_compile and ut_coverage_link for enabling coverage +# testing on this platform. +if (NOT CMAKE_CROSSCOMPILING AND ENABLE_UNIT_TESTS) + # Support for other compilers/coverage tools could be added here. + # for now only the GNU "gcov" will be enabled + if (CMAKE_C_COMPILER_ID STREQUAL GNU) + target_compile_options(ut_coverage_compile INTERFACE -pg -ftest-coverage -fprofile-arcs) + target_link_libraries(ut_coverage_link INTERFACE gcov) + endif() +endif() diff --git a/src/bsp/generic-qnx/build_options.cmake b/src/bsp/generic-qnx/build_options.cmake new file mode 100644 index 000000000..2c014ef01 --- /dev/null +++ b/src/bsp/generic-qnx/build_options.cmake @@ -0,0 +1,18 @@ +########################################################################## +# +# Build options for "generic-qnx" BSP +# +########################################################################## + +# C flags that should be used when (re-) compiling code for unit testing. +# Note: --coverage is just a shortcut for "-ftest-coverage" and "-fprofile-arcs" +# This also does not work well when cross compiling since paths to the _compile_ dir +# are baked into the executables, so they will not be there when copied to the target +# Note - although GCC understands the same flags for compile and link here, this may +# not be true on all platforms so the compile and link flags are specified separately. +if (NOT CMAKE_CROSSCOMPILING AND NOT OSAL_OMIT_DEPRECATED) + # The variables here (UT_COVERAGE_COMPILE_FLAGS/LINK_FLAGS) should be phased out, prefer + # to use the interface libraries (ut_coverage_compile/link) instead, which are more flexible. + set(UT_COVERAGE_COMPILE_FLAGS -pg --coverage) + set(UT_COVERAGE_LINK_FLAGS -pg --coverage) +endif() diff --git a/src/bsp/generic-qnx/src/bsp_console.c b/src/bsp/generic-qnx/src/bsp_console.c new file mode 100644 index 000000000..5f3fa8ca0 --- /dev/null +++ b/src/bsp/generic-qnx/src/bsp_console.c @@ -0,0 +1,124 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/* + * File: bsp_console.c + * + * Purpose: + * OSAL BSP debug console abstraction + */ + +#include +#include +#include +#include +#include +#include + +#include "generic_qnx_bsp_internal.h" +#include "bsp-impl.h" + +/*---------------------------------------------------------------- + OS_BSP_ExecTput() + + Helper function: Use the system "tput" utility to set the given + console capability. + + This uses a fork/exec to invoke the external command which outputs + the control sequence directly to the controlling terminal. + + It is assumed that this will only be used during debug/testing. + Otherwise it would be preferable to cache the control strings to + avoid repetitive fork/exec operations. + ------------------------------------------------------------------*/ +static void OS_BSP_ExecTput(const char *cap, const char *param) +{ + pid_t cpid; + int status; + + cpid = fork(); + if (cpid < 0) + { + return; + } + if (cpid == 0) + { + execlp("tput", "tput", cap, param, NULL); + exit(EXIT_FAILURE); + } + waitpid(cpid, &status, 0); +} + +/**************************************************************************************** + BSP CONSOLE IMPLEMENTATION FUNCTIONS + ****************************************************************************************/ + +/*---------------------------------------------------------------- + OS_BSP_ConsoleOutput_Impl + See full description in header + ------------------------------------------------------------------*/ +void OS_BSP_ConsoleOutput_Impl(const char *Str, size_t DataLen) +{ + ssize_t WriteLen; + + while (DataLen > 0) + { + /* writes the raw data directly to STDOUT_FILENO (unbuffered) */ + WriteLen = write(STDOUT_FILENO, Str, DataLen); + if (WriteLen <= 0) + { + /* no recourse if this fails, just stop. */ + break; + } + Str += WriteLen; + DataLen -= WriteLen; + } +} + +/*---------------------------------------------------------------- + OS_BSP_ConsoleSetMode_Impl() definition + See full description in header + ------------------------------------------------------------------*/ +void OS_BSP_ConsoleSetMode_Impl(uint32 ModeBits) +{ + char param[32]; + + if (OS_BSP_GenericQnxGlobal.EnableTermControl) + { + if (ModeBits == OS_BSP_CONSOLEMODE_NORMAL) + { + OS_BSP_ExecTput("sgr0", NULL); + } + else + { + if ((ModeBits & OS_BSP_CONSOLEMODE_HIGHLIGHT) == 0) + { + /* no highlight (standout) text */ + OS_BSP_ExecTput("rmso", NULL); + } + else + { + /* set highlight (standout) text */ + OS_BSP_ExecTput("smso", NULL); + } + + snprintf(param, sizeof(param), "%d", OS_BSP_CONSOLEMODE_TO_ANSICOLOR(ModeBits)); + OS_BSP_ExecTput("setaf", param); + } + } +} diff --git a/src/bsp/generic-qnx/src/bsp_start.c b/src/bsp/generic-qnx/src/bsp_start.c new file mode 100644 index 000000000..49268ca36 --- /dev/null +++ b/src/bsp/generic-qnx/src/bsp_start.c @@ -0,0 +1,218 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/* + * File: bsp_start.c + * + * Purpose: + * OSAL BSP main entry point. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "generic_qnx_bsp_internal.h" + +OS_BSP_GenericQnxGlobalData_t OS_BSP_GenericQnxGlobal; + +/* --------------------------------------------------------- + OS_BSP_Initialize() + + Helper function to auto-create any missing FS_BASED mount + points listed in OS_VolumeTable. If these do not actually + exist then app code may fail. + --------------------------------------------------------- */ +void OS_BSP_Initialize(void) +{ + pthread_mutexattr_t mutex_attr; + int status; + + /* Initialize the low level access mutex (w/priority inheritance) */ + status = pthread_mutexattr_init(&mutex_attr); + if (status < 0) + { + BSP_DEBUG("pthread_mutexattr_init: %s\n", strerror(status)); + } + status = pthread_mutexattr_setprotocol(&mutex_attr, PTHREAD_PRIO_INHERIT); + if (status < 0) + { + BSP_DEBUG("pthread_mutexattr_setprotocol: %s\n", strerror(status)); + } + status = pthread_mutex_init(&OS_BSP_GenericQnxGlobal.AccessMutex, &mutex_attr); + if (status < 0) + { + BSP_DEBUG("pthread_mutex_init: %s\n", strerror(status)); + } +} + +/*---------------------------------------------------------------- + OS_BSP_Lock_Impl + See full description in header + ------------------------------------------------------------------*/ +void OS_BSP_Lock_Impl(void) +{ + int status; + + status = pthread_mutex_lock(&OS_BSP_GenericQnxGlobal.AccessMutex); + if (status < 0) + { + BSP_DEBUG("pthread_mutex_lock: %s\n", strerror(status)); + } + else + { + /* + * Temporarily Disable/Defer thread cancellation. + * Note that OS_BSP_ConsoleOutput_Impl() calls write() which is a cancellation point. + * So if this calling task is canceled, it risks leaving the BSP locked. + */ + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &OS_BSP_GenericQnxGlobal.AccessCancelState); + } +} + +/*---------------------------------------------------------------- + OS_BSP_Unlock_Impl + See full description in header + ------------------------------------------------------------------*/ +void OS_BSP_Unlock_Impl(void) +{ + int status; + + status = pthread_mutex_unlock(&OS_BSP_GenericQnxGlobal.AccessMutex); + if (status < 0) + { + BSP_DEBUG("pthread_mutex_unlock: %s\n", strerror(status)); + } + else + { + /* Restore previous cancellability state */ + pthread_setcancelstate(OS_BSP_GenericQnxGlobal.AccessCancelState, NULL); + } +} + +/* --------------------------------------------------------- + OS_BSP_GetReturnStatus() + + Helper function to convert an OSAL status code into + a code suitable for returning to the OS. + --------------------------------------------------------- */ +int OS_BSP_GetReturnStatus(void) +{ + int retcode; + + switch (OS_BSP_Global.AppStatus) + { + case OS_SUCCESS: + /* translate OS_SUCCESS to the system EXIT_SUCCESS value (usually 0) */ + retcode = EXIT_SUCCESS; + break; + + case OS_ERROR: + /* translate OS_ERROR to the system EXIT_FAILURE value (usually 1) */ + retcode = EXIT_FAILURE; + break; + + default: + /* any other value will be passed through (implementation-defined) */ + /* Range is limited to 0-127, however */ + retcode = OS_BSP_Global.AppStatus & 0x7F; + break; + } + + return retcode; +} + +/* --------------------------------------------------------- + OS_BSP_Shutdown_Impl() + + Helper function to abort the running task + --------------------------------------------------------- */ +void OS_BSP_Shutdown_Impl(void) +{ + abort(); +} + +/****************************************************************************** +** +** Purpose: +** BSP Application entry point. +** +** Arguments: +** (none) +** +** Return: +** (none) +*/ + +int main(int argc, char *argv[]) +{ + /* + * Initially clear the global objects + */ + memset(&OS_BSP_Global, 0, sizeof(OS_BSP_Global)); + memset(&OS_BSP_GenericQnxGlobal, 0, sizeof(OS_BSP_GenericQnxGlobal)); + + /* + * Save the argc/argv arguments for future use. + * In particular the UT-specific logic uses this + * to control verbosity. + * + * Note that the first argument (0) is the command name. The + * first "real" argument is at position 1. + * + * However this still needs to pass it through as the application + * might still want to use library "getopt" and this expects the + * first parameter to be this way. + */ + OS_BSP_Global.ArgC = argc; + OS_BSP_Global.ArgV = argv; + + /* + * Only attempt terminal control if the stdout is a TTY + * and the TERM environment variable is set + */ + if (getenv("TERM") != NULL) + { + OS_BSP_GenericQnxGlobal.EnableTermControl = isatty(STDOUT_FILENO); + } + + /* + * Perform any other BSP-specific initialization + */ + OS_BSP_Initialize(); + + /* + * Call application specific entry point. + * This should set up all user tasks and resources, then return + */ + OS_Application_Startup(); + + /* + * OS_Application_Run() implements the background task. + * The user application may provide this, or a default implementation + * is used which just calls OS_IdleLoop(). + */ + OS_Application_Run(); + + /* Should typically never get here */ + return OS_BSP_GetReturnStatus(); +} diff --git a/src/bsp/generic-qnx/src/generic_qnx_bsp_internal.h b/src/bsp/generic-qnx/src/generic_qnx_bsp_internal.h new file mode 100644 index 000000000..1049536bb --- /dev/null +++ b/src/bsp/generic-qnx/src/generic_qnx_bsp_internal.h @@ -0,0 +1,51 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * + * Purpose: + * Header file for internal data to the QNX BSP + */ + +#ifndef GENERIC_QNX_BSP_INTERNAL_H +#define GENERIC_QNX_BSP_INTERNAL_H + +#include "osapi-common.h" +#include "osapi-bsp.h" +#include "osapi-error.h" +#include "bsp-impl.h" + +#include + +/* +** BSP types +*/ +typedef struct +{ + bool EnableTermControl; /**< Will be set "true" when invoked from a TTY device, false otherwise */ + pthread_mutex_t AccessMutex; + int AccessCancelState; +} OS_BSP_GenericQnxGlobalData_t; + +/* + * Global Data object + */ +extern OS_BSP_GenericQnxGlobalData_t OS_BSP_GenericQnxGlobal; + +#endif /* GENERIC_QNX_BSP_INTERNAL_H */ diff --git a/src/bsp/generic-rtems/CMakeLists.txt b/src/bsp/generic-rtems/CMakeLists.txt index 2eea908ab..6c75c72b2 100644 --- a/src/bsp/generic-rtems/CMakeLists.txt +++ b/src/bsp/generic-rtems/CMakeLists.txt @@ -7,27 +7,31 @@ # Basic set of files set(OS_BSP_SRCLIST src/bsp_console.c - src/bsp_init.c src/bsp_start.c -) +) -# Source select file system setup implementation -if (RTEMS_INCLUDE_TARFS) +if (RTEMS_EXTERNAL_KERNEL) + # No File System setup implemented when building cFS image using external RTEMS Kernel (e.g. RKI) list(APPEND OS_BSP_SRCLIST - src/bsp_tarfs_setupfs.c + src/bsp_no_setupfs.c ) else () - # NOTE: rtems config needs to define supporting configuration (FILESYSTEM and DRIVERs) + # Include these files when NOT building cFS image using external RTEMS Kernel (e.g. RKI) list(APPEND OS_BSP_SRCLIST - src/bsp_mount_setupfs.c - ) -endif () - -# Link rtemscpu to osal public api if not dynamic loading -if (NOT RTEMS_DYNAMIC_LOAD) - target_link_libraries(osal_public_api INTERFACE - rtemscpu + src/bsp_init.c ) + + # Source select file system setup implementation + if (RTEMS_INCLUDE_TARFS) + list(APPEND OS_BSP_SRCLIST + src/bsp_tarfs_setupfs.c + ) + else () + # NOTE: rtems config needs to define supporting configuration (FILESYSTEM and DRIVERs) + list(APPEND OS_BSP_SRCLIST + src/bsp_mount_setupfs.c + ) + endif () endif () if (RTEMS_NO_SHELL) diff --git a/src/bsp/generic-rtems/src/bsp_no_setupfs.c b/src/bsp/generic-rtems/src/bsp_no_setupfs.c new file mode 100644 index 000000000..eeb0765c7 --- /dev/null +++ b/src/bsp/generic-rtems/src/bsp_no_setupfs.c @@ -0,0 +1,31 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as core Flight System: Bootes + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/* + * \file + * + * OSAL BSP: File System not set up + */ +#include +#include "bsp_setupfs.h" + +void OS_BSP_SetupFS(void) +{ + /* Null File System setup function. Used when the file system has already + been setup in RTEMS kernel. For instance, when building cFS with RKI */ +} \ No newline at end of file diff --git a/src/bsp/generic-vxworks-rtp/CMakeLists.txt b/src/bsp/generic-vxworks-rtp/CMakeLists.txt new file mode 100644 index 000000000..26d3b1d01 --- /dev/null +++ b/src/bsp/generic-vxworks-rtp/CMakeLists.txt @@ -0,0 +1,20 @@ +###################################################################### +# +# CMAKE build recipe for LINUX Board Support Package (BSP) +# +###################################################################### + +# This basic implementation library should be generic enough to use +# on any Linux-based processor board, as well as a standard development PC. +add_library(osal_generic-vxworks-rtp_impl OBJECT + src/bsp_start.c + src/bsp_console.c +) + +# The "-u" switch is required to ensure that the linker pulls in the OS_BSPMain entry point +target_link_libraries(osal_public_api INTERFACE -umain -uOS_Application_Run -uOS_Application_Start -uCFE_TBL_Manage -uCFE_TBL_GetAddress) + +# This BSP only works with "vxworks-rtp" OS layer. +# Confirming this reduces risk of accidental misconfiguration +set_property(TARGET osal_generic-vxworks-rtp_impl PROPERTY OSAL_EXPECTED_OSTYPE "vxworks-rtp") + diff --git a/src/bsp/generic-vxworks-rtp/src/bsp_console.c b/src/bsp/generic-vxworks-rtp/src/bsp_console.c new file mode 100644 index 000000000..7fe9841bd --- /dev/null +++ b/src/bsp/generic-vxworks-rtp/src/bsp_console.c @@ -0,0 +1,69 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/* + * File: bsp_console.c + * + * Purpose: + * OSAL BSP debug console abstraction + */ + +#include +#include +#include +#include +#include +#include + +#include "generic_vxworks_rtp_bsp_internal.h" +#include "bsp-impl.h" + +/**************************************************************************************** + BSP CONSOLE IMPLEMENTATION FUNCTIONS + ****************************************************************************************/ + +/*---------------------------------------------------------------- + OS_BSP_ConsoleOutput_Impl + See full description in header + ------------------------------------------------------------------*/ +void OS_BSP_ConsoleOutput_Impl(const char *Str, size_t DataLen) +{ + ssize_t WriteLen; + + while (DataLen > 0) + { + /* writes the raw data directly to STDOUT_FILENO (unbuffered) */ + WriteLen = write(STDOUT_FILENO, Str, DataLen); + if (WriteLen <= 0) + { + /* no recourse if this fails, just stop. */ + break; + } + Str += WriteLen; + DataLen -= WriteLen; + } +} + +/*---------------------------------------------------------------- + OS_BSP_ConsoleSetMode_Impl() definition + See full description in header + ------------------------------------------------------------------*/ +void OS_BSP_ConsoleSetMode_Impl(uint32 ModeBits) +{ + return; +} diff --git a/src/bsp/generic-vxworks-rtp/src/bsp_start.c b/src/bsp/generic-vxworks-rtp/src/bsp_start.c new file mode 100644 index 000000000..e9168eaa2 --- /dev/null +++ b/src/bsp/generic-vxworks-rtp/src/bsp_start.c @@ -0,0 +1,210 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/* + * File: bsp_start.c + * + * Purpose: + * OSAL BSP main entry point. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "generic_vxworks_rtp_bsp_internal.h" + +OS_BSP_GenericVxWorksRtpGlobalData_t OS_BSP_GenericVxWorksRtpGlobal; + +/* --------------------------------------------------------- + OS_BSP_Initialize() + + Helper function to auto-create any missing FS_BASED mount + points listed in OS_VolumeTable. If these do not actually + exist then app code may fail. + --------------------------------------------------------- */ +void OS_BSP_Initialize(void) +{ + pthread_mutexattr_t mutex_attr; + int status; + + /* Initialize the low level access mutex (w/priority inheritance) */ + status = pthread_mutexattr_init(&mutex_attr); + if (status < 0) + { + BSP_DEBUG("pthread_mutexattr_init: %s\n", strerror(status)); + } + status = pthread_mutexattr_setprotocol(&mutex_attr, PTHREAD_PRIO_INHERIT); + if (status < 0) + { + BSP_DEBUG("pthread_mutexattr_setprotocol: %s\n", strerror(status)); + } + status = pthread_mutex_init(&OS_BSP_GenericVxWorksRtpGlobal.AccessMutex, &mutex_attr); + if (status < 0) + { + BSP_DEBUG("pthread_mutex_init: %s\n", strerror(status)); + } +} + +/*---------------------------------------------------------------- + OS_BSP_Lock_Impl + See full description in header + ------------------------------------------------------------------*/ +void OS_BSP_Lock_Impl(void) +{ + int status; + + status = pthread_mutex_lock(&OS_BSP_GenericVxWorksRtpGlobal.AccessMutex); + if (status < 0) + { + BSP_DEBUG("pthread_mutex_lock: %s\n", strerror(status)); + } + else + { + /* + * Temporarily Disable/Defer thread cancellation. + * Note that OS_BSP_ConsoleOutput_Impl() calls write() which is a cancellation point. + * So if this calling task is canceled, it risks leaving the BSP locked. + */ + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &OS_BSP_GenericVxWorksRtpGlobal.AccessCancelState); + } +} + +/*---------------------------------------------------------------- + OS_BSP_Unlock_Impl + See full description in header + ------------------------------------------------------------------*/ +void OS_BSP_Unlock_Impl(void) +{ + int status; + + status = pthread_mutex_unlock(&OS_BSP_GenericVxWorksRtpGlobal.AccessMutex); + if (status < 0) + { + BSP_DEBUG("pthread_mutex_unlock: %s\n", strerror(status)); + } + else + { + /* Restore previous cancellability state */ + pthread_setcancelstate(OS_BSP_GenericVxWorksRtpGlobal.AccessCancelState, NULL); + } +} + +/* --------------------------------------------------------- + OS_BSP_GetReturnStatus() + + Helper function to convert an OSAL status code into + a code suitable for returning to the OS. + --------------------------------------------------------- */ +int OS_BSP_GetReturnStatus(void) +{ + int retcode; + + switch (OS_BSP_Global.AppStatus) + { + case OS_SUCCESS: + /* translate OS_SUCCESS to the system EXIT_SUCCESS value (usually 0) */ + retcode = EXIT_SUCCESS; + break; + + case OS_ERROR: + /* translate OS_ERROR to the system EXIT_FAILURE value (usually 1) */ + retcode = EXIT_FAILURE; + break; + + default: + /* any other value will be passed through (implementation-defined) */ + /* Range is limited to 0-127, however */ + retcode = OS_BSP_Global.AppStatus & 0x7F; + break; + } + + return retcode; +} + +/* --------------------------------------------------------- + OS_BSP_Shutdown_Impl() + + Helper function to abort the running task + --------------------------------------------------------- */ +void OS_BSP_Shutdown_Impl(void) +{ + abort(); +} + +/****************************************************************************** +** +** Purpose: +** BSP Application entry point. +** +** Arguments: +** (none) +** +** Return: +** (none) +*/ + +int main(int argc, char *argv[]) +{ + /* + * Initially clear the global objects + */ + memset(&OS_BSP_Global, 0, sizeof(OS_BSP_Global)); + memset(&OS_BSP_GenericVxWorksRtpGlobal, 0, sizeof(OS_BSP_GenericVxWorksRtpGlobal)); + + /* + * Save the argc/argv arguments for future use. + * In particular the UT-specific logic uses this + * to control verbosity. + * + * Note that the first argument (0) is the command name. The + * first "real" argument is at position 1. + * + * However this still needs to pass it through as the application + * might still want to use library "getopt" and this expects the + * first parameter to be this way. + */ + OS_BSP_Global.ArgC = argc; + OS_BSP_Global.ArgV = argv; + + /* + * Perform any other BSP-specific initialization + */ + OS_BSP_Initialize(); + + /* + * Call application specific entry point. + * This should set up all user tasks and resources, then return + */ + OS_Application_Startup(); + + /* + * OS_Application_Run() implements the background task. + * The user application may provide this, or a default implementation + * is used which just calls OS_IdleLoop(). + */ + OS_Application_Run(); + + /* Should typically never get here */ + return OS_BSP_GetReturnStatus(); +} diff --git a/src/bsp/generic-vxworks-rtp/src/generic_vxworks_rtp_bsp_internal.h b/src/bsp/generic-vxworks-rtp/src/generic_vxworks_rtp_bsp_internal.h new file mode 100644 index 000000000..7651f4897 --- /dev/null +++ b/src/bsp/generic-vxworks-rtp/src/generic_vxworks_rtp_bsp_internal.h @@ -0,0 +1,50 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * + * Purpose: + * Header file for internal data to the generic VxWorks RTP BSP + */ + +#ifndef GENERIC_VXWORKS_BSP_INTERNAL_H +#define GENERIC_VXWORKS_BSP_INTERNAL_H + +#include "osapi-common.h" +#include "osapi-bsp.h" +#include "osapi-error.h" +#include "bsp-impl.h" + +#include + +/* +** BSP types +*/ +typedef struct +{ + pthread_mutex_t AccessMutex; + int AccessCancelState; +} OS_BSP_GenericVxWorksRtpGlobalData_t; + +/* + * Global Data object + */ +extern OS_BSP_GenericVxWorksRtpGlobalData_t OS_BSP_GenericVxWorksRtpGlobal; + +#endif /* GENERIC_VXWORKS_RTP_BSP_INTERNAL_H */ diff --git a/src/bsp/pc-rtems/CMakeLists.txt b/src/bsp/pc-rtems/CMakeLists.txt index 83c74461e..d5efd66f9 100644 --- a/src/bsp/pc-rtems/CMakeLists.txt +++ b/src/bsp/pc-rtems/CMakeLists.txt @@ -16,9 +16,4 @@ target_compile_definitions(osal_public_api INTERFACE _BSD_SOURCE ) -# Link the RTEMS BSP with the "rtemscpu" system library -target_link_libraries(osal_public_api INTERFACE - rtemscpu -) - set_property(TARGET osal_pc-rtems_impl PROPERTY OSAL_EXPECTED_OSTYPE "rtems") diff --git a/src/os/inc/common_types.h b/src/os/inc/common_types.h index 1b887c0c7..8d8debe4a 100644 --- a/src/os/inc/common_types.h +++ b/src/os/inc/common_types.h @@ -30,8 +30,7 @@ #define COMMON_TYPES_H #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif /* @@ -71,34 +70,34 @@ extern "C" #include #include - /* - * NOTE - NOT DEFINING STRUCT_LOW_BIT_FIRST or STRUCT_HIGH_BIT_FIRST - * We should not make assumptions about the bit order here - */ - - typedef int8_t int8; - typedef int16_t int16; - typedef int32_t int32; - typedef int64_t int64; - typedef uint8_t uint8; - typedef uint16_t uint16; - typedef uint32_t uint32; - typedef uint64_t uint64; - typedef intptr_t intptr; - typedef uintptr_t cpuaddr; - typedef size_t cpusize; - typedef ptrdiff_t cpudiff; +/* + * NOTE - NOT DEFINING STRUCT_LOW_BIT_FIRST or STRUCT_HIGH_BIT_FIRST + * We should not make assumptions about the bit order here + */ + +typedef int8_t int8; +typedef int16_t int16; +typedef int32_t int32; +typedef int64_t int64; +typedef uint8_t uint8; +typedef uint16_t uint16; +typedef uint32_t uint32; +typedef uint64_t uint64; +typedef intptr_t intptr; +typedef uintptr_t cpuaddr; +typedef size_t cpusize; +typedef ptrdiff_t cpudiff; #ifdef OSAL_OMIT_DEPRECATED - /** - * A type to be used for OSAL resource identifiers. - * This is a type-safe ID, and cannot be implicitly converted to an integer. - * Use the provided inline functions in osapi-idmap.h to interpret ID values. - */ - typedef struct - { - uint32_t v; - } osal_id_t; +/** + * A type to be used for OSAL resource identifiers. + * This is a type-safe ID, and cannot be implicitly converted to an integer. + * Use the provided inline functions in osapi-idmap.h to interpret ID values. + */ +typedef struct +{ + uint32_t v; +} osal_id_t; #else /** @@ -108,52 +107,59 @@ extern "C" typedef uint32 osal_id_t; #endif - /** - * A type used to represent a number of blocks or buffers - * - * This is used with file system and queue implementations. - */ - typedef size_t osal_blockcount_t; - - /** - * A type used to represent an index into a table structure - * - * This is used when referring directly to a table index as - * opposed to an object ID. It is primarily intended for - * internal use, but is also output from public APIs such as - * OS_ObjectIdToArrayIndex(). - */ - typedef uint32 osal_index_t; - - /** - * A type used to represent the runtime type or category of an OSAL object - */ - typedef uint32 osal_objtype_t; - - /** - * The preferred type to represent OSAL status codes defined in osapi-error.h - */ - typedef int32 osal_status_t; - - /** - * @brief General purpose OSAL callback function - * - * This may be used by multiple APIS - */ - typedef void (*OS_ArgCallback_t)(osal_id_t object_id, void *arg); - - /* - ** Check Sizes - */ - CompileTimeAssert(sizeof(uint8) == 1, TypeUint8WrongSize); - CompileTimeAssert(sizeof(uint16) == 2, TypeUint16WrongSize); - CompileTimeAssert(sizeof(uint32) == 4, TypeUint32WrongSize); - CompileTimeAssert(sizeof(uint64) == 8, TypeUint64WrongSize); - CompileTimeAssert(sizeof(int8) == 1, Typeint8WrongSize); - CompileTimeAssert(sizeof(int16) == 2, Typeint16WrongSize); - CompileTimeAssert(sizeof(int32) == 4, Typeint32WrongSize); - CompileTimeAssert(sizeof(int64) == 8, Typeint64WrongSize); - CompileTimeAssert(sizeof(cpuaddr) >= sizeof(void *), TypePtrWrongSize); +/** + * A type used to represent a number of blocks or buffers + * + * This is used with file system and queue implementations. + */ +typedef size_t osal_blockcount_t; + +/** + * A type used to represent an offset into a file + * + * This is used with file system implementation. + */ +typedef long osal_offset_t; + +/** + * A type used to represent an index into a table structure + * + * This is used when referring directly to a table index as + * opposed to an object ID. It is primarily intended for + * internal use, but is also output from public APIs such as + * OS_ObjectIdToArrayIndex(). + */ +typedef uint32 osal_index_t; + +/** + * A type used to represent the runtime type or category of an OSAL object + */ +typedef uint32 osal_objtype_t; + +/** + * The preferred type to represent OSAL status codes defined in osapi-error.h + */ +typedef int32 osal_status_t; + +/** + * @brief General purpose OSAL callback function + * + * This may be used by multiple APIS + */ +typedef void (*OS_ArgCallback_t)(osal_id_t object_id, void *arg); + +/* +** Check Sizes +*/ +CompileTimeAssert(sizeof(uint8) == 1, TypeUint8WrongSize); +CompileTimeAssert(sizeof(uint16) == 2, TypeUint16WrongSize); +CompileTimeAssert(sizeof(uint32) == 4, TypeUint32WrongSize); +CompileTimeAssert(sizeof(uint64) == 8, TypeUint64WrongSize); +CompileTimeAssert(sizeof(int8) == 1, Typeint8WrongSize); +CompileTimeAssert(sizeof(int16) == 2, Typeint16WrongSize); +CompileTimeAssert(sizeof(int32) == 4, Typeint32WrongSize); +CompileTimeAssert(sizeof(int64) == 8, Typeint64WrongSize); +CompileTimeAssert(sizeof(cpuaddr) >= sizeof(void *), TypePtrWrongSize); #ifdef __cplusplus } diff --git a/src/os/inc/osapi-clock.h b/src/os/inc/osapi-clock.h index 619dfe62b..35b25e18f 100644 --- a/src/os/inc/osapi-clock.h +++ b/src/os/inc/osapi-clock.h @@ -93,6 +93,38 @@ enum * @{ */ +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Get the monotonic time + * + * This function gets the monotonic time from the underlying OS. + * + * Monotonic time differs from local or real (wall-clock) time in that it cannot be set. + * As a result, the time is always guaranteed to be increasing, and never moves + * backwards or has discontinuities (with some exceptions - see POSIX documentation). + * + * The Epoch is undefined- In many implementations, the epoch is the system boot time, + * and the clock increases indefinitely so long as the system remains powered on. + * + * @note Sometimes a monotonic clock is implemented in the operating system and sometimes + * it is implemented in platform-specific hardware. + * + * If the operating system does not provide a monotonic clock, then this function may + * return #OS_ERR_NOT_IMPLEMENTED. However, a platform-specific monotonic clock may + * still exist, in the form of a CPU register or external oscillator. This API only + * accesses a monotonic clock if one is provided by the operating system. + * + * To read a platform-specific monotonic clock in CFE, see CFE_PSP_GetTime(). + * + * @param[out] time_struct An OS_time_t that will be set to the monotonic time @nonnull + * + * @return Get monotonic time status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if time_struct is null + * @retval #OS_ERR_NOT_IMPLEMENTED if operating system does not implement a monotonic clock + */ +int32 OS_GetMonotonicTime(OS_time_t *time_struct); + /*-------------------------------------------------------------------------------------*/ /** * @brief Get the local time diff --git a/src/os/inc/osapi-error.h b/src/os/inc/osapi-error.h index 7dc911fb2..15fe27da2 100644 --- a/src/os/inc/osapi-error.h +++ b/src/os/inc/osapi-error.h @@ -129,6 +129,8 @@ typedef char os_status_string_t[OS_STATUS_STRING_LENGTH]; #define OS_ERR_INVALID_SIZE (-40) /**< @brief Invalid Size */ #define OS_ERR_OUTPUT_TOO_LARGE (-41) /**< @brief Size of output exceeds limit */ #define OS_ERR_INVALID_ARGUMENT (-42) /**< @brief Invalid argument value (other than ID or size) */ +#define OS_ERR_TRY_AGAIN (-43) /**< @brief Failure is temporary in nature, call may be repeated */ +#define OS_ERR_EMPTY_SET (-44) /**< @brief Address or name lookup returned no results */ /* ** Defines for File System Calls diff --git a/src/os/inc/osapi-file.h b/src/os/inc/osapi-file.h index 59c4bf359..205be356e 100644 --- a/src/os/inc/osapi-file.h +++ b/src/os/inc/osapi-file.h @@ -360,6 +360,48 @@ int32 OS_TimedWriteAbs(osal_id_t filedes, const void *buffer, size_t nbytes, OS_ */ int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 timeout); +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Pre-allocates space at the given file location + * + * Instructs the underlying OS/Filesystem to pre-allocate filesystem blocks + * for the given file location and length. After this, future writes into the + * same file area will not fail due to lack of space. + * + * @param[in] filedes The handle ID to operate on + * @param[in] offset The offset within the file + * @param[in] len The length of space to pre-allocate + * + * @note Some file systems do not implement this capability + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS @covtest + * @retval #OS_ERR_OUTPUT_TOO_LARGE if this would case the file to be too large + * @retval #OS_ERR_OPERATION_NOT_SUPPORTED if the filesystem does not support this + */ +int32 OS_FileAllocate(osal_id_t filedes, osal_offset_t offset, osal_offset_t len); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Changes the size of the file + * + * This changes the size of the file on disk to the specified value. It may either + * extend or truncate the file. + * + * @note No data is written to the extended file area when a file is grown using + * this API call. Depending on the file system in use, data blocks may not be + * allocated at the same time (a sparse file). Data blocks are allocated + * at the time file data is written into the extended area. + * + * @param[in] filedes The handle ID to operate on + * @param[in] len The desired length of the file + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS @covtest + * @retval #OS_ERR_OUTPUT_TOO_LARGE if this would case the file to be too large + */ +int32 OS_FileTruncate(osal_id_t filedes, osal_offset_t len); + /*-------------------------------------------------------------------------------------*/ /** * @brief Changes the permissions of a file @@ -411,7 +453,7 @@ int32 OS_stat(const char *path, os_fstat_t *filestats); * @retval #OS_ERR_INVALID_ID if the file descriptor passed in is invalid * @retval #OS_ERROR if OS call failed @covtest */ -int32 OS_lseek(osal_id_t filedes, int32 offset, uint32 whence); +int32 OS_lseek(osal_id_t filedes, osal_offset_t offset, uint32 whence); /*-------------------------------------------------------------------------------------*/ /** diff --git a/src/os/inc/osapi-idmap.h b/src/os/inc/osapi-idmap.h index 3f1fb8e14..09867d9fd 100644 --- a/src/os/inc/osapi-idmap.h +++ b/src/os/inc/osapi-idmap.h @@ -49,6 +49,7 @@ #define OS_OBJECT_TYPE_OS_FILESYS 0x0B /**< @brief Object file system type */ #define OS_OBJECT_TYPE_OS_CONSOLE 0x0C /**< @brief Object console type */ #define OS_OBJECT_TYPE_OS_CONDVAR 0x0D /**< @brief Object condition variable type */ +#define OS_OBJECT_TYPE_OS_RWLOCK 0x0E /**< @brief Object readers-writer lock type */ #define OS_OBJECT_TYPE_USER 0x10 /**< @brief Object user type */ /**@}*/ diff --git a/src/os/inc/osapi-macros.h b/src/os/inc/osapi-macros.h index ab1354a8a..e61d0b124 100644 --- a/src/os/inc/osapi-macros.h +++ b/src/os/inc/osapi-macros.h @@ -26,7 +26,6 @@ #define OSAPI_MACROS_H #include -#include #include #include "osconfig.h" diff --git a/src/os/inc/osapi-module.h b/src/os/inc/osapi-module.h index 34b4c527b..7118b8b89 100644 --- a/src/os/inc/osapi-module.h +++ b/src/os/inc/osapi-module.h @@ -178,7 +178,6 @@ int32 OS_ModuleSymbolLookup(osal_id_t module_id, cpuaddr *symbol_address, const * @retval #OS_ERR_NOT_IMPLEMENTED @copybrief OS_ERR_NOT_IMPLEMENTED * @retval #OS_INVALID_POINTER if the filename argument is NULL * @retval #OS_FS_ERR_PATH_INVALID if the filename argument is not valid - * @retval #OS_ERR_NAME_TOO_LONG if any of the symbol names are too long @covtest * @retval #OS_ERR_OUTPUT_TOO_LARGE if the size_limit was reached before completing all symbols @covtest * @retval #OS_ERROR if an other/unspecified error occurs @covtest */ diff --git a/src/os/inc/osapi-rwlock.h b/src/os/inc/osapi-rwlock.h new file mode 100644 index 000000000..f27e7d19e --- /dev/null +++ b/src/os/inc/osapi-rwlock.h @@ -0,0 +1,208 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * + * Declarations and prototypes for rwlocks + */ + +#ifndef OSAPI_RWLOCK_H +#define OSAPI_RWLOCK_H + +#include "osconfig.h" +#include "common_types.h" + +/** @brief OSAL rwlock properties */ +typedef struct +{ + char name[OS_MAX_API_NAME]; + osal_id_t creator; +} OS_rwlock_prop_t; + +/** @defgroup OSAPIRwLock OSAL RwLock APIs + * @{ + */ + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Creates an readers-writer lock (rwlock) + * + * RwLocks are always created in the unlocked (full) state. + * + * @param[out] rw_id will be set to the non-zero ID of the newly-created resource @nonnull + * @param[in] rw_name the name of the new resource to create @nonnull + * @param[in] options reserved for future use. Should be passed as 0. + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER if sem_id or sem_name are NULL + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NO_FREE_IDS if there are no more free rwlock Ids + * @retval #OS_ERR_NAME_TAKEN if there is already a rwlock with the same name + * @retval #OS_ERROR if the OS call failed @covtest + */ +int32 OS_RwLockCreate(osal_id_t *rw_id, const char *rw_name, uint32 options); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Releases the reader lock on the rwlock object referenced by rw_id. + * + * If this function is called by a thread which holds a read lock on this rwlock object, + * and there are other threads currently holding read locks, the rwlock will remain in + * the read locked state. If the function is called by the last thread which held a + * read lock, the rwlock becomes unlocked. + * + * If this function is called by a thread which holds a write lock on this rwlock object, + * the behavior is undefined. + * + * If there are threads blocked on the rwlock object referenced by + * rw_id when this function is called, resulting in the rwlock becoming + * available, the scheduling policy shall determine which thread shall + * acquire the rwlock. + * + * @param[in] rw_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid rwlock + * @retval #OS_ERROR if an unspecified error occurs @covtest + */ +int32 OS_RwLockReadGive(osal_id_t rw_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Releases the rwlock object referenced by rw_id. + * + * If this function is called by a thread which holds a write lock on this rwlock object, + * the rwlock becomes unlocked. + * + * If this function is called by a thread which holds a read lock on this rwlock object, + * the behavior is undefined. + * + * If there are threads blocked on the rwlock object referenced by + * rwlock when this function is called, resulting in the rwlock becoming + * available, the scheduling policy shall determine which thread shall + * acquire the rwlock. + * + * @param[in] rw_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid rwlock + * @retval #OS_ERROR if an unspecified error occurs @covtest + */ +int32 OS_RwLockWriteGive(osal_id_t rw_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Acquire the rwlock object as a read lock as referenced by rw_id. + * + * If the rwlock is currently write locked, as in a thread holds a write lock on this + * rwlock object, the current thread will block until the rwlock becomes available to + * readers. + * + * If the rwlock is currently read locked and a thread intending to obtain a write lock + * is waiting, whether or not the current thread is allowed to obtain a read lock depends + * on the underlying OS rwlock implementation. + * + * If the rwlock is currently read locked and there are no threads waiting to obtain a write + * lock, the current thread is allowed to obtain a read lock. + * + * If the rwlock is unlocked, the current thread will obtain a read lock + * on this rwlock object. + * + * @param[in] rw_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID the id passed in is not a valid rwlock + * @retval #OS_ERROR if an unspecified error occurs @covtest + */ +int32 OS_RwLockReadTake(osal_id_t rw_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Acquire the rwlock object as a write lock as referenced by rw_id. + * + * If the rwlock is currently write or read locked, the current thread will block until + * the rwlock becomes available. If the rwlock is open, the current thread will acquire + * a write lock on this rwlock object. + * + * @param[in] rw_id The object ID to operate on + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID the id passed in is not a valid rwlock + * @retval #OS_ERROR if an unspecified error occurs @covtest + */ +int32 OS_RwLockWriteTake(osal_id_t rw_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Deletes the specified RwLock. + * + * Delete the rwlock. This also frees the respective rw_id such that it can be + * used again when another is created. + * + * @param[in] rw_id The object ID to delete + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid rwlock + * @retval #OS_ERROR if an unspecified error occurs @covtest + */ +int32 OS_RwLockDelete(osal_id_t rw_id); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Find an existing rwlock ID by name + * + * This function tries to find a rwlock Id given the name of a rwlock. + * The id is returned through rw_id + * + * @param[out] rw_id will be set to the ID of the existing resource + * @param[in] rw_name the name of the existing resource to find @nonnull + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_INVALID_POINTER is rw_id or rw_name are NULL pointers + * @retval #OS_ERR_NAME_TOO_LONG name length including null terminator greater than #OS_MAX_API_NAME + * @retval #OS_ERR_NAME_NOT_FOUND if the name was not found in the table + */ +int32 OS_RwLockGetIdByName(osal_id_t *rw_id, const char *rw_name); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Fill a property object buffer with details regarding the resource + * + * This function will pass back a pointer to structure that contains + * all of the relevant info( name and creator) about the specified rwlock. + * + * @param[in] rw_id The object ID to operate on + * @param[out] rw_prop The property object buffer to fill @nonnull + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid rwlock + * @retval #OS_INVALID_POINTER if the rw_prop pointer is null + */ +int32 OS_RwLockGetInfo(osal_id_t rw_id, OS_rwlock_prop_t *rw_prop); +/**@}*/ + +#endif /* OSAPI_RWLOCK_H */ diff --git a/src/os/inc/osapi-sockets.h b/src/os/inc/osapi-sockets.h index 5a4dd3e6f..6ad39f5b9 100644 --- a/src/os/inc/osapi-sockets.h +++ b/src/os/inc/osapi-sockets.h @@ -126,6 +126,32 @@ typedef struct osal_id_t creator; /**< @brief OSAL TaskID which opened the socket */ } OS_socket_prop_t; +/** + * @brief Socket option identifier + * + * This is used with OS_SocketGetOption() and OS_SocketSetOption() to + * specify which option to get or set, respectively. + */ +typedef enum OS_socket_option +{ + OS_socket_option_UNDEFINED, /**< Placeholder, no-op if set, always reads 0. */ + OS_socket_option_IP_DSCP, /**< Get/Set the value for the IP DSCP/Differentiated Services field */ + OS_socket_option_MAX /**< Placeholder, marks 1+ the highest valid value */ +} OS_socket_option_t; + +/** + * @brief Socket option value + * + * This is used with OS_SocketGetOption() and OS_SocketSetOption() to + * store the option value that is get or set, respectively. Currently + * only integers values are relevant but defining as a union will allow + * other types to be transparently added in the future if needed. + */ +typedef union OS_socket_optval +{ + int32 IntVal; +} OS_socket_optval_t; + /** * @defgroup OSAPISocketAddr OSAL Socket Address APIs * @@ -578,11 +604,45 @@ int32 OS_SocketGetIdByName(osal_id_t *sock_id, const char *sock_name); * * @return Execution status, see @ref OSReturnCodes * @retval #OS_SUCCESS @copybrief OS_SUCCESS - * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid semaphore - * @retval #OS_INVALID_POINTER if the count_prop pointer is null + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid socket + * @retval #OS_INVALID_POINTER if the sock_prop pointer is null */ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop); +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Gets the value of a socket option + * + * Gets the state of a per-socket option / configurable item + * + * @param[in] sock_id The socket ID + * @param[in] opt_id The socket option ID + * @param[out] optval Buffer to hold socket option value @nonnull + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid socket + * @retval #OS_INVALID_POINTER if the optval pointer is null + */ +int32 OS_SocketGetOption(osal_id_t sock_id, OS_socket_option_t opt_id, OS_socket_optval_t *optval); + +/*-------------------------------------------------------------------------------------*/ +/** + * @brief Sets the value of a socket option + * + * Sets the state of a per-socket option / configurable item + * + * @param[in] sock_id The socket ID + * @param[in] opt_id The socket option ID + * @param[in] optval Socket option value @nonnull + * + * @return Execution status, see @ref OSReturnCodes + * @retval #OS_SUCCESS @copybrief OS_SUCCESS + * @retval #OS_ERR_INVALID_ID if the id passed in is not a valid socket + * @retval #OS_INVALID_POINTER if the optval pointer is null + */ +int32 OS_SocketSetOption(osal_id_t sock_id, OS_socket_option_t opt_id, const OS_socket_optval_t *optval); + /**@}*/ #endif /* OSAPI_SOCKETS_H */ diff --git a/src/os/inc/osapi-version.h b/src/os/inc/osapi-version.h index 2e6664fef..932976304 100644 --- a/src/os/inc/osapi-version.h +++ b/src/os/inc/osapi-version.h @@ -34,17 +34,17 @@ /* * Development Build Macro Definitions */ -#define OS_BUILD_NUMBER 123 -#define OS_BUILD_BASELINE "equuleus-rc1" -#define OS_BUILD_DEV_CYCLE "equuleus-rc2" /**< @brief Development: Release name for current development cycle */ -#define OS_BUILD_CODENAME "Equuleus" /**< @brief: Development: Code name for the current build */ +#define OS_BUILD_NUMBER 123 +#define OS_BUILD_BASELINE "equuleus-rc1" +#define OS_BUILD_DEV_CYCLE "equuleus-rc2" /**< @brief Development: Release name for current development cycle */ +#define OS_BUILD_CODENAME "Equuleus" /**< @brief: Development: Code name for the current build */ /* * Version Macros, see \ref cfsversions for definitions. */ -#define OS_MAJOR_VERSION 5 /*!< @brief Major version number */ -#define OS_MINOR_VERSION 0 /*!< @brief Minor version number */ -#define OS_REVISION 0 /*!< @brief Revision version number. Value of 99 indicates a development version.*/ +#define OS_MAJOR_VERSION 5 /*!< @brief Major version number */ +#define OS_MINOR_VERSION 0 /*!< @brief Minor version number */ +#define OS_REVISION 0 /*!< @brief Revision version number. Value of 99 indicates a development version.*/ /** * @brief Last official release. @@ -147,9 +147,9 @@ uint32 OS_GetBuildNumber(void); /** * @brief Max Version String length. - * + * * Maximum length that an OSAL version string can be. - * + * */ #define OS_CFG_MAX_VERSION_STR_LEN 256 diff --git a/src/os/inc/osapi.h b/src/os/inc/osapi.h index d86cb3254..f4ff3d2b3 100644 --- a/src/os/inc/osapi.h +++ b/src/os/inc/osapi.h @@ -27,8 +27,7 @@ #define OSAPI_H #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif /* @@ -79,6 +78,7 @@ extern "C" #include "osapi-network.h" #include "osapi-printf.h" #include "osapi-queue.h" +#include "osapi-rwlock.h" #include "osapi-select.h" #include "osapi-shell.h" #include "osapi-sockets.h" @@ -86,12 +86,12 @@ extern "C" #include "osapi-timebase.h" #include "osapi-timer.h" - /* - ****************************************************************************** - * Items below here are internal OSAL-use definitions and are not part of the - * OSAL API - ***************************************************************************** - */ +/* + ****************************************************************************** + * Items below here are internal OSAL-use definitions and are not part of the + * OSAL API + ***************************************************************************** + */ #include "osapi-bsp.h" diff --git a/src/os/portable/os-impl-bsd-sockets-common.h b/src/os/portable/os-impl-bsd-sockets-common.h new file mode 100644 index 000000000..e14b7ba8b --- /dev/null +++ b/src/os/portable/os-impl-bsd-sockets-common.h @@ -0,0 +1,99 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \author joseph.p.hickey@nasa.gov + * + * Purpose: This file contains the network functionality for + * systems which implement the BSD-style socket API. + */ + +#ifndef OS_IMPL_BSD_SOCKETS_COMMON_H +#define OS_IMPL_BSD_SOCKETS_COMMON_H + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +/* + * Inclusions Defined by OSAL layer. + * + * This must include whatever is required to get the prototypes of these functions: + * + * socket() + * getsockopt() + * setsockopt() + * fcntl() + * bind() + * listen() + * accept() + * connect() + * recvfrom() + * sendto() + * inet_pton() + * ntohl()/ntohs() + * + * As well as any headers for the struct sockaddr type and any address families in use + */ +#include +#include + +#include "os-impl-sockets.h" +#include "os-shared-file.h" +#include "os-shared-sockets.h" +#include "os-shared-idmap.h" + +/**************************************************************************************** + DEFINES +****************************************************************************************/ + +/* + * The OS layer may define a macro to set the proper flags on newly-opened sockets. + * If not set, then a default implementation is used, which uses fcntl() to set O_NONBLOCK + */ +#ifndef OS_IMPL_SOCKET_FLAGS +#ifdef O_NONBLOCK +#define OS_IMPL_SOCKET_FLAGS O_NONBLOCK +#else +#define OS_IMPL_SOCKET_FLAGS 0 /* do not set any flags */ +#endif +#endif + +#ifndef OS_IMPL_SET_SOCKET_FLAGS +#define OS_IMPL_SET_SOCKET_FLAGS(tok) OS_SetSocketDefaultFlags_Impl(tok) +#endif + +typedef union +{ + char data[OS_SOCKADDR_MAX_LEN]; + struct sockaddr sa; + struct sockaddr_in sa_in; +#ifdef OS_NETWORK_SUPPORTS_IPV6 + struct sockaddr_in6 sa_in6; +#endif +} OS_SockAddr_Accessor_t; + +/* + * Default flags implementation: Set the O_NONBLOCK flag via fcntl(). + * An implementation can also elect custom configuration by setting + * the OS_IMPL_SET_SOCKET_FLAGS macro to point to an alternate function. + */ +void OS_SetSocketDefaultFlags_Impl(const OS_object_token_t *token); + +#endif /* OS_IMPL_BSD_SOCKETS_COMMON_H */ diff --git a/src/os/portable/os-impl-bsd-sockets-dns.c b/src/os/portable/os-impl-bsd-sockets-dns.c new file mode 100644 index 000000000..768e5d050 --- /dev/null +++ b/src/os/portable/os-impl-bsd-sockets-dns.c @@ -0,0 +1,171 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \author joseph.p.hickey@nasa.gov + * + * Purpose: This file contains the network functionality for + * systems which implement the BSD-style socket API. + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +/* + * Inclusions Defined by OSAL layer. + * + * This must include whatever is required to get the prototypes of these functions: + * + * socket() + * getsockopt() + * setsockopt() + * fcntl() + * bind() + * listen() + * accept() + * connect() + * recvfrom() + * sendto() + * inet_pton() + * ntohl()/ntohs() + * + * As well as any headers for the struct sockaddr type and any address families in use + */ +#include "os-impl-bsd-sockets-common.h" +#include + +/**************************************************************************************** + DEFINES +****************************************************************************************/ + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_SocketAddrToString_Impl(char *buffer, size_t buflen, const OS_SockAddr_t *Addr) +{ + int32 status; + const OS_SockAddr_Accessor_t *Accessor; + int rc; + + Accessor = (const OS_SockAddr_Accessor_t *)&Addr->AddrData; + + switch (Accessor->sa.sa_family) + { + case AF_INET: + break; +#ifdef OS_NETWORK_SUPPORTS_IPV6 + case AF_INET6: + break; +#endif + default: + return OS_ERR_BAD_ADDRESS; + break; + } + + rc = getnameinfo(&Accessor->sa, Addr->ActualLength, buffer, buflen, NULL, 0, 0); + if (rc == 0) + { + status = OS_SUCCESS; + } + else if (rc == EAI_AGAIN) + { + status = OS_ERR_TRY_AGAIN; + } + else if (rc == EAI_NONAME) + { + status = OS_ERR_EMPTY_SET; + } + else + { + status = OS_ERROR; + } + + return status; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_SocketAddrFromString_Impl(OS_SockAddr_t *Addr, const char *string) +{ + int32 status; + size_t addr_offset; + size_t addr_len; + OS_SockAddr_Accessor_t *Accessor; + struct addrinfo * res; + struct addrinfo * rp; + int rc; + + Accessor = (OS_SockAddr_Accessor_t *)&Addr->AddrData; + + switch (Accessor->sa.sa_family) + { + case AF_INET: + addr_offset = offsetof(struct sockaddr_in, sin_addr); + addr_len = sizeof(Accessor->sa_in.sin_addr); + break; +#ifdef OS_NETWORK_SUPPORTS_IPV6 + case AF_INET6: + addr_offset = offsetof(struct sockaddr_in6, sin6_addr); + addr_len = sizeof(Accessor->sa_in6.sin6_addr); + break; +#endif + default: + return OS_ERR_BAD_ADDRESS; + break; + } + + status = OS_ERR_EMPTY_SET; + + rc = getaddrinfo(string, NULL, NULL, &res); + if (rc == 0) + { + for (rp = res; rp != NULL; rp = rp->ai_next) + { + /* the library call should never return something that does not meet this criteria */ + if (rp->ai_family == Accessor->sa.sa_family && rp->ai_addrlen >= sizeof(struct sockaddr)) + { + memcpy(&Addr->AddrData.Buffer[addr_offset], (const char *)rp->ai_addr + addr_offset, addr_len); + Addr->ActualLength = rp->ai_addrlen; + status = OS_SUCCESS; + break; + } + } + + freeaddrinfo(res); + } + else if (rc == EAI_AGAIN) + { + /* Indicate the error is temporary; treat this like a timeout or similar */ + status = OS_ERR_TRY_AGAIN; + } + else if (rc != EAI_NONAME) + { + status = OS_ERROR; + } + + return status; +} diff --git a/src/os/portable/os-impl-bsd-sockets-no-dns.c b/src/os/portable/os-impl-bsd-sockets-no-dns.c new file mode 100644 index 000000000..cfce71fc8 --- /dev/null +++ b/src/os/portable/os-impl-bsd-sockets-no-dns.c @@ -0,0 +1,128 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \author joseph.p.hickey@nasa.gov + * + * Purpose: This file contains the network functionality for + * systems which implement the BSD-style socket API. + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +/* + * Inclusions Defined by OSAL layer. + * + * This must include whatever is required to get the prototypes of these functions: + * + * socket() + * getsockopt() + * setsockopt() + * fcntl() + * bind() + * listen() + * accept() + * connect() + * recvfrom() + * sendto() + * inet_pton() + * ntohl()/ntohs() + * + * As well as any headers for the struct sockaddr type and any address families in use + */ +#include "os-impl-bsd-sockets-common.h" + +/**************************************************************************************** + DEFINES +****************************************************************************************/ + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_SocketAddrToString_Impl(char *buffer, size_t buflen, const OS_SockAddr_t *Addr) +{ + const void * addrbuffer; + const OS_SockAddr_Accessor_t *Accessor; + + Accessor = (const OS_SockAddr_Accessor_t *)&Addr->AddrData; + + switch (Accessor->sa.sa_family) + { + case AF_INET: + addrbuffer = &Accessor->sa_in.sin_addr; + break; +#ifdef OS_NETWORK_SUPPORTS_IPV6 + case AF_INET6: + addrbuffer = &Accessor->sa_in6.sin6_addr; + break; +#endif + default: + return OS_ERR_BAD_ADDRESS; + break; + } + + if (inet_ntop(Accessor->sa.sa_family, addrbuffer, buffer, buflen) == NULL) + { + return OS_ERROR; + } + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_SocketAddrFromString_Impl(OS_SockAddr_t *Addr, const char *string) +{ + void * addrbuffer; + OS_SockAddr_Accessor_t *Accessor; + + Accessor = (OS_SockAddr_Accessor_t *)&Addr->AddrData; + + switch (Accessor->sa.sa_family) + { + case AF_INET: + addrbuffer = &Accessor->sa_in.sin_addr; + break; +#ifdef OS_NETWORK_SUPPORTS_IPV6 + case AF_INET6: + addrbuffer = &Accessor->sa_in6.sin6_addr; + break; +#endif + default: + return OS_ERR_BAD_ADDRESS; + break; + } + + /* This function is defined as returning 1 on success, not 0 */ + if (inet_pton(Accessor->sa.sa_family, string, addrbuffer) != 1) + { + return OS_ERROR; + } + + return OS_SUCCESS; +} diff --git a/src/os/portable/os-impl-bsd-sockets.c b/src/os/portable/os-impl-bsd-sockets.c index 3102d0aac..56c186ce8 100644 --- a/src/os/portable/os-impl-bsd-sockets.c +++ b/src/os/portable/os-impl-bsd-sockets.c @@ -51,43 +51,15 @@ #include #include -#include "os-impl-sockets.h" +#include "os-impl-bsd-sockets-common.h" #include "os-shared-clock.h" #include "os-shared-file.h" #include "os-shared-select.h" -#include "os-shared-sockets.h" -#include "os-shared-idmap.h" /**************************************************************************************** DEFINES ****************************************************************************************/ -/* - * The OS layer may define a macro to set the proper flags on newly-opened sockets. - * If not set, then a default implementation is used, which uses fcntl() to set O_NONBLOCK - */ -#ifndef OS_IMPL_SOCKET_FLAGS -#ifdef O_NONBLOCK -#define OS_IMPL_SOCKET_FLAGS O_NONBLOCK -#else -#define OS_IMPL_SOCKET_FLAGS 0 /* do not set any flags */ -#endif -#endif - -#ifndef OS_IMPL_SET_SOCKET_FLAGS -#define OS_IMPL_SET_SOCKET_FLAGS(tok) OS_SetSocketDefaultFlags_Impl(tok) -#endif - -typedef union -{ - char data[OS_SOCKADDR_MAX_LEN]; - struct sockaddr sa; - struct sockaddr_in sa_in; -#ifdef OS_NETWORK_SUPPORTS_IPV6 - struct sockaddr_in6 sa_in6; -#endif -} OS_SockAddr_Accessor_t; - /* * Confirm that the abstract socket address buffer size (OS_SOCKADDR_MAX_LEN) is * large enough to store any of the enabled address types. If this is true, the @@ -128,6 +100,70 @@ void OS_SetSocketDefaultFlags_Impl(const OS_object_token_t *token) impl->selectable = true; } +/*---------------------------------------------------------------- + * + * Purpose: Helper function to get the IP DSCP value + * Local function only, not part of API + * + *-----------------------------------------------------------------*/ +int32 OS_SocketGetDSCP_Impl(const OS_object_token_t *token, OS_socket_optval_t *optval) +{ + OS_impl_file_internal_record_t *impl; + int os_flags; + socklen_t optlen; + + /* The DSCP value lives in the upper 6 bits of the IPv4 ToS field */ + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); + + optlen = sizeof(os_flags); + if (getsockopt(impl->fd, IPPROTO_IP, IP_TOS, &os_flags, &optlen) < 0) + { + /* No recourse if getsockopt() fails - just report the error and move on. */ + OS_DEBUG("getsockopt(IP_TOS): %s\n", strerror(errno)); + return OS_ERROR; + } + + optval->IntVal = (os_flags >> 2) & 0x3F; + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Helper function to set the IP DSCP value + * Local function only, not part of API + * + *-----------------------------------------------------------------*/ +int32 OS_SocketSetDSCP_Impl(const OS_object_token_t *token, const OS_socket_optval_t *optval) +{ + OS_impl_file_internal_record_t *impl; + int os_flags; + socklen_t optlen; + + /* The DSCP value lives in the upper 6 bits of the IPv4 ToS field */ + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); + + /* Preserve the setting of the lower two bits (ECN) by reading ToS first */ + optlen = sizeof(os_flags); + if (getsockopt(impl->fd, IPPROTO_IP, IP_TOS, &os_flags, &optlen) < 0) + { + /* No recourse if getsockopt() fails - just report the error and move on. */ + OS_DEBUG("getsockopt(IP_TOS): %s\n", strerror(errno)); + return OS_ERROR; + } + + os_flags = (os_flags & 0x03) | ((optval->IntVal << 2) & 0xFC); + + if (setsockopt(impl->fd, IPPROTO_IP, IP_TOS, &os_flags, sizeof(os_flags)) < 0) + { + /* No recourse if setsockopt() fails - just report the error and move on. */ + OS_DEBUG("setsockopt(IP_TOS): %s\n", strerror(errno)); + return OS_ERROR; + } + + return OS_SUCCESS; +} + /**************************************************************************************** Sockets API ***************************************************************************************/ @@ -625,42 +661,27 @@ int32 OS_SocketGetInfo_Impl(const OS_object_token_t *token, OS_socket_prop_t *so * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketAddrInit_Impl(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) +int32 OS_SocketGetOption_Impl(const OS_object_token_t *token, OS_socket_option_t opt_id, OS_socket_optval_t *optval) { - sa_family_t sa_family; - socklen_t addrlen; - OS_SockAddr_Accessor_t *Accessor; + int32 return_code; - memset(Addr, 0, sizeof(OS_SockAddr_t)); - Accessor = (OS_SockAddr_Accessor_t *)&Addr->AddrData; + return_code = OS_ERR_OPERATION_NOT_SUPPORTED; - switch (Domain) + switch (opt_id) { - case OS_SocketDomain_INET: - sa_family = AF_INET; - addrlen = sizeof(struct sockaddr_in); + case OS_socket_option_UNDEFINED: + return_code = OS_SUCCESS; break; -#ifdef OS_NETWORK_SUPPORTS_IPV6 - case OS_SocketDomain_INET6: - sa_family = AF_INET6; - addrlen = sizeof(struct sockaddr_in6); + + case OS_socket_option_IP_DSCP: + return_code = OS_SocketGetDSCP_Impl(token, optval); break; -#endif + default: - sa_family = 0; - addrlen = 0; break; } - if (addrlen == 0) - { - return OS_ERR_NOT_IMPLEMENTED; - } - - Addr->ActualLength = OSAL_SIZE_C(addrlen); - Accessor->sa.sa_family = sa_family; - - return OS_SUCCESS; + return return_code; } /*---------------------------------------------------------------- @@ -669,34 +690,28 @@ int32 OS_SocketAddrInit_Impl(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketAddrToString_Impl(char *buffer, size_t buflen, const OS_SockAddr_t *Addr) +int32 OS_SocketSetOption_Impl(const OS_object_token_t *token, OS_socket_option_t opt_id, + const OS_socket_optval_t *optval) { - const void * addrbuffer; - const OS_SockAddr_Accessor_t *Accessor; + int32 return_code; - Accessor = (const OS_SockAddr_Accessor_t *)&Addr->AddrData; + return_code = OS_ERR_OPERATION_NOT_SUPPORTED; - switch (Accessor->sa.sa_family) + switch (opt_id) { - case AF_INET: - addrbuffer = &Accessor->sa_in.sin_addr; + case OS_socket_option_UNDEFINED: + return_code = OS_SUCCESS; break; -#ifdef OS_NETWORK_SUPPORTS_IPV6 - case AF_INET6: - addrbuffer = &Accessor->sa_in6.sin6_addr; + + case OS_socket_option_IP_DSCP: + return_code = OS_SocketSetDSCP_Impl(token, optval); break; -#endif + default: - return OS_ERR_BAD_ADDRESS; break; } - if (inet_ntop(Accessor->sa.sa_family, addrbuffer, buffer, buflen) == NULL) - { - return OS_ERROR; - } - - return OS_SUCCESS; + return return_code; } /*---------------------------------------------------------------- @@ -705,34 +720,41 @@ int32 OS_SocketAddrToString_Impl(char *buffer, size_t buflen, const OS_SockAddr_ * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_SocketAddrFromString_Impl(OS_SockAddr_t *Addr, const char *string) +int32 OS_SocketAddrInit_Impl(OS_SockAddr_t *Addr, OS_SocketDomain_t Domain) { - void * addrbuffer; + sa_family_t sa_family; + socklen_t addrlen; OS_SockAddr_Accessor_t *Accessor; + memset(Addr, 0, sizeof(OS_SockAddr_t)); Accessor = (OS_SockAddr_Accessor_t *)&Addr->AddrData; - switch (Accessor->sa.sa_family) + switch (Domain) { - case AF_INET: - addrbuffer = &Accessor->sa_in.sin_addr; + case OS_SocketDomain_INET: + sa_family = AF_INET; + addrlen = sizeof(struct sockaddr_in); break; #ifdef OS_NETWORK_SUPPORTS_IPV6 - case AF_INET6: - addrbuffer = &Accessor->sa_in6.sin6_addr; + case OS_SocketDomain_INET6: + sa_family = AF_INET6; + addrlen = sizeof(struct sockaddr_in6); break; #endif default: - return OS_ERR_BAD_ADDRESS; + sa_family = 0; + addrlen = 0; break; } - /* This function is defined as returning 1 on success, not 0 */ - if (inet_pton(Accessor->sa.sa_family, string, addrbuffer) != 1) + if (addrlen == 0) { - return OS_ERROR; + return OS_ERR_NOT_IMPLEMENTED; } + Addr->ActualLength = OSAL_SIZE_C(addrlen); + Accessor->sa.sa_family = sa_family; + return OS_SUCCESS; } diff --git a/src/os/portable/os-impl-no-file-allocate.c b/src/os/portable/os-impl-no-file-allocate.c new file mode 100644 index 000000000..5b056e30c --- /dev/null +++ b/src/os/portable/os-impl-no-file-allocate.c @@ -0,0 +1,66 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \author joseph.p.hickey@nasa.gov + * + * The "posix_allocate" function, while specified by POSIX, is not widely + * supported. It works on Linux/glibc and theoretically other full-featured C + * libraries, but not likely on embedded-specific libraries like musl. + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +/* + * Inclusions Defined by OSAL layer. + * + * This must include whatever is required to get the prototypes of these functions: + * + * open() + * stat() + * chmod() + * remove() + * rename() + */ + +#include +#include +#include +#include + +#include "os-impl-files.h" +#include "os-shared-file.h" +#include "os-shared-idmap.h" + +/**************************************************************************************** + DEFINES + ***************************************************************************************/ + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileAllocate_Impl(const OS_object_token_t *token, osal_offset_t offset, osal_offset_t len) +{ + return OS_ERR_NOT_IMPLEMENTED; +} diff --git a/src/os/portable/os-impl-no-network-gethostid.c b/src/os/portable/os-impl-no-network-gethostid.c new file mode 100644 index 000000000..63567751d --- /dev/null +++ b/src/os/portable/os-impl-no-network-gethostid.c @@ -0,0 +1,44 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \author joseph.p.hickey@nasa.gov + * + * This file contains the network implementation for + * systems where OSAL_CONFIG_INCLUDE_NETWORK is false or otherwise + * do not provide any network functions. + * + */ + +#include "os-shared-network.h" + +/**************************************************************************************** + Network API + ***************************************************************************************/ + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_NetworkGetID_Impl(int32 *IdBuf) +{ + return OS_ERR_NOT_IMPLEMENTED; +} diff --git a/src/os/portable/os-impl-no-network.c b/src/os/portable/os-impl-no-network-gethostname.c similarity index 84% rename from src/os/portable/os-impl-no-network.c rename to src/os/portable/os-impl-no-network-gethostname.c index ba871eb3d..83513a80f 100644 --- a/src/os/portable/os-impl-no-network.c +++ b/src/os/portable/os-impl-no-network-gethostname.c @@ -32,17 +32,6 @@ Network API ***************************************************************************************/ -/*---------------------------------------------------------------- - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * - *-----------------------------------------------------------------*/ -int32 OS_NetworkGetID_Impl(int32 *IdBuf) -{ - return OS_ERR_NOT_IMPLEMENTED; -} - /*---------------------------------------------------------------- * * Purpose: Implemented per internal OSAL API diff --git a/src/os/portable/os-impl-no-rwlock.c b/src/os/portable/os-impl-no-rwlock.c new file mode 100644 index 000000000..d6f04201b --- /dev/null +++ b/src/os/portable/os-impl-no-rwlock.c @@ -0,0 +1,68 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup posix + * \author joseph.p.hickey@nasa.gov + * + * Purpose: All functions return OS_ERR_NOT_IMPLEMENTED. + * This is used when rwlock functionality is disabled by config. + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +#include +#include "os-shared-rwlock.h" + +int32 OS_RwLockCreate_Impl(const OS_object_token_t *token, uint32 options) +{ + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_RwLockDelete_Impl(const OS_object_token_t *token) +{ + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_RwLockReadGive_Impl(const OS_object_token_t *token) +{ + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_RwLockWriteGive_Impl(const OS_object_token_t *token) +{ + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_RwLockReadTake_Impl(const OS_object_token_t *token) +{ + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_RwLockWriteTake_Impl(const OS_object_token_t *token) +{ + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_RwLockGetInfo_Impl(const OS_object_token_t *token, OS_rwlock_prop_t *rw_prop) +{ + return OS_ERR_NOT_IMPLEMENTED; +} diff --git a/src/os/portable/os-impl-no-sockets.c b/src/os/portable/os-impl-no-sockets.c index 3c7f15f23..87aba63eb 100644 --- a/src/os/portable/os-impl-no-sockets.c +++ b/src/os/portable/os-impl-no-sockets.c @@ -181,3 +181,24 @@ int32 OS_SocketAddrSetPort_Impl(OS_SockAddr_t *Addr, uint16 PortNum) { return OS_ERR_NOT_IMPLEMENTED; } + +/*---------------------------------------------------------------- + * Implementation for no network configuration + * + * See prototype for argument/return detail + *-----------------------------------------------------------------*/ +int32 OS_SocketGetOption_Impl(const OS_object_token_t *token, OS_socket_option_t opt_id, OS_socket_optval_t *optval) +{ + return OS_ERR_NOT_IMPLEMENTED; +} + +/*---------------------------------------------------------------- + * Implementation for no network configuration + * + * See prototype for argument/return detail + *-----------------------------------------------------------------*/ +int32 OS_SocketSetOption_Impl(const OS_object_token_t *token, OS_socket_option_t opt_id, + const OS_socket_optval_t *optval) +{ + return OS_ERR_NOT_IMPLEMENTED; +} \ No newline at end of file diff --git a/src/os/portable/os-impl-posix-file-allocate.c b/src/os/portable/os-impl-posix-file-allocate.c new file mode 100644 index 000000000..c749a2463 --- /dev/null +++ b/src/os/portable/os-impl-posix-file-allocate.c @@ -0,0 +1,91 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \author joseph.p.hickey@nasa.gov + * + * This file Contains all of the api calls for manipulating files + * in a file system / C library that implements the POSIX-style file API + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +/* + * Inclusions Defined by OSAL layer. + * + * This must include whatever is required to get the prototypes of these functions: + * + * open() + * stat() + * chmod() + * remove() + * rename() + */ + +#include +#include +#include +#include + +#include "os-impl-files.h" +#include "os-shared-file.h" +#include "os-shared-idmap.h" + +/**************************************************************************************** + DEFINES + ***************************************************************************************/ + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileAllocate_Impl(const OS_object_token_t *token, osal_offset_t offset, osal_offset_t len) +{ + OS_impl_file_internal_record_t *impl; + int32 Status; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); + + if (posix_fallocate(impl->fd, offset, len) >= 0) + { + Status = OS_SUCCESS; + } + else if (errno == EOPNOTSUPP) + { + Status = OS_ERR_OPERATION_NOT_SUPPORTED; + } + else if (errno == EFBIG || errno == ENOSPC) + { + Status = OS_ERR_OUTPUT_TOO_LARGE; + } + else if (errno == ESPIPE || errno == ENODEV) + { + Status = OS_ERR_INCORRECT_OBJ_TYPE; + } + else + { + Status = OS_ERROR; + } + + return Status; +} diff --git a/src/os/portable/os-impl-posix-files.c b/src/os/portable/os-impl-posix-files.c index 98b323b3d..5efbfa340 100644 --- a/src/os/portable/os-impl-posix-files.c +++ b/src/os/portable/os-impl-posix-files.c @@ -359,3 +359,36 @@ int32 OS_FileRename_Impl(const char *old_path, const char *new_path) return OS_SUCCESS; } + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileTruncate_Impl(const OS_object_token_t *token, osal_offset_t len) +{ + OS_impl_file_internal_record_t *impl; + int32 Status; + + impl = OS_OBJECT_TABLE_GET(OS_impl_filehandle_table, *token); + + if (ftruncate(impl->fd, len) >= 0) + { + Status = OS_SUCCESS; + } + else if (errno == EACCES || errno == EPERM || errno == ETXTBSY || errno == EROFS) + { + Status = OS_ERR_OPERATION_NOT_SUPPORTED; + } + else if (errno == EFBIG) + { + Status = OS_ERR_OUTPUT_TOO_LARGE; + } + else + { + Status = OS_ERROR; + } + + return Status; +} diff --git a/src/os/portable/os-impl-posix-gettime-monotonic.c b/src/os/portable/os-impl-posix-gettime-monotonic.c new file mode 100644 index 000000000..410dbde47 --- /dev/null +++ b/src/os/portable/os-impl-posix-gettime-monotonic.c @@ -0,0 +1,88 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \author joseph.p.hickey@nasa.gov + * + * This file contains implementation for OS_GetLocalTime() and OS_SetLocalTime() + * that map to the C library clock_gettime() and clock_settime() calls. + * This should be usable on any OS that supports those standard calls. + * The OS-specific code must \#include the correct headers that define the + * prototypes for these functions before including this implementation file. + * + * NOTE: The OS-specific header must also define which POSIX clock ID to use - + * this specifies the clockid_t parameter to use with clock_gettime(). In + * most cases this should be CLOCK_REALTIME to allow the clock to be set, and + * so the application will also see any manual/administrative clock changes. + * + * The clock ID is selected by defining the #OSAL_GETTIME_LOCAL_CLOCK macro. + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +/* + * Inclusions Defined by OSAL layer. + * + * This must provide the prototypes of these functions: + * + * clock_gettime() + * clock_settime() + * + * and the "struct timespec" definition + */ +#include +#include + +#include "osapi-clock.h" +#include "os-impl-gettime.h" +#include "os-shared-clock.h" + +/**************************************************************************************** + FUNCTIONS + ***************************************************************************************/ + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_GetMonotonicTime_Impl(OS_time_t *time_struct) +{ + int Status; + int32 ReturnCode; + struct timespec TimeSp; + + Status = clock_gettime(OSAL_GETTIME_MONOTONIC_CLOCK, &TimeSp); + + if (Status == 0) + { + *time_struct = OS_TimeAssembleFromNanoseconds(TimeSp.tv_sec, TimeSp.tv_nsec); + ReturnCode = OS_SUCCESS; + } + else + { + OS_DEBUG("Error calling clock_gettime: %s\n", strerror(errno)); + ReturnCode = OS_ERROR; + } + + return ReturnCode; +} diff --git a/src/os/portable/os-impl-posix-gettime-no-monotonic.c b/src/os/portable/os-impl-posix-gettime-no-monotonic.c new file mode 100644 index 000000000..98305ef6f --- /dev/null +++ b/src/os/portable/os-impl-posix-gettime-no-monotonic.c @@ -0,0 +1,60 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \author joseph.p.hickey@nasa.gov + * + * This file contains implementation for OS_GetLocalTime() and OS_SetLocalTime() + * that map to the C library clock_gettime() and clock_settime() calls. + * This should be usable on any OS that supports those standard calls. + * The OS-specific code must \#include the correct headers that define the + * prototypes for these functions before including this implementation file. + * + * NOTE: The OS-specific header must also define which POSIX clock ID to use - + * this specifies the clockid_t parameter to use with clock_gettime(). In + * most cases this should be CLOCK_REALTIME to allow the clock to be set, and + * so the application will also see any manual/administrative clock changes. + * + * The clock ID is selected by defining the #OSAL_GETTIME_LOCAL_CLOCK macro. + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +#include +#include + +#include "osapi-clock.h" +#include "os-shared-clock.h" + +/**************************************************************************************** + FUNCTIONS + ***************************************************************************************/ + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_GetMonotonicTime_Impl(OS_time_t *time_struct) +{ + return OS_ERR_NOT_IMPLEMENTED; +} diff --git a/src/os/portable/os-impl-posix-gettime.c b/src/os/portable/os-impl-posix-gettime.c index 2f3e9052e..cec84921b 100644 --- a/src/os/portable/os-impl-posix-gettime.c +++ b/src/os/portable/os-impl-posix-gettime.c @@ -31,7 +31,7 @@ * most cases this should be CLOCK_REALTIME to allow the clock to be set, and * so the application will also see any manual/administrative clock changes. * - * The clock ID is selected by defining the #OSAL_GETTIME_SOURCE_CLOCK macro. + * The clock ID is selected by defining the #OSAL_GETTIME_LOCAL_CLOCK macro. */ /**************************************************************************************** @@ -71,7 +71,7 @@ int32 OS_GetLocalTime_Impl(OS_time_t *time_struct) int32 ReturnCode; struct timespec TimeSp; - Status = clock_gettime(OSAL_GETTIME_SOURCE_CLOCK, &TimeSp); + Status = clock_gettime(OSAL_GETTIME_LOCAL_CLOCK, &TimeSp); if (Status == 0) { @@ -102,7 +102,7 @@ int32 OS_SetLocalTime_Impl(const OS_time_t *time_struct) TimeSp.tv_sec = OS_TimeGetTotalSeconds(*time_struct); TimeSp.tv_nsec = OS_TimeGetNanosecondsPart(*time_struct); - Status = clock_settime(OSAL_GETTIME_SOURCE_CLOCK, &TimeSp); + Status = clock_settime(OSAL_GETTIME_LOCAL_CLOCK, &TimeSp); if (Status == 0) { diff --git a/src/os/portable/os-impl-posix-io.c b/src/os/portable/os-impl-posix-io.c index 9a0da4d8b..e6b835e69 100644 --- a/src/os/portable/os-impl-posix-io.c +++ b/src/os/portable/os-impl-posix-io.c @@ -96,7 +96,7 @@ int32 OS_GenericClose_Impl(const OS_object_token_t *token) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -int32 OS_GenericSeek_Impl(const OS_object_token_t *token, int32 offset, uint32 whence) +int32 OS_GenericSeek_Impl(const OS_object_token_t *token, osal_offset_t offset, uint32 whence) { int where; off_t os_result; diff --git a/src/os/portable/os-impl-posix-network-gethostid.c b/src/os/portable/os-impl-posix-network-gethostid.c new file mode 100644 index 000000000..6b6e0c6d6 --- /dev/null +++ b/src/os/portable/os-impl-posix-network-gethostid.c @@ -0,0 +1,61 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \author joseph.p.hickey@nasa.gov + * + * This file contains the network functionality for + * systems which implement the POSIX-defined network hostname/id functions. + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +/* + * Inclusions Defined by OSAL layer. + * + * This must include whatever is required to get the prototypes of these functions: + * + * gethostid() + * + * Both of these routines should conform to X/Open 5 definition. + */ +#include +#include + +#include "os-impl-network.h" +#include "os-shared-network.h" + +/**************************************************************************************** + Network API + ***************************************************************************************/ + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_NetworkGetID_Impl(int32 *IdBuf) +{ + /* gethostid() has no failure modes */ + *IdBuf = gethostid(); + return OS_SUCCESS; +} diff --git a/src/os/portable/os-impl-posix-network.c b/src/os/portable/os-impl-posix-network-gethostname.c similarity index 86% rename from src/os/portable/os-impl-posix-network.c rename to src/os/portable/os-impl-posix-network-gethostname.c index 5c028b50f..4f90fc744 100644 --- a/src/os/portable/os-impl-posix-network.c +++ b/src/os/portable/os-impl-posix-network-gethostname.c @@ -34,7 +34,6 @@ * This must include whatever is required to get the prototypes of these functions: * * gethostname() - * gethostid() * * Both of these routines should conform to X/Open 5 definition. */ @@ -74,16 +73,3 @@ int32 OS_NetworkGetHostName_Impl(char *host_name, size_t name_len) return return_code; } - -/*---------------------------------------------------------------- - * - * Purpose: Implemented per internal OSAL API - * See prototype for argument/return detail - * - *-----------------------------------------------------------------*/ -int32 OS_NetworkGetID_Impl(int32 *IdBuf) -{ - /* gethostid() has no failure modes */ - *IdBuf = gethostid(); - return OS_SUCCESS; -} diff --git a/src/os/posix/CMakeLists.txt b/src/os/posix/CMakeLists.txt index 9b7c1e3e5..97ca83055 100644 --- a/src/os/posix/CMakeLists.txt +++ b/src/os/posix/CMakeLists.txt @@ -25,14 +25,15 @@ set(POSIX_BASE_SRCLIST src/os-impl-timebase.c ) - # Use portable blocks for basic I/O set(POSIX_IMPL_SRCLIST ../portable/os-impl-posix-gettime.c + ../portable/os-impl-posix-gettime-monotonic.c ../portable/os-impl-console-bsp.c ../portable/os-impl-bsd-select.c ../portable/os-impl-posix-io.c ../portable/os-impl-posix-files.c + ../portable/os-impl-posix-file-allocate.c ../portable/os-impl-posix-dirs.c ) @@ -65,15 +66,28 @@ endif () if (OSAL_CONFIG_INCLUDE_NETWORK) list(APPEND POSIX_IMPL_SRCLIST ../portable/os-impl-bsd-sockets.c # Use BSD socket layer implementation - ../portable/os-impl-posix-network.c # Use POSIX-defined hostname/id implementation + ../portable/os-impl-bsd-sockets-dns.c # Use functions that invoke DNS + ../portable/os-impl-posix-network-gethostname.c # Use POSIX-defined hostname implementation + ../portable/os-impl-posix-network-gethostid.c # Use POSIX-defined hostid implementation ) else() list(APPEND POSIX_IMPL_SRCLIST - ../portable/os-impl-no-network.c # non-implemented versions of all network APIs + ../portable/os-impl-no-network-gethostname.c # non-implemented versions of gethostname API + ../portable/os-impl-no-network-gethostid.c # non-implemented versions of gethostid API ../portable/os-impl-no-sockets.c # non-implemented versions of all socket APIs ) endif () +if (OSAL_CONFIG_RWLOCK) + list(APPEND POSIX_IMPL_SRCLIST + src/os-impl-rwlock.c + ) +else () + list(APPEND POSIX_IMPL_SRCLIST + ../portable/os-impl-no-rwlock.c + ) +endif () + # Defines an OBJECT target named "osal_posix_impl" with selected source files add_library(osal_posix_impl OBJECT ${POSIX_BASE_SRCLIST} diff --git a/src/os/posix/inc/os-impl-gettime.h b/src/os/posix/inc/os-impl-gettime.h index 3d346ebec..ed4959940 100644 --- a/src/os/posix/inc/os-impl-gettime.h +++ b/src/os/posix/inc/os-impl-gettime.h @@ -35,6 +35,14 @@ * This is the POSIX clock ID that will be used to implement * OS_GetLocalTime() and OS_SetLocalTime(). */ -#define OSAL_GETTIME_SOURCE_CLOCK CLOCK_REALTIME +#define OSAL_GETTIME_LOCAL_CLOCK CLOCK_REALTIME + +/** + * \brief Identifies the clock ID for OSAL clock operations on POSIX + * + * This is the POSIX clock ID that will be used to implement + * OS_GetMonotonicTime(). + */ +#define OSAL_GETTIME_MONOTONIC_CLOCK CLOCK_MONOTONIC #endif /* OS_IMPL_GETTIME_H */ diff --git a/src/os/posix/inc/os-impl-rwlock.h b/src/os/posix/inc/os-impl-rwlock.h new file mode 100644 index 000000000..98517464c --- /dev/null +++ b/src/os/posix/inc/os-impl-rwlock.h @@ -0,0 +1,41 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * + * \ingroup posix + * + */ + +#ifndef OS_IMPL_RWLOCK_H +#define OS_IMPL_RWLOCK_H + +#include "osconfig.h" +#include + +/* RwLocks */ +typedef struct +{ + pthread_rwlock_t id; +} OS_impl_rwlock_internal_record_t; + +/* Tables where the OS object information is stored */ +extern OS_impl_rwlock_internal_record_t OS_impl_rwlock_table[OS_MAX_RWLOCKS]; + +#endif /* OS_IMPL_RWLOCK_H */ diff --git a/src/os/posix/inc/os-impl-sockets.h b/src/os/posix/inc/os-impl-sockets.h index 177c2158a..bb709573f 100644 --- a/src/os/posix/inc/os-impl-sockets.h +++ b/src/os/posix/inc/os-impl-sockets.h @@ -30,9 +30,11 @@ #include #include +#include #include #include #include +#include #define OS_NETWORK_SUPPORTS_IPV6 diff --git a/src/os/posix/inc/os-posix.h b/src/os/posix/inc/os-posix.h index c8bc190d9..eec05882f 100644 --- a/src/os/posix/inc/os-posix.h +++ b/src/os/posix/inc/os-posix.h @@ -45,7 +45,6 @@ #include #include #include -#include /* * Use the global definitions from the shared layer @@ -96,6 +95,7 @@ int32 OS_Posix_QueueAPI_Impl_Init(void); int32 OS_Posix_BinSemAPI_Impl_Init(void); int32 OS_Posix_CountSemAPI_Impl_Init(void); int32 OS_Posix_MutexAPI_Impl_Init(void); +int32 OS_Posix_RwLockAPI_Impl_Init(void); int32 OS_Posix_CondVarAPI_Impl_Init(void); int32 OS_Posix_ModuleAPI_Impl_Init(void); int32 OS_Posix_TimeBaseAPI_Impl_Init(void); diff --git a/src/os/posix/src/os-impl-rwlock.c b/src/os/posix/src/os-impl-rwlock.c new file mode 100644 index 000000000..963145ae0 --- /dev/null +++ b/src/os/posix/src/os-impl-rwlock.c @@ -0,0 +1,225 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup posix + * \author joseph.p.hickey@nasa.gov + * + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +#include "os-posix.h" +#include "os-shared-rwlock.h" +#include "os-shared-idmap.h" +#include "os-impl-rwlock.h" + +/* Tables where the OS object information is stored */ +OS_impl_rwlock_internal_record_t OS_impl_rwlock_table[OS_MAX_RWLOCKS]; + +/**************************************************************************************** + RWLOCK API + ***************************************************************************************/ + +/*---------------------------------------------------------------- + * + * Purpose: Local helper routine, not part of OSAL API. + * + *-----------------------------------------------------------------*/ +int32 OS_Posix_RwLockAPI_Impl_Init(void) +{ + memset(OS_impl_rwlock_table, 0, sizeof(OS_impl_rwlock_table)); + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockCreate_Impl(const OS_object_token_t *token, uint32 options) +{ + int return_code; + pthread_rwlockattr_t rwlock_attr; + OS_impl_rwlock_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_rwlock_table, *token); + + /* + ** initialize the attribute with default values + */ + return_code = pthread_rwlockattr_init(&rwlock_attr); + if (return_code != 0) + { + OS_DEBUG("Error: RwLock could not be created. pthread_rwlockattr_init failed ID = %lu: %s\n", + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), strerror(return_code)); + return OS_ERROR; + } + + /* + ** create the rwlock + ** upon successful initialization, the state of the rwlock becomes initialized and unlocked + */ + return_code = pthread_rwlock_init(&impl->id, &rwlock_attr); + if (return_code != 0) + { + OS_DEBUG("Error: RwLock could not be created. ID = %lu: %s\n", + OS_ObjectIdToInteger(OS_ObjectIdFromToken(token)), strerror(return_code)); + return OS_SEM_FAILURE; + } + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockDelete_Impl(const OS_object_token_t *token) +{ + int status; + OS_impl_rwlock_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_rwlock_table, *token); + + status = pthread_rwlock_destroy(&(impl->id)); /* 0 = success */ + + if (status != 0) + { + return OS_ERROR; + } + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockReadGive_Impl(const OS_object_token_t *token) +{ + int status; + OS_impl_rwlock_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_rwlock_table, *token); + + /* + ** Unlock the mutex + */ + status = pthread_rwlock_unlock(&(impl->id)); + if (status != 0) + { + return OS_ERROR; + } + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockWriteGive_Impl(const OS_object_token_t *token) +{ + int status; + OS_impl_rwlock_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_rwlock_table, *token); + + /* + ** Unlock the mutex + */ + status = pthread_rwlock_unlock(&(impl->id)); + if (status != 0) + { + return OS_ERROR; + } + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockReadTake_Impl(const OS_object_token_t *token) +{ + int status; + OS_impl_rwlock_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_rwlock_table, *token); + + /* + ** Lock the mutex + */ + status = pthread_rwlock_rdlock(&(impl->id)); + if (status != 0) + { + return OS_ERROR; + } + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockWriteTake_Impl(const OS_object_token_t *token) +{ + int status; + OS_impl_rwlock_internal_record_t *impl; + + impl = OS_OBJECT_TABLE_GET(OS_impl_rwlock_table, *token); + + /* + ** Lock the mutex + */ + status = pthread_rwlock_wrlock(&(impl->id)); + if (status != 0) + { + return OS_ERROR; + } + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockGetInfo_Impl(const OS_object_token_t *token, OS_rwlock_prop_t *rw_prop) +{ + return OS_SUCCESS; +} diff --git a/src/os/posix/src/os-impl-tasks.c b/src/os/posix/src/os-impl-tasks.c index 18eed5efe..7100c8990 100644 --- a/src/os/posix/src/os-impl-tasks.c +++ b/src/os/posix/src/os-impl-tasks.c @@ -713,7 +713,7 @@ int32 OS_TaskDelete_Impl(const OS_object_token_t *token) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TaskExit_Impl() +void OS_TaskExit_Impl(void) { pthread_exit(NULL); } diff --git a/src/os/qnx/CMakeLists.txt b/src/os/qnx/CMakeLists.txt new file mode 100644 index 000000000..f12c78a32 --- /dev/null +++ b/src/os/qnx/CMakeLists.txt @@ -0,0 +1,109 @@ +###################################################################### +# +# CMAKE build recipe for QNX/POSIX OSAL implementation +# +###################################################################### + +# This CMake script generates targets specific to the QNX/POSIX implementation + +# The basic set of POSIX files which are always built +set(POSIX_BASE_SRCLIST + ../posix/src/os-impl-binsem.c + ../posix/src/os-impl-common.c + ../posix/src/os-impl-console.c + ../posix/src/os-impl-condvar.c + ../posix/src/os-impl-countsem.c + ../posix/src/os-impl-dirs.c + ../posix/src/os-impl-errors.c + ../posix/src/os-impl-files.c + ../posix/src/os-impl-heap.c + ../posix/src/os-impl-idmap.c + ../posix/src/os-impl-mutex.c + ../posix/src/os-impl-queues.c + ../posix/src/os-impl-tasks.c + ../posix/src/os-impl-timebase.c +) + +# Use portable blocks for basic I/O +set(POSIX_IMPL_SRCLIST + ../portable/os-impl-posix-gettime.c + ../portable/os-impl-posix-gettime-monotonic.c + ../portable/os-impl-console-bsp.c + ../portable/os-impl-bsd-select.c + ../portable/os-impl-posix-io.c + ../portable/os-impl-posix-files.c + ../portable/os-impl-posix-dirs.c + ../portable/os-impl-no-file-allocate.c +) + +if (OSAL_CONFIG_INCLUDE_SHELL) + list(APPEND POSIX_IMPL_SRCLIST + ../posix/src/os-impl-shell.c + ) +else () + list(APPEND POSIX_IMPL_SRCLIST + ../portable/os-impl-no-shell.c + ) +endif () + +if (OSAL_CONFIG_RWLOCK) + list(APPEND POSIX_IMPL_SRCLIST + ../posix/src/os-impl-rwlock.c + ) +else () + list(APPEND POSIX_IMPL_SRCLIST + ../portable/os-impl-no-rwlock.c + ) +endif () + +# If some form of module loading is configured, +# then build the module loader +if (OSAL_CONFIG_INCLUDE_DYNAMIC_LOADER) + list(APPEND POSIX_IMPL_SRCLIST + ../posix/src/os-impl-loader.c + ../portable/os-impl-posix-dl-loader.c + ../portable/os-impl-posix-dl-symtab.c + ) +else () + list(APPEND POSIX_IMPL_SRCLIST + ../posix/src/os-impl-no-module.c + ../portable/os-impl-no-loader.c + ../portable/os-impl-no-symtab.c + ) +endif () + +if (OSAL_CONFIG_INCLUDE_NETWORK) + list(APPEND POSIX_IMPL_SRCLIST + ../portable/os-impl-bsd-sockets.c # Use BSD socket layer implementation + ../portable/os-impl-bsd-sockets-no-dns.c # Use functions that do not require DNS + ../portable/os-impl-posix-network-gethostname.c # Use POSIX-defined hostname implementation + ) +else() + list(APPEND POSIX_IMPL_SRCLIST + ../portable/os-impl-no-network-gethostname.c # non-implemented versions of gethostname API + ../portable/os-impl-no-sockets.c # non-implemented versions of all socket APIs + ) +endif () + +# Use the QNX specific set of files +set(QNX_IMPL_SRCLIST + src/os-impl-filesys.c + ../portable/os-impl-no-network-gethostid.c # non-implemented versions of gethostid API +) + +# Defines an OBJECT target named "osal_qnx_impl" with selected source files +add_library(osal_qnx_impl OBJECT + ${POSIX_BASE_SRCLIST} + ${POSIX_IMPL_SRCLIST} + ${QNX_IMPL_SRCLIST} +) + +target_include_directories(osal_qnx_impl PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../posix/inc + ${CMAKE_CURRENT_SOURCE_DIR}/inc +) + +target_compile_definitions(osal_public_api INTERFACE + _POSIX_OS_ + _QNX_OS_ +) diff --git a/src/os/qnx/src/os-impl-filesys.c b/src/os/qnx/src/os-impl-filesys.c new file mode 100644 index 000000000..d144a3e29 --- /dev/null +++ b/src/os/qnx/src/os-impl-filesys.c @@ -0,0 +1,345 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup posix + * \author joseph.p.hickey@nasa.gov + * + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "os-posix.h" +#include "os-shared-filesys.h" +#include "os-shared-idmap.h" +#include "os-shared-common.h" + +/**************************************************************************************** + DEFINES + ***************************************************************************************/ + +/**************************************************************************************** + GLOBAL DATA + ***************************************************************************************/ +const char OS_POSIX_DEVICEFILE_PREFIX[] = "/dev/"; + +/**************************************************************************************** + Filesys API + ***************************************************************************************/ + +/* -------------------------------------------------------------------------------------- + Name: OS_Posix_FileSysAPI_Impl_Init + + Purpose: Filesystem API global initialization + + Returns: OS_SUCCESS if success + ---------------------------------------------------------------------------------------*/ +int32 OS_Posix_FileSysAPI_Impl_Init(void) +{ + return OS_SUCCESS; +} + +/* + * System Level API + */ + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysStartVolume_Impl(const OS_object_token_t *token) +{ + OS_filesys_internal_record_t *local; + struct stat stat_buf; + const char * tmpdir; + size_t mplen; + size_t vollen; + uint32 i; + enum + { + VOLATILE_DISK_LOC_ENV, + VOLATILE_DISK_LOC_MNT_FS1, + VOLATILE_DISK_LOC_MNT_FS2, + VOLATILE_DISK_LOC_MNT_CDS, + VOLATILE_DISK_LOC_TMP, + VOLATILE_DISK_LOC_MAX + }; + + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + + /* + * Determine basic type of filesystem, if not already known + */ + if (local->fstype == OS_FILESYS_TYPE_UNKNOWN && + strncmp(local->device_name, OS_POSIX_DEVICEFILE_PREFIX, sizeof(OS_POSIX_DEVICEFILE_PREFIX) - 1) == 0) + { + /* + * If referring to a real device in the /dev filesystem, + * then assume it is a normal disk. + */ + local->fstype = OS_FILESYS_TYPE_NORMAL_DISK; + } + + /* + * For VOLATILE volumes, there are multiple options: + * - Using the RAMDISK environment variable, if it exists + * - The /mnt/fs1 filesystem mount point, if it exists + * - The /mnt/fs2 filesystem mount point, if it exists + * - The /mnt/cds filesystem mount point, if it exists + * - The /tmp filesystem + * + * The /tmp file system might be a regular persistent disk, but should always exist + * on any POSIX-compliant OS. + */ + + tmpdir = NULL; + if (local->fstype == OS_FILESYS_TYPE_VOLATILE_DISK) + { + /* find a suitable location to keep the volatile disk */ + for (i = 0; i <= VOLATILE_DISK_LOC_MAX; ++i) + { + switch (i) + { + case VOLATILE_DISK_LOC_ENV: + /* try the TMPDIR environment variable, if set */ + tmpdir = getenv("TMPDIR"); + break; + case VOLATILE_DISK_LOC_MNT_FS1: + /* try the mount point for filesystem 1 */ + tmpdir = "/mnt/fs1"; + break; + case VOLATILE_DISK_LOC_MNT_FS2: + /* try the mount point for filesystem 2 */ + tmpdir = "/mnt/fs2"; + break; + case VOLATILE_DISK_LOC_MNT_CDS: + /* try the mount point for Critical Data Store */ + tmpdir = "/mnt/cds"; + break; + case VOLATILE_DISK_LOC_TMP: + /* use /tmp directory as a last resort */ + tmpdir = "/tmp"; + break; + default: + tmpdir = NULL; + break; + } + + if (tmpdir != NULL && stat(tmpdir, &stat_buf) == 0) + { + /* check if the user has write permission to the directory */ + if ((stat_buf.st_mode & S_IWOTH) != 0 || + ((stat_buf.st_mode & S_IWGRP) != 0 && stat_buf.st_gid == getegid()) || + ((stat_buf.st_mode & S_IWUSR) != 0 && stat_buf.st_uid == geteuid())) + { + break; + } + } + } + + if (tmpdir == NULL) + { + /* OS provides no place to put the volume */ + OS_DEBUG("No storage location for volatile volumes"); + return OS_FS_ERR_DRIVE_NOT_CREATED; + } + + /* + * Note - performing the concatenation in a single snprintf() call seems + * to trigger a (false) pointer overlap warning, because volume_name should + * always be null terminated. To get around this, calculate the + * string size and check that it is within the expected size, and do the + * append of volume_name explicitly. + */ + mplen = snprintf(local->system_mountpt, sizeof(local->system_mountpt), "%s/osal", tmpdir); + if (mplen < sizeof(local->system_mountpt)) + { + vollen = OS_strnlen(local->volume_name, sizeof(local->volume_name)); + if ((vollen + mplen) >= sizeof(local->system_mountpt)) + { + vollen = sizeof(local->system_mountpt) - mplen - 1; + } + memcpy(&local->system_mountpt[mplen], local->volume_name, vollen); + local->system_mountpt[mplen + vollen] = 0; + } + } + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysStopVolume_Impl(const OS_object_token_t *token) +{ + /* + * This is a no-op. + * + * Volatile volumes are just directories created in the temp dir, + * and this will not remove the directories just in case something + * went wrong. + * + * If the volume is started again, the directory will be re-used. + */ + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysFormatVolume_Impl(const OS_object_token_t *token) +{ + /* + * In theory, this should wipe any existing files in the ramdisk, + * but since ramdisks here are implemented using a directory within a tmpfs, + * removal of such files could be risky if something goes wrong, + * because it might remove files that were important. + * + * So the safest option is just a no-op. + * (this is also backward compatible since POSIX mkfs was always a no-op) + */ + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysMountVolume_Impl(const OS_object_token_t *token) +{ + OS_filesys_internal_record_t *local; + struct stat stat_buf; + + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + + /* + * This will do a mkdir() for the mount point if it does + * not already exist. + */ + if (stat(local->system_mountpt, &stat_buf) != 0) + { + if (mkdir(local->system_mountpt, 0700) < 0) + { + OS_DEBUG("ERROR: Cannot create mount point %s: %s", local->system_mountpt, strerror(errno)); + return OS_FS_ERR_DRIVE_NOT_CREATED; + } + } + else if (!S_ISDIR(stat_buf.st_mode)) + { + OS_DEBUG("ERROR: Volume %s exists and is not a directory", local->system_mountpt); + return OS_FS_ERR_DRIVE_NOT_CREATED; + } + + /* + * NOTE: The mount() system call could be used here to actually + * mount a disk, if warranted. For all current POSIX-based PSPs, + * this is not needed, because the volumes are all pre-mounted + * through the system init before OSAL starts. + * + * For volatile filesystems (ramdisk) these were created within + * a temp filesystem, so all that is needed is to ensure the + * mount point exists. For any other FS type, trigger an + * error to indicate that it is not implemented in this OSAL. + */ + if (local->fstype != OS_FILESYS_TYPE_VOLATILE_DISK && local->fstype != OS_FILESYS_TYPE_FS_BASED) + { + /* the mount command is not implemented for this FS type */ + return OS_ERR_NOT_IMPLEMENTED; + } + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysUnmountVolume_Impl(const OS_object_token_t *token) +{ + /* + * NOTE: Mounting/Unmounting on POSIX is not implemented. + * For backward compatibility this call must return success. + * + * This is a no-op. The mount point that was created during + * the mount process can stay for the next mount. + */ + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysStatVolume_Impl(const OS_object_token_t *token, OS_statvfs_t *result) +{ + OS_filesys_internal_record_t *local; + struct statvfs stat_buf; + + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + + if (statvfs(local->system_mountpt, &stat_buf) != 0) + { + return OS_ERROR; + } + + result->block_size = OSAL_SIZE_C(stat_buf.f_bsize); + result->blocks_free = OSAL_BLOCKCOUNT_C(stat_buf.f_bfree); + result->total_blocks = OSAL_BLOCKCOUNT_C(stat_buf.f_blocks); + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysCheckVolume_Impl(const OS_object_token_t *token, bool repair) +{ + return OS_ERR_NOT_IMPLEMENTED; +} diff --git a/src/os/rtems/CMakeLists.txt b/src/os/rtems/CMakeLists.txt index 2358ae844..d4d34817b 100644 --- a/src/os/rtems/CMakeLists.txt +++ b/src/os/rtems/CMakeLists.txt @@ -28,11 +28,14 @@ set(RTEMS_BASE_SRCLIST # Use portable blocks for basic I/O set(RTEMS_IMPL_SRCLIST ../portable/os-impl-posix-gettime.c + ../portable/os-impl-posix-gettime-monotonic.c ../portable/os-impl-console-bsp.c ../portable/os-impl-posix-io.c ../portable/os-impl-posix-files.c ../portable/os-impl-posix-dirs.c ../portable/os-impl-no-condvar.c + ../portable/os-impl-no-rwlock.c + ../portable/os-impl-no-file-allocate.c ) # Currently the "shell output to file" for RTEMS is not implemented @@ -60,6 +63,7 @@ if (OSAL_CONFIG_INCLUDE_NETWORK) list(APPEND RTEMS_IMPL_SRCLIST src/os-impl-network.c ../portable/os-impl-bsd-sockets.c + ../portable/os-impl-bsd-sockets-no-dns.c # Use functions that do not require DNS ../portable/os-impl-bsd-select.c ) @@ -73,7 +77,8 @@ if (OSAL_CONFIG_INCLUDE_NETWORK) endif() else() list(APPEND RTEMS_IMPL_SRCLIST - ../portable/os-impl-no-network.c + ../portable/os-impl-no-network-gethostid.c + ../portable/os-impl-no-network-gethostname.c ../portable/os-impl-no-sockets.c ../portable/os-impl-no-select.c ) diff --git a/src/os/rtems/inc/os-impl-gettime.h b/src/os/rtems/inc/os-impl-gettime.h index 2604eb865..14d96416f 100644 --- a/src/os/rtems/inc/os-impl-gettime.h +++ b/src/os/rtems/inc/os-impl-gettime.h @@ -35,6 +35,14 @@ * This is the POSIX clock ID that will be used to implement * OS_GetLocalTime() and OS_SetLocalTime(). */ -#define OSAL_GETTIME_SOURCE_CLOCK CLOCK_REALTIME +#define OSAL_GETTIME_LOCAL_CLOCK CLOCK_REALTIME + +/** + * \brief Identifies the clock ID for OSAL clock operations on POSIX + * + * This is the POSIX clock ID that will be used to implement + * OS_GetMonotonicTime(). + */ +#define OSAL_GETTIME_MONOTONIC_CLOCK CLOCK_MONOTONIC #endif /* OS_IMPL_GETTIME_H */ diff --git a/src/os/rtems/src/os-impl-common.c b/src/os/rtems/src/os-impl-common.c index a148a7c19..0848bbdd7 100644 --- a/src/os/rtems/src/os-impl-common.c +++ b/src/os/rtems/src/os-impl-common.c @@ -106,7 +106,7 @@ int32 OS_API_Impl_Init(osal_objtype_t idtype) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_IdleLoop_Impl() +void OS_IdleLoop_Impl(void) { RTEMS_GlobalVars.IdleTaskId = rtems_task_self(); rtems_task_suspend(RTEMS_SELF); @@ -118,7 +118,7 @@ void OS_IdleLoop_Impl() * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_ApplicationShutdown_Impl() +void OS_ApplicationShutdown_Impl(void) { /* Note that setting the IdleTaskId and suspending * the idle task is not an atomic operation, so there diff --git a/src/os/rtems/src/os-impl-tasks.c b/src/os/rtems/src/os-impl-tasks.c index 10e09943b..fb61e08c7 100644 --- a/src/os/rtems/src/os-impl-tasks.c +++ b/src/os/rtems/src/os-impl-tasks.c @@ -187,7 +187,7 @@ int32 OS_TaskDetach_Impl(const OS_object_token_t *token) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TaskExit_Impl() +void OS_TaskExit_Impl(void) { rtems_task_delete(RTEMS_SELF); } diff --git a/src/os/shared/inc/os-shared-clock.h b/src/os/shared/inc/os-shared-clock.h index d578c7474..93db24778 100644 --- a/src/os/shared/inc/os-shared-clock.h +++ b/src/os/shared/inc/os-shared-clock.h @@ -34,6 +34,14 @@ * These simply get/set the kernel RTC (if it has one) */ +/*---------------------------------------------------------------- + + Purpose: Get the monotinc time from the Operating System + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_GetMonotonicTime_Impl(OS_time_t *time_struct); + /*---------------------------------------------------------------- Purpose: Get the time from the RTC diff --git a/src/os/shared/inc/os-shared-file.h b/src/os/shared/inc/os-shared-file.h index a96797a74..2e828689b 100644 --- a/src/os/shared/inc/os-shared-file.h +++ b/src/os/shared/inc/os-shared-file.h @@ -76,7 +76,7 @@ int32 OS_FileAPI_Init(void); Returns: File position (non-negative) on success, or relevant error code (negative) ------------------------------------------------------------------*/ -int32 OS_GenericSeek_Impl(const OS_object_token_t *token, int32 offset, uint32 whence); +int32 OS_GenericSeek_Impl(const OS_object_token_t *token, osal_offset_t offset, uint32 whence); /*---------------------------------------------------------------- @@ -114,6 +114,22 @@ int32 OS_GenericClose_Impl(const OS_object_token_t *token); ------------------------------------------------------------------*/ int32 OS_FileOpen_Impl(const OS_object_token_t *token, const char *local_path, int32 flags, int32 access_mode); +/*---------------------------------------------------------------- + + Purpose: Pre-allocates disk space at the specified offset and length + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_FileAllocate_Impl(const OS_object_token_t *token, osal_offset_t offset, osal_offset_t len); + +/*---------------------------------------------------------------- + + Purpose: Truncates (or expands) file to the specified length + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_FileTruncate_Impl(const OS_object_token_t *token, osal_offset_t len); + /*---------------------------------------------------------------- Purpose: Takes a shell command in and writes the output of that command to the specified file diff --git a/src/os/shared/inc/os-shared-idmap.h b/src/os/shared/inc/os-shared-idmap.h index c1dacc285..ce6c6d56b 100644 --- a/src/os/shared/inc/os-shared-idmap.h +++ b/src/os/shared/inc/os-shared-idmap.h @@ -49,7 +49,8 @@ typedef enum OS_BINSEM_BASE = OS_QUEUE_BASE + OS_MAX_QUEUES, OS_COUNTSEM_BASE = OS_BINSEM_BASE + OS_MAX_BIN_SEMAPHORES, OS_MUTEX_BASE = OS_COUNTSEM_BASE + OS_MAX_COUNT_SEMAPHORES, - OS_STREAM_BASE = OS_MUTEX_BASE + OS_MAX_MUTEXES, + OS_RWLOCK_BASE = OS_MUTEX_BASE + OS_MAX_MUTEXES, + OS_STREAM_BASE = OS_RWLOCK_BASE + OS_MAX_RWLOCKS, OS_DIR_BASE = OS_STREAM_BASE + OS_MAX_NUM_OPEN_FILES, OS_TIMEBASE_BASE = OS_DIR_BASE + OS_MAX_NUM_OPEN_DIRS, OS_TIMECB_BASE = OS_TIMEBASE_BASE + OS_MAX_TIMEBASES, @@ -147,6 +148,7 @@ extern OS_common_record_t *const OS_global_queue_table; extern OS_common_record_t *const OS_global_bin_sem_table; extern OS_common_record_t *const OS_global_count_sem_table; extern OS_common_record_t *const OS_global_mutex_table; +extern OS_common_record_t *const OS_global_rwlock_table; extern OS_common_record_t *const OS_global_stream_table; extern OS_common_record_t *const OS_global_dir_table; extern OS_common_record_t *const OS_global_timebase_table; diff --git a/src/os/shared/inc/os-shared-rwlock.h b/src/os/shared/inc/os-shared-rwlock.h new file mode 100644 index 000000000..93eacded6 --- /dev/null +++ b/src/os/shared/inc/os-shared-rwlock.h @@ -0,0 +1,109 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * + * \ingroup shared + * + */ + +#ifndef OS_SHARED_RWLOCK_H +#define OS_SHARED_RWLOCK_H + +#include "osapi-rwlock.h" +#include "os-shared-globaldefs.h" + +typedef struct +{ + char obj_name[OS_MAX_API_NAME]; + osal_id_t last_writer; +} OS_rwlock_internal_record_t; + +/* + * These record types have extra information with each entry. These tables are used + * to share extra data between the common layer and the OS-specific implementation. + */ +extern OS_rwlock_internal_record_t OS_rwlock_table[OS_MAX_RWLOCKS]; + +/*--------------------------------------------------------------------------------------- + Name: OS_RwLockAPI_Init + + Purpose: Initialize the OS-independent layer for rwlock objects + + returns: OS_SUCCESS on success, or relevant error code +---------------------------------------------------------------------------------------*/ +int32 OS_RwLockAPI_Init(void); + +/*---------------------------------------------------------------- + + Purpose: Prepare/allocate OS resources for a rwlock object + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_RwLockCreate_Impl(const OS_object_token_t *token, uint32 options); + +/*---------------------------------------------------------------- + + Purpose: Releases the read lock, which must be owned by the caller + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_RwLockReadGive_Impl(const OS_object_token_t *token); + +/*---------------------------------------------------------------- + + Purpose: Releases the write lock, which must be owned by the caller + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_RwLockWriteGive_Impl(const OS_object_token_t *token); + +/*---------------------------------------------------------------- + + Purpose: Obtain a read lock, blocking the caller as necessary + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_RwLockReadTake_Impl(const OS_object_token_t *token); + +/*---------------------------------------------------------------- + + Purpose: Obtain a write lock, blocking the caller as necessary + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_RwLockWriteTake_Impl(const OS_object_token_t *token); + +/*---------------------------------------------------------------- + + Purpose: Free the OS resources associated with a rwlock object + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_RwLockDelete_Impl(const OS_object_token_t *token); + +/*---------------------------------------------------------------- + + Purpose: Obtain OS-specific information about the rwlock object + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_RwLockGetInfo_Impl(const OS_object_token_t *token, OS_rwlock_prop_t *rw_prop); + +#endif /* OS_SHARED_RWLOCK_H */ diff --git a/src/os/shared/inc/os-shared-sockets.h b/src/os/shared/inc/os-shared-sockets.h index c1989bd92..82bb30e95 100644 --- a/src/os/shared/inc/os-shared-sockets.h +++ b/src/os/shared/inc/os-shared-sockets.h @@ -126,6 +126,23 @@ int32 OS_SocketSendTo_Impl(const OS_object_token_t *token, const void *buffer, s ------------------------------------------------------------------*/ int32 OS_SocketGetInfo_Impl(const OS_object_token_t *token, OS_socket_prop_t *sock_prop); +/*---------------------------------------------------------------- + + Purpose: Get OS-specific option value for a socket + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_SocketGetOption_Impl(const OS_object_token_t *token, OS_socket_option_t opt_id, OS_socket_optval_t *optval); + +/*---------------------------------------------------------------- + + Purpose: Set OS-specific option value for a socket + + Returns: OS_SUCCESS on success, or relevant error code + ------------------------------------------------------------------*/ +int32 OS_SocketSetOption_Impl(const OS_object_token_t *token, OS_socket_option_t opt_id, + const OS_socket_optval_t *optval); + /*---------------------------------------------------------------- Purpose: Initializes an OSAL SockAddr structure to the given address domain diff --git a/src/os/shared/src/osapi-clock.c b/src/os/shared/src/osapi-clock.c index 2cd0b0448..f82c28efd 100644 --- a/src/os/shared/src/osapi-clock.c +++ b/src/os/shared/src/osapi-clock.c @@ -38,6 +38,20 @@ */ #include "os-shared-clock.h" +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_GetMonotonicTime(OS_time_t *time_struct) +{ + /* Check parameters */ + OS_CHECK_POINTER(time_struct); + + return OS_GetMonotonicTime_Impl(time_struct); +} + /*---------------------------------------------------------------- * * Purpose: Implemented per public OSAL API diff --git a/src/os/shared/src/osapi-common.c b/src/os/shared/src/osapi-common.c index c669ed594..0a25bdc75 100644 --- a/src/os/shared/src/osapi-common.c +++ b/src/os/shared/src/osapi-common.c @@ -390,7 +390,7 @@ void OS_DeleteAllObjects(void) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -void OS_IdleLoop() +void OS_IdleLoop(void) { /* * Wait until the shutdown value is set to the shutdown number diff --git a/src/os/shared/src/osapi-file.c b/src/os/shared/src/osapi-file.c index 3d72e1324..0cc11202e 100644 --- a/src/os/shared/src/osapi-file.c +++ b/src/os/shared/src/osapi-file.c @@ -322,7 +322,7 @@ int32 OS_stat(const char *path, os_fstat_t *filestats) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -int32 OS_lseek(osal_id_t filedes, int32 offset, uint32 whence) +int32 OS_lseek(osal_id_t filedes, osal_offset_t offset, uint32 whence) { OS_object_token_t token; int32 return_code; @@ -338,6 +338,55 @@ int32 OS_lseek(osal_id_t filedes, int32 offset, uint32 whence) return return_code; } +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileAllocate(osal_id_t filedes, osal_offset_t offset, osal_offset_t length) +{ + OS_object_token_t token; + int32 return_code; + + /* Make sure the file descriptor is legit before using it */ + /* The allocation might block while space is obtained, so use REFCOUNT lock here */ + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &token); + if (return_code == OS_SUCCESS) + { + return_code = OS_FileAllocate_Impl(&token, offset, length); + OS_ObjectIdRelease(&token); + } + + return return_code; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileTruncate(osal_id_t filedes, osal_offset_t length) +{ + OS_object_token_t token; + int32 return_code; + + /* Make sure the file descriptor is legit before using it */ + /* note that ftruncate (or equivalent) is expected to be a quick and easy operation, + * it should not TYPICALLY block for any period of time, but it can block if + * there are other simultaneous ops on the same file occurring. Hence why + * this still uses a REFCOUNT lock type */ + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_REFCOUNT, LOCAL_OBJID_TYPE, filedes, &token); + if (return_code == OS_SUCCESS) + { + return_code = OS_FileTruncate_Impl(&token, length); + OS_ObjectIdRelease(&token); + } + + return return_code; +} + /*---------------------------------------------------------------- * * Purpose: Implemented per public OSAL API diff --git a/src/os/shared/src/osapi-idmap.c b/src/os/shared/src/osapi-idmap.c index 13a3d336a..c414d25eb 100644 --- a/src/os/shared/src/osapi-idmap.c +++ b/src/os/shared/src/osapi-idmap.c @@ -94,6 +94,7 @@ OS_common_record_t *const OS_global_queue_table = &OS_common_table[OS_QUEUE_ OS_common_record_t *const OS_global_bin_sem_table = &OS_common_table[OS_BINSEM_BASE]; OS_common_record_t *const OS_global_count_sem_table = &OS_common_table[OS_COUNTSEM_BASE]; OS_common_record_t *const OS_global_mutex_table = &OS_common_table[OS_MUTEX_BASE]; +OS_common_record_t *const OS_global_rwlock_table = &OS_common_table[OS_RWLOCK_BASE]; OS_common_record_t *const OS_global_stream_table = &OS_common_table[OS_STREAM_BASE]; OS_common_record_t *const OS_global_dir_table = &OS_common_table[OS_DIR_BASE]; OS_common_record_t *const OS_global_timebase_table = &OS_common_table[OS_TIMEBASE_BASE]; @@ -141,6 +142,8 @@ uint32 OS_GetMaxForObjectType(osal_objtype_t idtype) return OS_MAX_COUNT_SEMAPHORES; case OS_OBJECT_TYPE_OS_MUTEX: return OS_MAX_MUTEXES; + case OS_OBJECT_TYPE_OS_RWLOCK: + return OS_MAX_RWLOCKS; case OS_OBJECT_TYPE_OS_STREAM: return OS_MAX_NUM_OPEN_FILES; case OS_OBJECT_TYPE_OS_DIR: @@ -181,6 +184,8 @@ uint32 OS_GetBaseForObjectType(osal_objtype_t idtype) return OS_COUNTSEM_BASE; case OS_OBJECT_TYPE_OS_MUTEX: return OS_MUTEX_BASE; + case OS_OBJECT_TYPE_OS_RWLOCK: + return OS_RWLOCK_BASE; case OS_OBJECT_TYPE_OS_STREAM: return OS_STREAM_BASE; case OS_OBJECT_TYPE_OS_DIR: @@ -595,8 +600,8 @@ int32 OS_ObjectIdFindNextFree(OS_object_token_t *token) OS_common_record_t *obj = NULL; OS_objtype_state_t *objtype_state; - base_id = OS_GetBaseForObjectType(token->obj_type); - max_id = OS_GetMaxForObjectType(token->obj_type); + base_id = OS_GetBaseForObjectType(token->obj_type); + max_id = OS_GetMaxForObjectType(token->obj_type); if (max_id == 0) { @@ -1285,7 +1290,8 @@ bool OS_ObjectIdIteratorGetNext(OS_object_iter_t *iter) iter->token.obj_id = record->active_id; got_next = true; } - } while (!got_next); + } + while (!got_next); return got_next; } diff --git a/src/os/shared/src/osapi-module.c b/src/os/shared/src/osapi-module.c index 2c320d207..5dd68e932 100644 --- a/src/os/shared/src/osapi-module.c +++ b/src/os/shared/src/osapi-module.c @@ -101,7 +101,15 @@ int32 OS_SymbolLookup_Static(cpuaddr *SymbolAddress, const char *SymbolName, con * Return "OS_ERROR" to indicate that an actual search was done * with a not-found result, vs. not searching at all. */ return_code = OS_ERROR; - break; + /* note: instead of including a regular break statement here, we + * do this so that we can get full coverage on the MC/DC tests. The + * two lines below in terms of behavior for this function are equivalent. + * Because for coverage purposes we only need to execute each branch + * and/or condition at least once, the other break statement in this + * while loop is left as is, since the break statement is more clear + * about what its purpose is rather than the two lines below. */ + StaticSym = NULL; + continue; } if (strcmp(StaticSym->Name, SymbolName) == 0 && (ModuleName == NULL || strcmp(StaticSym->Module, ModuleName) == 0)) @@ -134,7 +142,10 @@ int32 OS_ModuleLoad_Static(const char *ModuleName) if (StaticSym->Name == NULL) { /* end of list */ - break; + /* see comment in OS_SymbolLookup_Static regarding similar + * statement @author lukas.n.kebuladze@nasa.gov */ + StaticSym = NULL; + continue; } if (StaticSym->Module != NULL && strcmp(StaticSym->Module, ModuleName) == 0) { diff --git a/src/os/shared/src/osapi-rwlock.c b/src/os/shared/src/osapi-rwlock.c new file mode 100644 index 000000000..1ecbd1fe8 --- /dev/null +++ b/src/os/shared/src/osapi-rwlock.c @@ -0,0 +1,319 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup shared + * \author joseph.p.hickey@nasa.gov + * + * This file contains some of the OS APIs abstraction layer code + * that is shared/common across all OS-specific implementations. + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ +#include +#include +#include +#include + +/* + * User defined include files + */ +#include "os-shared-idmap.h" +#include "os-shared-rwlock.h" + +/* + * Other OSAL public APIs used by this module + */ +#include "osapi-task.h" + +/* + * Sanity checks on the user-supplied configuration + * The relevant OS_MAX limit should be defined and greater than zero + */ +#if !defined(OS_MAX_RWLOCKS) || (OS_MAX_RWLOCKS <= 0) +#error "osconfig.h must define OS_MAX_RWLOCKS to a valid value" +#endif + +/* + * Global data for the API + */ +enum +{ + LOCAL_NUM_OBJECTS = OS_MAX_RWLOCKS, + LOCAL_OBJID_TYPE = OS_OBJECT_TYPE_OS_RWLOCK +}; + +OS_rwlock_internal_record_t OS_rwlock_table[LOCAL_NUM_OBJECTS]; + +/**************************************************************************************** + RWLOCK API + ***************************************************************************************/ + +/*---------------------------------------------------------------- + * + * Purpose: Local helper routine, not part of OSAL API. + * Init function for OS-independent layer + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockAPI_Init(void) +{ + memset(OS_rwlock_table, 0, sizeof(OS_rwlock_table)); + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockCreate(osal_id_t *rw_id, const char *rw_name, uint32 options) +{ + int32 return_code; + OS_object_token_t token; + OS_rwlock_internal_record_t *rwlock; + + /* Check parameters */ + OS_CHECK_POINTER(rw_id); + OS_CHECK_APINAME(rw_name); + + /* Note - the common ObjectIdAllocate routine will lock the object type and leave it locked. */ + return_code = OS_ObjectIdAllocateNew(LOCAL_OBJID_TYPE, rw_name, &token); + if (return_code == OS_SUCCESS) + { + rwlock = OS_OBJECT_TABLE_GET(OS_rwlock_table, token); + + /* Reset the table entry and save the name */ + OS_OBJECT_INIT(token, rwlock, obj_name, rw_name); + + /* Now call the OS-specific implementation. This reads info from the table. */ + return_code = OS_RwLockCreate_Impl(&token, options); + + /* Check result, finalize record, and unlock global table. */ + return_code = OS_ObjectIdFinalizeNew(return_code, &token, rw_id); + } + + return return_code; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockDelete(osal_id_t rw_id) +{ + OS_object_token_t token; + int32 return_code; + + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_EXCLUSIVE, LOCAL_OBJID_TYPE, rw_id, &token); + if (return_code == OS_SUCCESS) + { + return_code = OS_RwLockDelete_Impl(&token); + + /* Complete the operation via the common routine */ + return_code = OS_ObjectIdFinalizeDelete(return_code, &token); + } + + return return_code; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockReadGive(osal_id_t rw_id) +{ + OS_rwlock_internal_record_t *rwlock; + OS_object_token_t token; + int32 return_code; + + /* Check Parameters */ + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, rw_id, &token); + if (return_code == OS_SUCCESS) + { + rwlock = OS_OBJECT_TABLE_GET(OS_rwlock_table, token); + + /* Ensure no write locks were held while this read lock was held */ + if (!OS_ObjectIdEqual(rwlock->last_writer, OS_OBJECT_ID_UNDEFINED)) + { + OS_DEBUG("WARNING: Task %lu giving read lock on rwlock %lu while write lock held by task %lu\n", + OS_ObjectIdToInteger(OS_TaskGetId()), OS_ObjectIdToInteger(rw_id), + OS_ObjectIdToInteger(rwlock->last_writer)); + } + + return_code = OS_RwLockReadGive_Impl(&token); + } + + return return_code; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockWriteGive(osal_id_t rw_id) +{ + OS_rwlock_internal_record_t *rwlock; + OS_object_token_t token; + int32 return_code; + osal_id_t self_task; + + /* Check Parameters */ + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, rw_id, &token); + if (return_code == OS_SUCCESS) + { + rwlock = OS_OBJECT_TABLE_GET(OS_rwlock_table, token); + + self_task = OS_TaskGetId(); + + /* Ensure multiple write locks weren't held */ + if (!OS_ObjectIdEqual(rwlock->last_writer, self_task)) + { + OS_DEBUG("WARNING: Task %lu giving write lock on rwlock %lu while write lock held by task %lu\n", + OS_ObjectIdToInteger(self_task), OS_ObjectIdToInteger(rw_id), + OS_ObjectIdToInteger(rwlock->last_writer)); + } + + rwlock->last_writer = OS_OBJECT_ID_UNDEFINED; + + return_code = OS_RwLockWriteGive_Impl(&token); + } + + return return_code; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockReadTake(osal_id_t rw_id) +{ + OS_rwlock_internal_record_t *rwlock; + OS_object_token_t token; + int32 return_code; + + /* Check Parameters */ + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, rw_id, &token); + if (return_code == OS_SUCCESS) + { + rwlock = OS_OBJECT_TABLE_GET(OS_rwlock_table, token); + + return_code = OS_RwLockReadTake_Impl(&token); + + /* Ensure no write locks are being held */ + if (return_code == OS_SUCCESS && !OS_ObjectIdEqual(rwlock->last_writer, OS_OBJECT_ID_UNDEFINED)) + { + OS_DEBUG("WARNING: Task %lu taking read lock on rwlock %lu while write lock held by task %lu\n", + OS_ObjectIdToInteger(OS_TaskGetId()), OS_ObjectIdToInteger(rw_id), + OS_ObjectIdToInteger(rwlock->last_writer)); + } + } + + return return_code; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockWriteTake(osal_id_t rw_id) +{ + OS_rwlock_internal_record_t *rwlock; + OS_object_token_t token; + int32 return_code; + + /* Check Parameters */ + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_NONE, LOCAL_OBJID_TYPE, rw_id, &token); + if (return_code == OS_SUCCESS) + { + rwlock = OS_OBJECT_TABLE_GET(OS_rwlock_table, token); + + return_code = OS_RwLockWriteTake_Impl(&token); + if (return_code == OS_SUCCESS) + { + rwlock->last_writer = OS_TaskGetId(); + } + } + + return return_code; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockGetIdByName(osal_id_t *rw_id, const char *rw_name) +{ + int32 return_code; + + /* Check parameters */ + OS_CHECK_POINTER(rw_id); + OS_CHECK_POINTER(rw_name); + + return_code = OS_ObjectIdFindByName(LOCAL_OBJID_TYPE, rw_name, rw_id); + + return return_code; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_RwLockGetInfo(osal_id_t rw_id, OS_rwlock_prop_t *rw_prop) +{ + OS_common_record_t *record; + int32 return_code; + OS_object_token_t token; + + /* Check parameters */ + OS_CHECK_POINTER(rw_prop); + + memset(rw_prop, 0, sizeof(OS_rwlock_prop_t)); + + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, rw_id, &token); + if (return_code == OS_SUCCESS) + { + record = OS_OBJECT_TABLE_GET(OS_global_rwlock_table, token); + + strncpy(rw_prop->name, record->name_entry, sizeof(rw_prop->name) - 1); + rw_prop->creator = record->creator; + + return_code = OS_RwLockGetInfo_Impl(&token, rw_prop); + + OS_ObjectIdRelease(&token); + } + + return return_code; +} diff --git a/src/os/shared/src/osapi-sockets.c b/src/os/shared/src/osapi-sockets.c index e980de6b9..6100aa4eb 100644 --- a/src/os/shared/src/osapi-sockets.c +++ b/src/os/shared/src/osapi-sockets.c @@ -702,3 +702,69 @@ int32 OS_SocketAddrSetPort(OS_SockAddr_t *Addr, uint16 PortNum) return OS_SocketAddrSetPort_Impl(Addr, PortNum); } + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_SocketGetOption(osal_id_t sock_id, OS_socket_option_t opt_id, OS_socket_optval_t *optval) +{ + int32 return_code; + OS_object_token_t token; + + /* Check parameters */ + OS_CHECK_POINTER(optval); + + if (opt_id < OS_socket_option_UNDEFINED || opt_id >= OS_socket_option_MAX) + { + return_code = OS_ERR_INVALID_ARGUMENT; + } + else + { + memset(optval, 0, sizeof(*optval)); + + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &token); + if (return_code == OS_SUCCESS) + { + return_code = OS_SocketGetOption_Impl(&token, opt_id, optval); + + OS_ObjectIdRelease(&token); + } + } + + return return_code; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per public OSAL API + * See description in API and header file for detail + * + *-----------------------------------------------------------------*/ +int32 OS_SocketSetOption(osal_id_t sock_id, OS_socket_option_t opt_id, const OS_socket_optval_t *optval) +{ + int32 return_code; + OS_object_token_t token; + + /* Check parameters */ + OS_CHECK_POINTER(optval); + + if (opt_id < OS_socket_option_UNDEFINED || opt_id >= OS_socket_option_MAX) + { + return_code = OS_ERR_INVALID_ARGUMENT; + } + else + { + return_code = OS_ObjectIdGetById(OS_LOCK_MODE_GLOBAL, LOCAL_OBJID_TYPE, sock_id, &token); + if (return_code == OS_SUCCESS) + { + return_code = OS_SocketSetOption_Impl(&token, opt_id, optval); + + OS_ObjectIdRelease(&token); + } + } + + return return_code; +} diff --git a/src/os/shared/src/osapi-task.c b/src/os/shared/src/osapi-task.c index 22b89512c..38ed13382 100644 --- a/src/os/shared/src/osapi-task.c +++ b/src/os/shared/src/osapi-task.c @@ -250,7 +250,7 @@ int32 OS_TaskDelete(osal_id_t task_id) * See description in API and header file for detail * *-----------------------------------------------------------------*/ -void OS_TaskExit() +void OS_TaskExit(void) { osal_id_t task_id; OS_object_token_t token; diff --git a/src/os/vxworks-rtp/CMakeLists.txt b/src/os/vxworks-rtp/CMakeLists.txt new file mode 100644 index 000000000..0292d62c8 --- /dev/null +++ b/src/os/vxworks-rtp/CMakeLists.txt @@ -0,0 +1,105 @@ +###################################################################### +# +# CMAKE build recipe for POSIX OSAL implementation +# +###################################################################### + +# This CMake script generates targets specific to the POSIX implementation + +# The basic set of files which are always built +set(POSIX_BASE_SRCLIST + ../posix/src/os-impl-binsem.c + ../posix/src/os-impl-common.c + ../posix/src/os-impl-console.c + ../posix/src/os-impl-condvar.c + ../posix/src/os-impl-countsem.c + ../posix/src/os-impl-dirs.c + ../posix/src/os-impl-errors.c + ../posix/src/os-impl-heap.c + ../posix/src/os-impl-idmap.c + ../posix/src/os-impl-mutex.c + ../posix/src/os-impl-queues.c + ../posix/src/os-impl-tasks.c + ../posix/src/os-impl-timebase.c + src/os-impl-filesys.c # VxWorks RTP specific implementation + src/os-impl-files.c # VxWorks RTP specific implementation +) + +# Use portable blocks for basic I/O +set(POSIX_IMPL_SRCLIST + ../portable/os-impl-posix-gettime.c + ../portable/os-impl-console-bsp.c + ../portable/os-impl-bsd-select.c + ../portable/os-impl-posix-io.c + ../portable/os-impl-posix-files.c + ../portable/os-impl-posix-dirs.c + ../portable/os-impl-no-file-allocate.c +) + +if (OSAL_CONFIG_INCLUDE_SHELL) + list(APPEND POSIX_IMPL_SRCLIST + ../posix/src/os-impl-shell.c + ) +else () + list(APPEND POSIX_IMPL_SRCLIST + ../portable/os-impl-no-shell.c + ) +endif () + +if (OSAL_CONFIG_RWLOCK) + list(APPEND POSIX_IMPL_SRCLIST + ../posix/src/os-impl-rwlock.c + ) +else () + list(APPEND POSIX_IMPL_SRCLIST + ../portable/os-impl-no-rwlock.c + ) +endif () + +# If some form of module loading is configured, +# then build the module loader +if (OSAL_CONFIG_INCLUDE_DYNAMIC_LOADER) + list(APPEND POSIX_IMPL_SRCLIST + ../posix/src/os-impl-loader.c + ../portable/os-impl-posix-dl-loader.c + ../portable/os-impl-posix-dl-symtab.c + ) +else () + list(APPEND POSIX_IMPL_SRCLIST + ../posix/src/os-impl-no-module.c + ../portable/os-impl-no-loader.c + ../portable/os-impl-no-symtab.c + ) +endif () + +# VxWorks does not support gethostid +list(APPEND POSIX_IMPL_SRCLIST + ../portable/os-impl-no-network-gethostid.c +) + +if (OSAL_CONFIG_INCLUDE_NETWORK) + list(APPEND POSIX_IMPL_SRCLIST + ../portable/os-impl-bsd-sockets.c # Use BSD socket layer implementation + ../portable/os-impl-bsd-sockets-no-dns.c # Use functions that do not require DNS + ../portable/os-impl-posix-network-gethostname.c # Use POSIX-defined hostname implementation + ) +else() + list(APPEND POSIX_IMPL_SRCLIST + ../portable/os-impl-no-network-gethostname.c # non-implemented versions of gethostname API + ../portable/os-impl-no-sockets.c # non-implemented versions of all socket APIs + ) +endif () + +# Defines an OBJECT target named "osal_posix_impl" with selected source files +add_library(osal_vxworks-rtp_impl OBJECT + ${POSIX_BASE_SRCLIST} + ${POSIX_IMPL_SRCLIST} +) + +target_include_directories(osal_vxworks-rtp_impl PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../posix/inc + ${CMAKE_CURRENT_SOURCE_DIR}/inc +) +target_compile_definitions(osal_public_api INTERFACE + _POSIX_OS_ +) diff --git a/src/os/vxworks-rtp/src/os-impl-files.c b/src/os/vxworks-rtp/src/os-impl-files.c new file mode 100644 index 000000000..d31c60f2b --- /dev/null +++ b/src/os/vxworks-rtp/src/os-impl-files.c @@ -0,0 +1,97 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup posix + * \author joseph.p.hickey@nasa.gov + * + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +#include +#include +#include +#include +#include + +#include "os-posix.h" +#include "os-impl-files.h" +#include "os-shared-file.h" + +/**************************************************************************************** + GLOBALS + ***************************************************************************************/ + +/* + * The global file handle table. + * + * This is shared by all OSAL entities that perform low-level I/O. + */ +OS_impl_file_internal_record_t OS_impl_filehandle_table[OS_MAX_NUM_OPEN_FILES]; + +/* + * These two constants (EUID and EGID) are local cache of the + * euid and egid of the user running the OSAL application. They + * assist the "stat" implementation in determination of permissions. + * + * For an OS that does not have multiple users, these could be + * defined as 0. Otherwise they should be populated via the system + * geteuid/getegid calls. + */ +uid_t OS_IMPL_SELF_EUID = 0; +gid_t OS_IMPL_SELF_EGID = 0; + +/* + * Flag(s) to set on file handles for regular files + */ +const int OS_IMPL_REGULAR_FILE_FLAGS = 0; + +/**************************************************************************************** + IMPLEMENTATION-SPECIFIC ROUTINES + These are specific to this particular operating system + ****************************************************************************************/ + +/* -------------------------------------------------------------------------------------- + Name: OS_Posix_StreamAPI_Impl_Init + + Purpose: File/Stream subsystem global initialization + + Returns: OS_SUCCESS if success + ---------------------------------------------------------------------------------------*/ +int32 OS_Posix_StreamAPI_Impl_Init(void) +{ + osal_index_t local_id; + + /* + * init all filehandles to -1, which is always invalid. + * this isn't strictly necessary but helps when debugging. + */ + for (local_id = 0; local_id < OS_MAX_NUM_OPEN_FILES; ++local_id) + { + OS_impl_filehandle_table[local_id].fd = -1; + } + + OS_IMPL_SELF_EUID = geteuid(); + OS_IMPL_SELF_EGID = getegid(); + + return OS_SUCCESS; +} diff --git a/src/os/vxworks-rtp/src/os-impl-filesys.c b/src/os/vxworks-rtp/src/os-impl-filesys.c new file mode 100644 index 000000000..1783352ac --- /dev/null +++ b/src/os/vxworks-rtp/src/os-impl-filesys.c @@ -0,0 +1,326 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup posix + * \author joseph.p.hickey@nasa.gov + * + */ + +/**************************************************************************************** + INCLUDE FILES + ***************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "os-posix.h" +#include "os-shared-filesys.h" +#include "os-shared-idmap.h" +#include "os-shared-common.h" + +/**************************************************************************************** + DEFINES + ***************************************************************************************/ + +/**************************************************************************************** + GLOBAL DATA + ***************************************************************************************/ +const char OS_POSIX_DEVICEFILE_PREFIX[] = "/dev/"; + +/**************************************************************************************** + Filesys API + ***************************************************************************************/ + +/* -------------------------------------------------------------------------------------- + Name: OS_Posix_FileSysAPI_Impl_Init + + Purpose: Filesystem API global initialization + + Returns: OS_SUCCESS if success + ---------------------------------------------------------------------------------------*/ +int32 OS_Posix_FileSysAPI_Impl_Init(void) +{ + return OS_SUCCESS; +} + +/* + * System Level API + */ + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysStartVolume_Impl(const OS_object_token_t *token) +{ + OS_filesys_internal_record_t *local; + struct stat stat_buf; + const char * tmpdir; + size_t mplen; + size_t vollen; + uint32 i; + enum + { + VOLATILE_DISK_LOC_ENV, + VOLATILE_DISK_LOC_TMP, + VOLATILE_DISK_LOC_MAX + }; + + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + + /* + * Determine basic type of filesystem, if not already known + */ + if (local->fstype == OS_FILESYS_TYPE_UNKNOWN && + strncmp(local->device_name, OS_POSIX_DEVICEFILE_PREFIX, sizeof(OS_POSIX_DEVICEFILE_PREFIX) - 1) == 0) + { + /* + * If referring to a real device in the /dev filesystem, + * then assume it is a normal disk. + */ + local->fstype = OS_FILESYS_TYPE_NORMAL_DISK; + } + + /* + * For VOLATILE volumes, there are two options: + * - Using the RAMDISK environment variable, if it exists + * - The /tmp filesystem + * + * The RAMDISK path is preferable because it should point to a ramdisk. + * The /tmp file system might be a regular persistent disk, but should always exist + * on any POSIX-compliant OS. + */ + + tmpdir = NULL; + if (local->fstype == OS_FILESYS_TYPE_VOLATILE_DISK) + { + /* find a suitable location to keep the volatile disk */ + for (i = 0; i <= VOLATILE_DISK_LOC_MAX; ++i) + { + switch (i) + { + case VOLATILE_DISK_LOC_ENV: + /* try the TMPDIR environment variable, if set */ + tmpdir = getenv("RAMDISK"); + break; + case VOLATILE_DISK_LOC_TMP: + /* use /tmp directory as a last resort */ + tmpdir = "/tmp"; + break; + default: + tmpdir = NULL; + break; + } + + if (tmpdir != NULL && stat(tmpdir, &stat_buf) == 0) + { + /* check if the user has write permission to the directory */ + if ((stat_buf.st_mode & S_IWOTH) != 0 || + ((stat_buf.st_mode & S_IWGRP) != 0 && stat_buf.st_gid == getegid()) || + ((stat_buf.st_mode & S_IWUSR) != 0 && stat_buf.st_uid == geteuid())) + { + break; + } + } + } + + if (tmpdir == NULL) + { + /* OS provides no place to put the volume */ + OS_DEBUG("No storage location for volatile volumes"); + return OS_FS_ERR_DRIVE_NOT_CREATED; + } + + /* + * Note - performing the concatenation in a single snprintf() call seems + * to trigger a (false) pointer overlap warning, because volume_name should + * always be null terminated. To get around this, calculate the + * string size and check that it is within the expected size, and do the + * append of volume_name explicitly. + */ + mplen = snprintf(local->system_mountpt, sizeof(local->system_mountpt), "%s/osal:", tmpdir); + if (mplen < sizeof(local->system_mountpt)) + { + vollen = OS_strnlen(local->volume_name, sizeof(local->volume_name)); + if ((vollen + mplen) >= sizeof(local->system_mountpt)) + { + vollen = sizeof(local->system_mountpt) - mplen - 1; + } + memcpy(&local->system_mountpt[mplen], local->volume_name, vollen); + local->system_mountpt[mplen + vollen] = 0; + } + } + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysStopVolume_Impl(const OS_object_token_t *token) +{ + /* + * This is a no-op. + * + * Volatile volumes are just directories created in the temp dir, + * and this will not remove the directories just in case something + * went wrong. + * + * If the volume is started again, the directory will be re-used. + */ + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysFormatVolume_Impl(const OS_object_token_t *token) +{ + /* + * In theory, this should wipe any existing files in the ramdisk, + * but since ramdisks here are implemented using a directory within a tmpfs, + * removal of such files could be risky if something goes wrong, + * because it might remove files that were important. + * + * So the safest option is just a no-op. + * (this is also backward compatible since POSIX mkfs was always a no-op) + */ + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysMountVolume_Impl(const OS_object_token_t *token) +{ + OS_filesys_internal_record_t *local; + struct stat stat_buf; + + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + /* + * This will do a mkdir() for the mount point if it does + * not already exist. + */ + if (stat(local->system_mountpt, &stat_buf) != 0) + { + if (mkdir(local->system_mountpt, 0700) < 0) + { + return OS_FS_ERR_DRIVE_NOT_CREATED; + } + } + else if (!S_ISDIR(stat_buf.st_mode)) + { + return OS_FS_ERR_DRIVE_NOT_CREATED; + } + + /* + * NOTE: The mount() system call could be used here to actually + * mount a disk, if warranted. For all current POSIX-based PSPs, + * this is not needed, because the volumes are all pre-mounted + * through the system init before OSAL starts. + * + * For volatile filesystems (ramdisk) these were created within + * a temp filesystem, so all that is needed is to ensure the + * mount point exists. For any other FS type, trigger an + * error to indicate that it is not implemented in this OSAL. + */ + if (local->fstype != OS_FILESYS_TYPE_VOLATILE_DISK && local->fstype != OS_FILESYS_TYPE_FS_BASED) + { + /* the mount command is not implemented for this FS type */ + return OS_ERR_NOT_IMPLEMENTED; + } + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysUnmountVolume_Impl(const OS_object_token_t *token) +{ + /* + * NOTE: Mounting/Unmounting on POSIX is not implemented. + * For backward compatibility this call must return success. + * + * This is a no-op. The mount point that was created during + * the mount process can stay for the next mount. + */ + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysStatVolume_Impl(const OS_object_token_t *token, OS_statvfs_t *result) +{ + OS_filesys_internal_record_t *local; + + struct statfs stat_buf = {0}; + local = OS_OBJECT_TABLE_GET(OS_filesys_table, *token); + + if (statfs(local->system_mountpt, &stat_buf) != 0) + { + memset(result, 0, sizeof(*result)); + OS_printf("statfs/statfvs returned error, errno %d\n",errno); + return OS_ERROR; + } + + result->block_size = OSAL_SIZE_C(stat_buf.f_bsize); + result->blocks_free = OSAL_BLOCKCOUNT_C(stat_buf.f_bfree); + result->total_blocks = OSAL_BLOCKCOUNT_C(stat_buf.f_blocks); + + return OS_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Purpose: Implemented per internal OSAL API + * See prototype for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 OS_FileSysCheckVolume_Impl(const OS_object_token_t *token, bool repair) +{ + return OS_ERR_NOT_IMPLEMENTED; +} diff --git a/src/os/vxworks/CMakeLists.txt b/src/os/vxworks/CMakeLists.txt index 5bcc7f4d3..4a5e088da 100644 --- a/src/os/vxworks/CMakeLists.txt +++ b/src/os/vxworks/CMakeLists.txt @@ -28,12 +28,15 @@ set(VXWORKS_BASE_SRCLIST # Use portable blocks for basic I/O set(VXWORKS_IMPL_SRCLIST ../portable/os-impl-posix-gettime.c + ../portable/os-impl-posix-gettime-no-monotonic.c ../portable/os-impl-console-bsp.c ../portable/os-impl-bsd-select.c ../portable/os-impl-posix-io.c ../portable/os-impl-posix-files.c ../portable/os-impl-posix-dirs.c ../portable/os-impl-no-condvar.c + ../portable/os-impl-no-rwlock.c + ../portable/os-impl-no-file-allocate.c ) if (OSAL_CONFIG_INCLUDE_SHELL) @@ -65,6 +68,7 @@ if (OSAL_CONFIG_INCLUDE_NETWORK) list(APPEND VXWORKS_IMPL_SRCLIST src/os-impl-network.c ../portable/os-impl-bsd-sockets.c # Use BSD socket layer implementation + ../portable/os-impl-bsd-sockets-no-dns.c # Use functions that do not require DNS src/os-impl-sockets.c # Additional vxworks-specific code to handle socket flags ) else() diff --git a/src/os/vxworks/inc/os-impl-gettime.h b/src/os/vxworks/inc/os-impl-gettime.h index 7f245a79e..3e2a5b53a 100644 --- a/src/os/vxworks/inc/os-impl-gettime.h +++ b/src/os/vxworks/inc/os-impl-gettime.h @@ -35,6 +35,6 @@ * This is the POSIX clock ID that will be used to implement * OS_GetLocalTime() and OS_SetLocalTime(). */ -#define OSAL_GETTIME_SOURCE_CLOCK CLOCK_REALTIME +#define OSAL_GETTIME_LOCAL_CLOCK CLOCK_REALTIME #endif /* OS_IMPL_GETTIME_H */ diff --git a/src/os/vxworks/src/os-impl-symtab.c b/src/os/vxworks/src/os-impl-symtab.c index a3699f6ca..cd9446036 100644 --- a/src/os/vxworks/src/os-impl-symtab.c +++ b/src/os/vxworks/src/os-impl-symtab.c @@ -174,7 +174,6 @@ BOOL OS_SymTableIterator_Impl(char *name, SYM_VALUE val, SYM_TYPE type, _Vx_usr_ { symRecord.SymbolName[sizeof(symRecord.SymbolName) - 2] = '*'; OS_DEBUG("%s(): symbol name too long\n", __func__); - state->StatusCode = OS_ERR_NAME_TOO_LONG; } /* diff --git a/src/os/vxworks/src/os-impl-tasks.c b/src/os/vxworks/src/os-impl-tasks.c index 9e5eef498..fb9054e2e 100644 --- a/src/os/vxworks/src/os-impl-tasks.c +++ b/src/os/vxworks/src/os-impl-tasks.c @@ -296,7 +296,7 @@ int32 OS_TaskDetach_Impl(const OS_object_token_t *token) * See prototype for argument/return detail * *-----------------------------------------------------------------*/ -void OS_TaskExit_Impl() +void OS_TaskExit_Impl(void) { taskExit(0); } diff --git a/src/tests/file-api-test/file-api-test.c b/src/tests/file-api-test/file-api-test.c index ca632af0e..6d65294ff 100644 --- a/src/tests/file-api-test/file-api-test.c +++ b/src/tests/file-api-test/file-api-test.c @@ -39,6 +39,8 @@ void TestRename(void); void TestStat(void); void TestOpenFileAPI(void); void TestUnmountRemount(void); +void TestTruncate(void); +void TestAllocate(void); os_err_name_t errname; @@ -83,6 +85,8 @@ void UtTest_Setup(void) UtTest_Add(TestOpenReadCloseDir, NULL, NULL, "TestOpenReadCloseDir"); UtTest_Add(TestStat, NULL, NULL, "TestStat"); UtTest_Add(TestOpenFileAPI, NULL, NULL, "TestOpenFileAPI"); + UtTest_Add(TestTruncate, NULL, NULL, "TestTruncate"); + UtTest_Add(TestAllocate, NULL, NULL, "TestAllocate"); UtTest_Add(TestUnmountRemount, NULL, NULL, "TestUnmountRemount"); UtTest_Add(TestRename, NULL, NULL, "TestRename"); } @@ -968,3 +972,76 @@ void TestOpenFileAPI(void) status = OS_remove(filename3); UtAssert_True(status == OS_SUCCESS, "status after remove filename3 = %d", (int)status); } + +/*--------------------------------------------------------------------------------------- + * Name: TestTruncate +---------------------------------------------------------------------------------------*/ +void TestTruncate(void) +{ + char filename1[OS_MAX_PATH_LEN]; + int32 status; + osal_id_t fd; + os_fstat_t StatBuff; + + strcpy(filename1, "/drive0/fntrunc"); + + UtAssert_INT32_EQ(OS_OpenCreate(&fd, filename1, OS_FILE_FLAG_CREATE | OS_FILE_FLAG_TRUNCATE, OS_READ_WRITE), + OS_SUCCESS); + + /* Checking if FileTruncate is available */ + status = OS_FileTruncate(fd, 0); + if (status != OS_ERR_NOT_IMPLEMENTED && status != OS_ERR_OPERATION_NOT_SUPPORTED) + { + UtAssert_INT32_EQ(OS_FileTruncate(fd, 32), OS_SUCCESS); + UtAssert_INT32_EQ(OS_stat(filename1, &StatBuff), OS_SUCCESS); + UtAssert_EQ(size_t, StatBuff.FileSize, 32); + + /* FileTruncate this should not have changed the file position */ + UtAssert_INT32_EQ(OS_write(fd, "x", 1), 1); + UtAssert_INT32_EQ(OS_stat(filename1, &StatBuff), OS_SUCCESS); + UtAssert_EQ(size_t, StatBuff.FileSize, 32); + + UtAssert_INT32_EQ(OS_FileTruncate(fd, 0), OS_SUCCESS); + UtAssert_INT32_EQ(OS_stat(filename1, &StatBuff), OS_SUCCESS); + UtAssert_EQ(size_t, StatBuff.FileSize, 0); + } + + UtAssert_INT32_EQ(OS_close(fd), OS_SUCCESS); + UtAssert_INT32_EQ(OS_remove(filename1), OS_SUCCESS); +} + +/*--------------------------------------------------------------------------------------- + * Name: TestAllocate +---------------------------------------------------------------------------------------*/ +void TestAllocate(void) +{ + char filename1[OS_MAX_PATH_LEN]; + int status; + osal_id_t fd; + os_fstat_t StatBuff; + + strcpy(filename1, "/drive0/fntrunc"); + + UtAssert_INT32_EQ(OS_OpenCreate(&fd, filename1, OS_FILE_FLAG_CREATE | OS_FILE_FLAG_TRUNCATE, OS_READ_WRITE), + OS_SUCCESS); + + status = OS_FileAllocate(fd, 0, 0); + if (status != OS_ERR_NOT_IMPLEMENTED && status != OS_ERR_OPERATION_NOT_SUPPORTED) + { + UtAssert_INT32_EQ(OS_FileAllocate(fd, 0, 32), OS_SUCCESS); + UtAssert_INT32_EQ(OS_stat(filename1, &StatBuff), OS_SUCCESS); + UtAssert_EQ(size_t, StatBuff.FileSize, 32); + + /* FileTruncate this should not have changed the file position */ + UtAssert_INT32_EQ(OS_write(fd, "x", 1), 1); + UtAssert_INT32_EQ(OS_stat(filename1, &StatBuff), OS_SUCCESS); + UtAssert_EQ(size_t, StatBuff.FileSize, 32); + + UtAssert_INT32_EQ(OS_FileAllocate(fd, 32, 32), OS_SUCCESS); + UtAssert_INT32_EQ(OS_stat(filename1, &StatBuff), OS_SUCCESS); + UtAssert_EQ(size_t, StatBuff.FileSize, 64); + } + + UtAssert_INT32_EQ(OS_close(fd), OS_SUCCESS); + UtAssert_INT32_EQ(OS_remove(filename1), OS_SUCCESS); +} diff --git a/src/tests/network-api-test/network-api-test.c b/src/tests/network-api-test/network-api-test.c index 7a4e231be..1800dbab5 100644 --- a/src/tests/network-api-test/network-api-test.c +++ b/src/tests/network-api-test/network-api-test.c @@ -54,6 +54,7 @@ enum UT_STREAM_CONNECTION_READ_SHUTDOWN, /* Third pass confirms that read shutdown works correctly */ UT_STREAM_CONNECTION_WRITE_SHUTDOWN, /* Fourth pass confirms that write shutdown works correctly */ UT_STREAM_CONNECTION_RDWR_SHUTDOWN, /* Fifth pass confirms that read/write shutdown works correctly */ + UT_STREAM_CONNECTION_DSCP_QOS, /* This pass confirms that the DSCP field can be set */ UT_STREAM_CONNECTION_MAX }; @@ -110,7 +111,9 @@ void TestNetworkApiBadArgs(void) /* OS_SocketAddrFromString */ UtAssert_INT32_EQ(OS_SocketAddrFromString(NULL, "127.0.0.1"), OS_INVALID_POINTER); UtAssert_INT32_EQ(OS_SocketAddrFromString(&addr, NULL), OS_INVALID_POINTER); - UtAssert_INT32_EQ(OS_SocketAddrFromString(&addr, "invalid"), OS_ERROR); + /* Note that if DNS is enabled, there is no guarantee of what the return value + * of this API call will be. It could be OS_ERROR, OS_ERR_EMPTY_SET, or even OS_SUCCESS */ + UtAssert_VOIDCALL(OS_SocketAddrFromString(&addr, "invalid")); /* OS_SocketAddrToString */ UtAssert_INT32_EQ(OS_SocketAddrToString(addr_string, 0, &addr), OS_ERR_INVALID_SIZE); @@ -334,9 +337,18 @@ void TestDatagramNetworkApi(void) /* Get socket info and verify */ UtAssert_INT32_EQ(OS_SocketGetInfo(p1_socket_id, &prop), OS_SUCCESS); UtAssert_True(!OS_ObjectIdDefined(prop.creator), "prop.creator (%lu) == 0", OS_ObjectIdToInteger(prop.creator)); - UtAssert_True(strcmp(prop.name, "127.0.0.1:9999") == 0, "prop.name (%s) == 127.0.0.1:9999", prop.name); - UtAssert_INT32_EQ(OS_SocketGetIdByName(&objid, "127.0.0.1:9999"), OS_SUCCESS); + /* Depending on whether the target is using the DNS version, it may resolve to "localhost" */ + if (strncmp(prop.name, "127", 3) == 0) + { + UtAssert_STRINGBUF_EQ(prop.name, sizeof(prop.name), "127.0.0.1:9999", -1); + } + else + { + UtAssert_STRINGBUF_EQ(prop.name, sizeof(prop.name), "localhost:9999", -1); + } + + UtAssert_INT32_EQ(OS_SocketGetIdByName(&objid, prop.name), OS_SUCCESS); UtAssert_True(OS_ObjectIdEqual(objid, p1_socket_id), "objid (%lu) == p1_socket_id", OS_ObjectIdToInteger(objid)); } @@ -453,18 +465,19 @@ void Server_Fn(void) *****************************************************************************/ void TestStreamNetworkApi(void) { - int32 status; - int32 expected; - int32 actual; - uint32 iter; - uint32 loopcnt; - osal_id_t temp_id; - osal_id_t invalid_fd; - OS_SockAddr_t temp_addr; - OS_task_prop_t taskprop; - char Buf_rcv_c[4] = {0}; - char Buf_send_c[4] = {0}; - uint8 Buf_each_char_rcv[256] = {0}; + int32 status; + int32 expected; + int32 actual; + uint32 iter; + uint32 loopcnt; + osal_id_t temp_id; + osal_id_t invalid_fd; + OS_SockAddr_t temp_addr; + OS_task_prop_t taskprop; + OS_socket_optval_t optval = {0}; + char Buf_rcv_c[4] = {0}; + char Buf_send_c[4] = {0}; + uint8 Buf_each_char_rcv[256] = {0}; /* * NOTE: The server cannot directly use UtAssert because the library is not thread-safe @@ -618,6 +631,20 @@ void TestStreamNetworkApi(void) UtAssert_INT32_EQ(OS_SocketConnect(regular_file_id, &s_addr, UT_TIMEOUT), OS_ERR_INCORRECT_OBJ_TYPE); UtAssert_INT32_EQ(OS_SocketConnect(c_socket_id, NULL, UT_TIMEOUT), OS_INVALID_POINTER); UtAssert_INT32_EQ(OS_SocketConnect(c_socket_id, &s_addr, 0), OS_ERR_INCORRECT_OBJ_STATE); + + /* OS_SocketGet/SetOption */ + UtAssert_INT32_EQ(OS_SocketGetOption(invalid_fd, OS_socket_option_UNDEFINED, &optval), + OS_ERR_INVALID_ID); + UtAssert_INT32_EQ(OS_SocketSetOption(invalid_fd, OS_socket_option_UNDEFINED, &optval), + OS_ERR_INVALID_ID); + UtAssert_INT32_EQ(OS_SocketGetOption(c_socket_id, OS_socket_option_MAX, &optval), + OS_ERR_INVALID_ARGUMENT); + UtAssert_INT32_EQ(OS_SocketSetOption(c_socket_id, OS_socket_option_MAX, &optval), + OS_ERR_INVALID_ARGUMENT); + UtAssert_INT32_EQ(OS_SocketGetOption(c_socket_id, OS_socket_option_UNDEFINED, NULL), + OS_INVALID_POINTER); + UtAssert_INT32_EQ(OS_SocketSetOption(c_socket_id, OS_socket_option_UNDEFINED, NULL), + OS_INVALID_POINTER); } /* @@ -626,6 +653,16 @@ void TestStreamNetworkApi(void) */ snprintf(Buf_send_c, sizeof(Buf_send_c), "%03x", (unsigned int)((iter + 0xabc) & 0xfff)); + if (iter == UT_STREAM_CONNECTION_DSCP_QOS) + { + optval.IntVal = 0x04; + UtAssert_INT32_EQ(OS_SocketSetOption(c_socket_id, OS_socket_option_IP_DSCP, &optval), OS_SUCCESS); + + optval.IntVal = 0xFF; + UtAssert_INT32_EQ(OS_SocketGetOption(c_socket_id, OS_socket_option_IP_DSCP, &optval), OS_SUCCESS); + UtAssert_INT32_EQ(optval.IntVal, 0x04); + } + /* * On designated iterations, use "shutdown" to indicate this is the end of the read data */ diff --git a/src/tests/osal-core-test/osal-core-test.c b/src/tests/osal-core-test/osal-core-test.c index 8b777ed69..bc792ac7b 100644 --- a/src/tests/osal-core-test/osal-core-test.c +++ b/src/tests/osal-core-test/osal-core-test.c @@ -148,6 +148,9 @@ void task_test_stackptr_0(void) typedef struct { osal_id_t task_id; + + uint32 Padding; + uint64 Placholder; /* Used to align task_stack */ uint8 task_stack[TASK_0_STACK_SIZE]; } TestTaskData; diff --git a/src/tests/rwlock-test/rwlock-test.c b/src/tests/rwlock-test/rwlock-test.c new file mode 100644 index 000000000..c03f3936f --- /dev/null +++ b/src/tests/rwlock-test/rwlock-test.c @@ -0,0 +1,398 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/* +** RwLock read timeout test +*/ +#include + +#include "common_types.h" +#include "osapi.h" +#include "utassert.h" +#include "uttest.h" +#include "utbsp.h" + +#define STACK_SIZE 4096 + +/* Define setup and check functions for UT assert */ +void RwLockSetup(void); +void RwLockCheck(void); + +uint32 orchestrator_stack[STACK_SIZE]; +osal_id_t orchestrator_id; +uint32 orchestrator_failures; + +uint32 reader_1_stack[STACK_SIZE]; +osal_id_t reader_1_id; +uint32 reader_1_failures; + +uint32 reader_2_stack[STACK_SIZE]; +osal_id_t reader_2_id; +uint32 reader_2_failures; + +osal_id_t rw_id; + +bool reader_1_ready; +bool reader_2_ready; + +bool should_run; +bool start_count; + +uint32 counter; + +void orchestrator(void) +{ + int i; + uint32 status; + + OS_printf("Starting ORCHESTRATOR...\n"); + + while (should_run) + { + /* First, acquire the write lock and reset flags */ + start_count = false; + reader_1_ready = false; + reader_2_ready = false; + + /* Wait for other tasks to try to acquire the read lock */ + status = OS_TaskDelay(500); + if (reader_1_ready == true || reader_2_ready == true) + { + ++orchestrator_failures; + OS_printf("ORCHESTRATOR:Error while holding write lock, readers read during rwlock write phase\n"); + } + else + { + OS_printf("Single-writer only check passed!\n"); + } + + /* Release the write lock to allow readers to take the read lock */ + status = OS_RwLockWriteGive(rw_id); + if (status != OS_SUCCESS) + { + ++orchestrator_failures; + OS_printf("ORCHESTRATOR:Error calling OS_RwLockWriteGive\n"); + } + + /* Wait for readers to set their ready flags, once they've acquire the read lock */ + status = OS_TaskDelay(500); + if (reader_1_ready != true || reader_2_ready != true) + { + ++orchestrator_failures; + OS_printf("ORCHESTRATOR:Error, readers unable to simultaneously read\n"); + } + else + { + OS_printf("Multiple-reader check passed!\n"); + } + + /* Reset reader flags and signal that they should release their read locks and start counting */ + reader_1_ready = false; + reader_2_ready = false; + start_count = true; + + /* Increment the counter by 100 */ + for (i = 0; i < 100; ++i) + { + status = OS_RwLockWriteTake(rw_id); + if (status != OS_SUCCESS) + { + OS_printf("ORCHESTRATOR:Error unable to take write lock\n"); + ++orchestrator_failures; + } + + ++counter; + status = OS_RwLockWriteGive(rw_id); + if (status != OS_SUCCESS) + { + OS_printf("ORCHESTRATOR:Error unable to give write lock\n"); + ++orchestrator_failures; + } + } + + /* Wait for the readers to finish counting 100 as well */ + while (reader_1_ready != true || reader_2_ready != true) + { + OS_TaskDelay(5); + if (should_run == false) + { + return; + } + } + + /* If the counter wasn't incremented correctly due to a data race, report the failure */ + if (counter % 300 != 0) + { + OS_printf("ORCHESTRATOR:Error counter did not match expected value: %d\n", counter); + ++orchestrator_failures; + } + else + { + OS_printf("One parallel unit of work completed!\n"); + } + + if (counter >= 1500) + { + return; + } + + /* Time limited execution */ + status = OS_RwLockWriteTake(rw_id); + if (status != OS_SUCCESS) + { + ++orchestrator_failures; + OS_printf("ORCHESTRATOR:Error calling OS_RwLockWriteTake\n"); + } + } +} + +void reader_1(void) +{ + int i; + uint32 status; + + OS_printf("Starting READER 1..."); + + while (should_run) + { + /* Taking the read lock will take a while as the orchestrator will hold onto the write lock */ + status = OS_RwLockReadTake(rw_id); + if (status != OS_SUCCESS) + { + ++reader_1_failures; + OS_printf("READER 1:Error calling OS_RwLockReadTake"); + } + + /* Once the read lock is acquired, set the read flag to show the reader read it */ + reader_1_ready = true; + + /* Wait for the command to start counting */ + while (start_count != true) + { + OS_TaskDelay(5); + if (should_run == false) + { + return; + } + } + + /* Once the command has been received return the read lock */ + status = OS_RwLockReadGive(rw_id); + if (status != OS_SUCCESS) + { + ++reader_1_failures; + OS_printf("READER 1:Error calling OS_RwLockReadGive"); + } + + /* Increment the counter by 100 */ + for (i = 0; i < 100; ++i) + { + status = OS_RwLockWriteTake(rw_id); + if (status != OS_SUCCESS) + { + OS_printf("READER 1:Error unable to take write lock\n"); + ++reader_1_failures; + } + + ++counter; + status = OS_RwLockWriteGive(rw_id); + if (status != OS_SUCCESS) + { + OS_printf("READER 1:Error unable to give write lock\n"); + ++reader_1_failures; + } + } + + /* Signal that the reader is ready to repeat the test */ + reader_1_ready = true; + while (reader_1_ready == true) + { + OS_TaskDelay(5); + if (should_run == false) + { + return; + } + } + } +} + +void reader_2(void) +{ + int i; + uint32 status; + + OS_printf("Starting READER 2..."); + + while (should_run) + { + /* Taking the read lock will take a while as the orchestrator will hold onto the write lock */ + status = OS_RwLockReadTake(rw_id); + if (status != OS_SUCCESS) + { + ++reader_2_failures; + OS_printf("READER 2:Error calling OS_RwLockReadTake"); + } + + /* Once the read lock is acquired, set the read flag to show the reader read it */ + reader_2_ready = true; + + /* Wait for the command to start counting */ + while (start_count != true) + { + OS_TaskDelay(5); + if (should_run == false) + { + return; + } + } + + /* Once the command has been received return the read lock */ + status = OS_RwLockReadGive(rw_id); + if (status != OS_SUCCESS) + { + ++reader_2_failures; + OS_printf("READER 2:Error calling OS_RwLockReadGive"); + } + + /* Increment the counter by 100 */ + for (i = 0; i < 100; ++i) + { + status = OS_RwLockWriteTake(rw_id); + if (status != OS_SUCCESS) + { + OS_printf("READER 2:Error unable to take write lock\n"); + ++reader_2_failures; + } + + ++counter; + status = OS_RwLockWriteGive(rw_id); + if (status != OS_SUCCESS) + { + OS_printf("READER 2:Error unable to give write lock\n"); + ++reader_2_failures; + } + } + + /* Signal that the reader is ready to repeat the test */ + reader_2_ready = true; + while (reader_2_ready == true) + { + OS_TaskDelay(5); + if (should_run == false) + { + return; + } + } + } +} + +bool RwLockTest_CheckImpl(void) +{ + int32 status; + osal_id_t rwid; + + status = OS_RwLockCreate(&rwid, "ut", 0); + if (status == OS_SUCCESS) + { + OS_RwLockDelete(rwid); + } + + return (status != OS_ERR_NOT_IMPLEMENTED); +} + +void UtTest_Setup(void) +{ + if (OS_API_Init() != OS_SUCCESS) + { + UtAssert_Abort("OS_API_Init() failed"); + } + + /* the test should call OS_API_Teardown() before exiting */ + UtTest_AddTeardown(OS_API_Teardown, "Cleanup"); + + /* + * Register the test setup and check routines in UT assert + */ + if (RwLockTest_CheckImpl()) + { + UtTest_Add(RwLockCheck, RwLockSetup, NULL, "RwLockTest"); + } + else + { + UtAssert_MIR("Readers-writer locks not implemented; skipping tests"); + } +} + +void RwLockSetup(void) +{ + uint32 status; + + orchestrator_failures = 0; + reader_1_failures = 0; + reader_2_failures = 0; + counter = 0; + reader_1_ready = false; + reader_2_ready = false; + start_count = false; + should_run = true; + + /* Create the RwLock */ + status = OS_RwLockCreate(&rw_id, "rwlock", 0); + UtAssert_True(status == OS_SUCCESS, "RwLock ID=%lx, status=%d\n", OS_ObjectIdToInteger(rw_id), (int)status); + + /* Test for RwLock read nesting */ + status = OS_RwLockReadTake(rw_id); + UtAssert_True(status == OS_SUCCESS, "OS_RwLockReadTake 1, status=%d\n", (int)status); + + status = OS_RwLockReadTake(rw_id); + UtAssert_True(status == OS_SUCCESS, "OS_RwLockReadTake 2, status=%d\n", (int)status); + + status = OS_RwLockReadGive(rw_id); + UtAssert_True(status == OS_SUCCESS, "OS_RwLockReadGive 2, status=%d\n", (int)status); + + status = OS_RwLockReadGive(rw_id); + UtAssert_True(status == OS_SUCCESS, "OS_RwLockReadGive 1, status=%d\n", (int)status); + + /* Ensure the orchestrator has the write lock before the test begins. */ + status = OS_RwLockWriteTake(rw_id); + UtAssert_True(status == OS_SUCCESS, "OS_RwLockWriteTake, status=%d\n", (int)status); + + /* Create the tasks */ + status = OS_TaskCreate(&reader_1_id, "Reader 1", reader_1, OSAL_STACKPTR_C(reader_1_stack), sizeof(reader_1_stack), + OSAL_PRIORITY_C(100), 0); + UtAssert_True(status == OS_SUCCESS, "Reader ID=%lx, status=%d", OS_ObjectIdToInteger(reader_1_id), (int)status); + + status = OS_TaskCreate(&reader_2_id, "Reader 2", reader_2, OSAL_STACKPTR_C(reader_2_stack), sizeof(reader_2_stack), + OSAL_PRIORITY_C(100), 0); + UtAssert_True(status == OS_SUCCESS, "Reader ID=%lx, status=%d", OS_ObjectIdToInteger(reader_2_id), (int)status); + + orchestrator(); + + /* Delete the tasks */ + should_run = false; + OS_TaskDelete(reader_1_id); + OS_TaskDelete(reader_2_id); +} + +void RwLockCheck(void) +{ + /* None of the tasks should have any failures in their own counters */ + UtAssert_True(orchestrator_failures == 0, "Orchestrator failures = %u", (unsigned int)orchestrator_failures); + UtAssert_True(reader_1_failures == 0, "Reader 1 failures = %u", (unsigned int)reader_1_failures); + UtAssert_True(reader_2_failures == 0, "Reader 2 failures = %u", (unsigned int)reader_2_failures); +} diff --git a/src/tests/symbol-api-test/symbol-api-test.c b/src/tests/symbol-api-test/symbol-api-test.c index 78de352a2..2c29b8cce 100644 --- a/src/tests/symbol-api-test/symbol-api-test.c +++ b/src/tests/symbol-api-test/symbol-api-test.c @@ -32,78 +32,56 @@ void TestSymbolApi(void) { int32 status; cpuaddr SymAddress = 0; + uint32 size; + char fileName[128]; /* Make the file system */ - status = OS_mkfs(0, "/ramdev0", "RAM", 512, 2048); + status = OS_mkfs(0, "/ramdev1", "RAM", 512, 10240); UtAssert_True(status == OS_SUCCESS, "status after mkfs = %d", (int)status); - status = OS_mount("/ramdev0", "/ram"); + status = OS_mount("/ramdev1", "/ram"); UtAssert_True(status == OS_SUCCESS, "status after mount = %d", (int)status); /* - ** dump the symbol table with a 32768 byte limit + ** dump the symbol table with a small limit to cause it to fail */ - UtPrintf("Dumping symbol table with a limit of 32768 bytes\n"); - status = OS_SymbolTableDump("/ram/SymbolTable32k.dat", 32768); - if (status == OS_ERR_NOT_IMPLEMENTED) - { - UtAssert_NA("OS_SymbolTableDump API not implemented"); - } - else if (status == OS_ERR_OUTPUT_TOO_LARGE) - { - UtAssert_MIR("32k too small for OS_SymbolTableDump"); - } - else if (status == OS_ERR_NAME_TOO_LONG) - { - UtAssert_MIR("OS_SymbolTableDump name to long, consider increasing OSAL_CONFIG_MAX_SYM_LEN"); - } - else - { - UtAssert_True(status == OS_SUCCESS, "status after 32k OS_SymbolTableDump = %d", (int)status); - } + size = 10; + UtPrintf("Dumping symbol table with a limit of %d bytes\n", size); + snprintf(fileName, sizeof(fileName), "/ram/SymbolTable%d.dat", size); - /* - ** dump the symbol table with a 128k byte limit - */ - UtPrintf("Dumping symbol table with a limit of 131072 bytes\n"); - status = OS_SymbolTableDump("/ram/SymbolTable128k.dat", 131072); + status = OS_SymbolTableDump(fileName, size); if (status == OS_ERR_NOT_IMPLEMENTED) { UtAssert_NA("OS_SymbolTableDump API not implemented"); } - else if (status == OS_ERR_OUTPUT_TOO_LARGE) - { - UtAssert_MIR("128k too small for OS_SymbolTableDump"); - } - else if (status == OS_ERR_NAME_TOO_LONG) - { - UtAssert_MIR("OS_SymbolTableDump name to long, consider increasing OSAL_CONFIG_MAX_SYM_LEN"); - } else { - UtAssert_True(status == OS_SUCCESS, "status after 128k OS_SymbolTableDump = %d", (int)status); + UtAssert_INT32_EQ(status, OS_ERR_OUTPUT_TOO_LARGE); } /* - ** dump the symbol table with a 512k byte limit + ** dump the symbol table with a high limit to pass */ - UtPrintf("Dumping symbol table with a limit of 524288 bytes\n"); - status = OS_SymbolTableDump("/ram/SymbolTable512k.dat", 524288); + size = 1024 * 1024 * 5; + UtPrintf("Dumping symbol table with a limit of %d bytes\n", size); + snprintf(fileName, sizeof(fileName), "/ram/SymbolTable5MiB.dat"); + + status = OS_SymbolTableDump(fileName, size); if (status == OS_ERR_NOT_IMPLEMENTED) { UtAssert_NA("OS_SymbolTableDump API not implemented"); } - else if (status == OS_ERR_OUTPUT_TOO_LARGE) - { - UtAssert_MIR("512k too small for OS_SymbolTableDump"); - } - else if (status == OS_ERR_NAME_TOO_LONG) - { - UtAssert_MIR("OS_SymbolTableDump name to long, consider increasing OSAL_CONFIG_MAX_SYM_LEN"); - } else { - UtAssert_True(status == OS_SUCCESS, "status after 512k OS_SymbolTableDump = %d", (int)status); + UtAssert_INT32_EQ(status, OS_SUCCESS); + if (status == OS_ERR_OUTPUT_TOO_LARGE) + { + UtPrintf("Symbol Table bigger than %d bytes. Consider increasing dump size\n", size); + } + else if (status == OS_ERR_NAME_TOO_LONG) + { + UtPrintf("OS_SymbolTableDump name to long, consider increasing OSAL_CONFIG_MAX_SYM_LEN\n"); + } } /* diff --git a/src/unit-test-coverage/CMakeLists.txt b/src/unit-test-coverage/CMakeLists.txt index 34be9e245..0550a0ac7 100644 --- a/src/unit-test-coverage/CMakeLists.txt +++ b/src/unit-test-coverage/CMakeLists.txt @@ -86,7 +86,7 @@ function (add_coverage_testrunner TESTNAME FSW_SRCFILE TESTCASE_SRCFILE) add_test(${TESTNAME} ${TESTNAME}-testrunner) foreach(TGT ${INSTALL_TARGET_LIST}) - install(TARGETS ${TESTNAME}-testrunner DESTINATION ${TGT}/${UT_INSTALL_SUBDIR}) + install(TARGETS ${TESTNAME}-testrunner DESTINATION ${TGT}) endforeach() endfunction() diff --git a/src/unit-test-coverage/portable/src/coveragetest-bsd-sockets-dns.c b/src/unit-test-coverage/portable/src/coveragetest-bsd-sockets-dns.c new file mode 100644 index 000000000..6d0c067b1 --- /dev/null +++ b/src/unit-test-coverage/portable/src/coveragetest-bsd-sockets-dns.c @@ -0,0 +1,181 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \brief Coverage test for no network implementation + * \ingroup portable + */ + +#include "os-portable-coveragetest.h" +#include "os-shared-sockets.h" +#include "os-shared-idmap.h" +#include "os-shared-file.h" +#include "os-shared-select.h" +#include "os-impl-io.h" + +#include "OCS_sys_socket.h" +#include "OCS_errno.h" +#include "OCS_fcntl.h" +#include "OCS_arpa_inet.h" +#include "OCS_netdb.h" + +#include "ut-adaptor-portable-posix-io.h" + +/* Unique error code for return testing */ +#define UT_ERR_UNIQUE 0xDEADBEEF + +/* Buffer size */ +#define UT_BUFFER_SIZE 16 + +void Test_OS_SocketAddrToString_Impl(void) +{ + char buffer[UT_BUFFER_SIZE]; + OS_SockAddr_t addr = {0}; + struct OCS_sockaddr *sa = (struct OCS_sockaddr *)&addr.AddrData; + + /* Bad family */ + sa->sa_family = -1; + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_ERR_BAD_ADDRESS); + + sa->sa_family = OCS_AF_INET6; + UT_SetDeferredRetcode(UT_KEY(OCS_getnameinfo), 1, OCS_EAI_NONAME); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_ERR_EMPTY_SET); + + sa->sa_family = OCS_AF_INET; + UT_SetDeferredRetcode(UT_KEY(OCS_getnameinfo), 1, OCS_EAI_AGAIN); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_ERR_TRY_AGAIN); + + /* other error */ + UT_SetDeferredRetcode(UT_KEY(OCS_getnameinfo), 1, -1); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_ERROR); + + /* AF_INET6, success */ + sa->sa_family = OCS_AF_INET6; + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_SUCCESS); + + /* AF_INET, success */ + sa->sa_family = OCS_AF_INET; + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_SUCCESS); +} + +void Test_OS_SocketAddrFromString_Impl(void) +{ + const char buffer[UT_BUFFER_SIZE] = "UT"; + OS_SockAddr_t addr = {0}; + struct OCS_sockaddr *sa = (struct OCS_sockaddr *)&addr.AddrData; + struct OCS_addrinfo ai; + struct OCS_addrinfo *aip; + + union + { + struct OCS_sockaddr sa; + struct OCS_sockaddr_in sa_in4; + struct OCS_sockaddr_in6 sa_in6; + } sa_buf; + + /* Bad family */ + sa->sa_family = -1; + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERR_BAD_ADDRESS); + + sa->sa_family = OCS_AF_INET6; + UT_SetDeferredRetcode(UT_KEY(OCS_getaddrinfo), 1, OCS_EAI_NONAME); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERR_EMPTY_SET); + + sa->sa_family = OCS_AF_INET; + UT_SetDeferredRetcode(UT_KEY(OCS_getaddrinfo), 1, OCS_EAI_AGAIN); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERR_TRY_AGAIN); + + /* other error */ + UT_SetDeferredRetcode(UT_KEY(OCS_getaddrinfo), 1, -1); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERROR); + + /* AF_INET6, empty result, but still needs freeing */ + sa->sa_family = OCS_AF_INET6; + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERR_EMPTY_SET); + UtAssert_STUB_COUNT(OCS_freeaddrinfo, 1); + + /* AF_INET, empty result, but still needs freeing */ + sa->sa_family = OCS_AF_INET; + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERR_EMPTY_SET); + UtAssert_STUB_COUNT(OCS_freeaddrinfo, 2); + + /* set up stub for successful return */ + memset(&ai, 0, sizeof(ai)); + memset(&sa_buf, 0, sizeof(sa_buf)); + + sa->sa_family = OCS_AF_INET; + ai.ai_family = sa->sa_family; + ai.ai_addrlen = sizeof(struct OCS_sockaddr_in); + ai.ai_addr = &sa_buf.sa; + + aip = &ai; + UT_SetDataBuffer(UT_KEY(OCS_getaddrinfo), &aip, sizeof(aip), false); + + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_SUCCESS); + UtAssert_STUB_COUNT(OCS_freeaddrinfo, 3); + UtAssert_EQ(size_t, addr.ActualLength, ai.ai_addrlen); + + sa->sa_family = OCS_AF_INET6; + ai.ai_family = sa->sa_family; + ai.ai_addrlen = sizeof(struct OCS_sockaddr_in6); + ai.ai_addr = &sa_buf.sa; + + aip = &ai; + UT_SetDataBuffer(UT_KEY(OCS_getaddrinfo), &aip, sizeof(aip), false); + + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_SUCCESS); + UtAssert_STUB_COUNT(OCS_freeaddrinfo, 4); + UtAssert_EQ(size_t, addr.ActualLength, ai.ai_addrlen); + + /* wrong family */ + ai.ai_family = OCS_AF_INET; + UT_SetDataBuffer(UT_KEY(OCS_getaddrinfo), &aip, sizeof(aip), false); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERR_EMPTY_SET); + UtAssert_STUB_COUNT(OCS_freeaddrinfo, 5); +} + +/* ------------------- End of test cases --------------------------------------*/ + +/* Osapi_Test_Setup + * + * Purpose: + * Called by the unit test tool to set up the app prior to each test + */ +void Osapi_Test_Setup(void) +{ + UT_ResetState(0); +} + +/* + * Osapi_Test_Teardown + * + * Purpose: + * Called by the unit test tool to tear down the app after each test + */ +void Osapi_Test_Teardown(void) {} + +/* UtTest_Setup + * + * Purpose: + * Registers the test cases to execute with the unit test tool + */ +void UtTest_Setup(void) +{ + ADD_TEST(OS_SocketAddrToString_Impl); + ADD_TEST(OS_SocketAddrFromString_Impl); +} diff --git a/src/unit-test-coverage/portable/src/coveragetest-bsd-sockets-no-dns.c b/src/unit-test-coverage/portable/src/coveragetest-bsd-sockets-no-dns.c new file mode 100644 index 000000000..7d5cc094a --- /dev/null +++ b/src/unit-test-coverage/portable/src/coveragetest-bsd-sockets-no-dns.c @@ -0,0 +1,121 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \brief Coverage test for no network implementation + * \ingroup portable + */ + +#include "os-portable-coveragetest.h" +#include "os-shared-sockets.h" +#include "os-shared-idmap.h" +#include "os-shared-file.h" +#include "os-shared-select.h" + +#include "OCS_sys_socket.h" +#include "OCS_errno.h" +#include "OCS_fcntl.h" +#include "OCS_arpa_inet.h" + +#include "ut-adaptor-portable-posix-io.h" + +/* Unique error code for return testing */ +#define UT_ERR_UNIQUE 0xDEADBEEF + +/* Buffer size */ +#define UT_BUFFER_SIZE 16 + +void Test_OS_SocketAddrToString_Impl(void) +{ + char buffer[UT_BUFFER_SIZE]; + OS_SockAddr_t addr = {0}; + struct OCS_sockaddr *sa = (struct OCS_sockaddr *)&addr.AddrData; + + /* Bad family */ + sa->sa_family = -1; + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_ERR_BAD_ADDRESS); + + /* AF_INET6 success */ + sa->sa_family = OCS_AF_INET6; + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_SUCCESS); + + /* AF_INET, success */ + sa->sa_family = OCS_AF_INET; + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_SUCCESS); + + /* AF_INET failed inet_ntop */ + UT_SetDeferredRetcode(UT_KEY(OCS_inet_ntop), 1, -1); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_ERROR); +} + +void Test_OS_SocketAddrFromString_Impl(void) +{ + const char buffer[UT_BUFFER_SIZE] = "UT"; + OS_SockAddr_t addr = {0}; + struct OCS_sockaddr *sa = (struct OCS_sockaddr *)&addr.AddrData; + + /* Bad family */ + sa->sa_family = -1; + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERR_BAD_ADDRESS); + + /* AF_INET6 success */ + sa->sa_family = OCS_AF_INET6; + UT_SetDeferredRetcode(UT_KEY(OCS_inet_pton), 1, 1); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_SUCCESS); + + /* AF_INET, success */ + sa->sa_family = OCS_AF_INET; + UT_SetDeferredRetcode(UT_KEY(OCS_inet_pton), 1, 1); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_SUCCESS); + + /* AF_INET, unable to convert (note inet_pton returns 0 if it failed) */ + sa->sa_family = OCS_AF_INET; + UT_SetDeferredRetcode(UT_KEY(OCS_inet_pton), 1, 0); + OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERROR); +} + +/* ------------------- End of test cases --------------------------------------*/ + +/* Osapi_Test_Setup + * + * Purpose: + * Called by the unit test tool to set up the app prior to each test + */ +void Osapi_Test_Setup(void) +{ + UT_ResetState(0); +} + +/* + * Osapi_Test_Teardown + * + * Purpose: + * Called by the unit test tool to tear down the app after each test + */ +void Osapi_Test_Teardown(void) {} + +/* UtTest_Setup + * + * Purpose: + * Registers the test cases to execute with the unit test tool + */ +void UtTest_Setup(void) +{ + ADD_TEST(OS_SocketAddrToString_Impl); + ADD_TEST(OS_SocketAddrFromString_Impl); +} diff --git a/src/unit-test-coverage/portable/src/coveragetest-bsd-sockets.c b/src/unit-test-coverage/portable/src/coveragetest-bsd-sockets.c index bfa41d1c8..12a1f3d25 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-bsd-sockets.c +++ b/src/unit-test-coverage/portable/src/coveragetest-bsd-sockets.c @@ -358,6 +358,77 @@ void Test_OS_SocketGetInfo_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_SocketGetInfo_Impl, (NULL, NULL), OS_SUCCESS); } +/***************************************************************************** + * + * Test case for OS_SocketGetOption_Impl() + * + *****************************************************************************/ +void Test_OS_SocketGetOption_Impl(void) +{ + /* + * Test Case For: + * int32 OS_SocketGetOption_Impl(const OS_object_token_t *token, OS_socket_option_t opt_id, OS_socket_optval_t + * *optval) + */ + OS_object_token_t token = {0}; + OS_socket_optval_t optval; + + /* Set up token */ + token.obj_idx = UT_INDEX_0; + + memset(&optval, 0, sizeof(optval)); + + /* nominal */ + OSAPI_TEST_FUNCTION_RC(OS_SocketGetOption_Impl, (&token, OS_socket_option_UNDEFINED, &optval), OS_SUCCESS); + UtAssert_STUB_COUNT(OCS_getsockopt, 0); + + OSAPI_TEST_FUNCTION_RC(OS_SocketGetOption_Impl, (&token, OS_socket_option_IP_DSCP, &optval), OS_SUCCESS); + UtAssert_STUB_COUNT(OCS_getsockopt, 1); + + /* error cases */ + OSAPI_TEST_FUNCTION_RC(OS_SocketGetOption_Impl, (&token, OS_socket_option_MAX, &optval), + OS_ERR_OPERATION_NOT_SUPPORTED); + + UT_SetDeferredRetcode(UT_KEY(OCS_getsockopt), 1, -1); + OSAPI_TEST_FUNCTION_RC(OS_SocketGetOption_Impl, (&token, OS_socket_option_IP_DSCP, &optval), OS_ERROR); +} + +/***************************************************************************** + * + * Test case for OS_SocketSetOption_Impl() + * + *****************************************************************************/ +void Test_OS_SocketSetOption_Impl(void) +{ + /* + * Test Case For: + * int32 OS_SocketSetOption_Impl(const OS_object_token_t *token, OS_socket_option_t opt_id, const OS_socket_optval_t + * *optval) + */ + OS_object_token_t token = {0}; + OS_socket_optval_t optval; + + /* Set up token */ + token.obj_idx = UT_INDEX_0; + + memset(&optval, 0, sizeof(optval)); + + /* nominal */ + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption_Impl, (&token, OS_socket_option_UNDEFINED, &optval), OS_SUCCESS); + UtAssert_STUB_COUNT(OCS_setsockopt, 0); + + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption_Impl, (&token, OS_socket_option_IP_DSCP, &optval), OS_SUCCESS); + + /* error cases */ + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption_Impl, (&token, OS_socket_option_MAX, &optval), + OS_ERR_OPERATION_NOT_SUPPORTED); + + UT_SetDeferredRetcode(UT_KEY(OCS_setsockopt), 1, -1); + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption_Impl, (&token, OS_socket_option_IP_DSCP, &optval), OS_ERROR); + UT_SetDeferredRetcode(UT_KEY(OCS_getsockopt), 1, -1); + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption_Impl, (&token, OS_socket_option_IP_DSCP, &optval), OS_ERROR); +} + void Test_OS_SocketAddrInit_Impl(void) { OS_SockAddr_t addr = {0}; @@ -384,51 +455,6 @@ void Test_OS_SocketAddrInit_Impl(void) UtAssert_INT32_EQ(addr.ActualLength, sizeof(struct OCS_sockaddr_in6)); } -void Test_OS_SocketAddrToString_Impl(void) -{ - char buffer[UT_BUFFER_SIZE]; - OS_SockAddr_t addr = {0}; - struct OCS_sockaddr *sa = (struct OCS_sockaddr *)&addr.AddrData; - - /* Bad family */ - sa->sa_family = -1; - OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_ERR_BAD_ADDRESS); - - /* AF_INET6 failed inet_ntop */ - sa->sa_family = OCS_AF_INET6; - UT_SetDeferredRetcode(UT_KEY(OCS_inet_ntop), 1, -1); - OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_ERROR); - - /* AF_INET, success */ - sa->sa_family = OCS_AF_INET; - OSAPI_TEST_FUNCTION_RC(OS_SocketAddrToString_Impl, (buffer, sizeof(buffer), &addr), OS_SUCCESS); -} - -void Test_OS_SocketAddrFromString_Impl(void) -{ - const char buffer[UT_BUFFER_SIZE] = "UT"; - OS_SockAddr_t addr = {0}; - struct OCS_sockaddr *sa = (struct OCS_sockaddr *)&addr.AddrData; - - /* Bad family */ - sa->sa_family = -1; - OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERR_BAD_ADDRESS); - - /* AF_INET6 failed inet_ntop */ - sa->sa_family = OCS_AF_INET6; - UT_SetDeferredRetcode(UT_KEY(OCS_inet_pton), 1, -1); - OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERROR); - - /* AF_INET, unable to convert (note inet_pton returns 0 if it failed) */ - sa->sa_family = OCS_AF_INET; - UT_SetDeferredRetcode(UT_KEY(OCS_inet_pton), 1, 0); - OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_ERROR); - - /* AF_INET, success */ - UT_SetDeferredRetcode(UT_KEY(OCS_inet_pton), 1, 1); - OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (&addr, buffer), OS_SUCCESS); -} - void Test_OS_SocketAddrGetPort_Impl(void) { uint16 port; @@ -506,8 +532,8 @@ void UtTest_Setup(void) ADD_TEST(OS_SocketSendTo_Impl); ADD_TEST(OS_SocketGetInfo_Impl); ADD_TEST(OS_SocketAddrInit_Impl); - ADD_TEST(OS_SocketAddrToString_Impl); - ADD_TEST(OS_SocketAddrFromString_Impl); ADD_TEST(OS_SocketAddrGetPort_Impl); ADD_TEST(OS_SocketAddrSetPort_Impl); + ADD_TEST(OS_SocketGetOption_Impl); + ADD_TEST(OS_SocketSetOption_Impl); } diff --git a/src/unit-test-coverage/portable/src/coveragetest-no-file-allocate.c b/src/unit-test-coverage/portable/src/coveragetest-no-file-allocate.c new file mode 100644 index 000000000..576d131c0 --- /dev/null +++ b/src/unit-test-coverage/portable/src/coveragetest-no-file-allocate.c @@ -0,0 +1,65 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup portable + * \author joseph.p.hickey@nasa.gov + * + */ + +#include "os-portable-coveragetest.h" +#include "os-shared-file.h" + +void Test_OS_FileAllocate_Impl(void) +{ + /* Test Case For: + * int32 OS_FileAllocate_Impl(uint32 stream_id, const char* Cmd) + */ + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate_Impl, (NULL, 0, 0), OS_ERR_NOT_IMPLEMENTED); +} + +/* ------------------- End of test cases --------------------------------------*/ + +/* Osapi_Test_Setup + * + * Purpose: + * Called by the unit test tool to set up the app prior to each test + */ +void Osapi_Test_Setup(void) +{ + UT_ResetState(0); +} + +/* + * Osapi_Test_Teardown + * + * Purpose: + * Called by the unit test tool to tear down the app after each test + */ +void Osapi_Test_Teardown(void) {} + +/* UtTest_Setup + * + * Purpose: + * Registers the test cases to execute with the unit test tool + */ +void UtTest_Setup(void) +{ + ADD_TEST(OS_FileAllocate_Impl); +} diff --git a/src/unit-test-coverage/portable/src/coveragetest-no-network-gethostid.c b/src/unit-test-coverage/portable/src/coveragetest-no-network-gethostid.c new file mode 100644 index 000000000..7e61fc3c7 --- /dev/null +++ b/src/unit-test-coverage/portable/src/coveragetest-no-network-gethostid.c @@ -0,0 +1,60 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \brief Coverage test for no network gethostid implementation + * \ingroup portable + */ + +#include "os-portable-coveragetest.h" +#include "os-shared-network.h" + +void Test_No_Network_GetHostID(void) +{ + OSAPI_TEST_FUNCTION_RC(OS_NetworkGetID_Impl, (NULL), OS_ERR_NOT_IMPLEMENTED); +} + +/* ------------------- End of test cases --------------------------------------*/ + +/* Osapi_Test_Setup + * + * Purpose: + * Called by the unit test tool to set up the app prior to each test + */ +void Osapi_Test_Setup(void) +{ + UT_ResetState(0); +} + +/* + * Osapi_Test_Teardown + * + * Purpose: + * Called by the unit test tool to tear down the app after each test + */ +void Osapi_Test_Teardown(void) {} + +/* UtTest_Setup + * + * Purpose: + * Registers the test cases to execute with the unit test tool + */ +void UtTest_Setup(void) +{ + ADD_TEST(No_Network_GetHostID); +} diff --git a/src/unit-test-coverage/portable/src/coveragetest-no-network.c b/src/unit-test-coverage/portable/src/coveragetest-no-network-gethostname.c similarity index 89% rename from src/unit-test-coverage/portable/src/coveragetest-no-network.c rename to src/unit-test-coverage/portable/src/coveragetest-no-network-gethostname.c index 115073855..534488f88 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-no-network.c +++ b/src/unit-test-coverage/portable/src/coveragetest-no-network-gethostname.c @@ -17,16 +17,15 @@ ************************************************************************/ /** - * \brief Coverage test for no network implementation + * \brief Coverage test for no network gethostname implementation * \ingroup portable */ #include "os-portable-coveragetest.h" #include "os-shared-network.h" -void Test_No_Network(void) +void Test_No_Network_GetHostName(void) { - OSAPI_TEST_FUNCTION_RC(OS_NetworkGetID_Impl, (NULL), OS_ERR_NOT_IMPLEMENTED); OSAPI_TEST_FUNCTION_RC(OS_NetworkGetHostName_Impl, (NULL, 0), OS_ERR_NOT_IMPLEMENTED); } @@ -57,5 +56,5 @@ void Osapi_Test_Teardown(void) {} */ void UtTest_Setup(void) { - ADD_TEST(No_Network); + ADD_TEST(No_Network_GetHostName); } diff --git a/src/unit-test-coverage/portable/src/coveragetest-no-rwlock.c b/src/unit-test-coverage/portable/src/coveragetest-no-rwlock.c new file mode 100644 index 000000000..f765feae7 --- /dev/null +++ b/src/unit-test-coverage/portable/src/coveragetest-no-rwlock.c @@ -0,0 +1,127 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup portable + * \author joseph.p.hickey@nasa.gov + * + */ + +#include "os-portable-coveragetest.h" +#include "os-shared-rwlock.h" + +void Test_OS_RwLockCreate_Impl(void) +{ + /* Test Case For: + * int32 OS_RwLockCreate_Impl(const OS_object_token_t *token, uint32 options) + */ + + OSAPI_TEST_FUNCTION_RC(OS_RwLockCreate_Impl, (UT_INDEX_0, 0), OS_ERR_NOT_IMPLEMENTED); +} + +void Test_OS_RwLockDelete_Impl(void) +{ + /* Test Case For: + * int32 OS_RwLockDelete_Impl(const OS_object_token_t *token, uint32 options) + */ + + OSAPI_TEST_FUNCTION_RC(OS_RwLockDelete_Impl, (UT_INDEX_0), OS_ERR_NOT_IMPLEMENTED); +} + +void Test_OS_RwLockReadGive_Impl(void) +{ + /* Test Case For: + * int32 OS_RwLockReadGive_Impl(const OS_object_token_t *token) + */ + + OSAPI_TEST_FUNCTION_RC(OS_RwLockReadGive_Impl, (UT_INDEX_0), OS_ERR_NOT_IMPLEMENTED); +} + +void Test_OS_RwLockWriteGive_Impl(void) +{ + /* Test Case For: + * int32 OS_RwLockWriteGive_Impl(const OS_object_token_t *token) + */ + + OSAPI_TEST_FUNCTION_RC(OS_RwLockWriteGive_Impl, (UT_INDEX_0), OS_ERR_NOT_IMPLEMENTED); +} + +void Test_OS_RwLockReadTake_Impl(void) +{ + /* Test Case For: + * int32 OS_RwLockReadTake_Impl(const OS_object_token_t *token) + */ + + OSAPI_TEST_FUNCTION_RC(OS_RwLockReadTake_Impl, (UT_INDEX_0), OS_ERR_NOT_IMPLEMENTED); +} + +void Test_OS_RwLockWriteTake_Impl(void) +{ + /* Test Case For: + * int32 OS_RwLockWriteTake_Impl(const OS_object_token_t *token) + */ + + OSAPI_TEST_FUNCTION_RC(OS_RwLockWriteTake_Impl, (UT_INDEX_0), OS_ERR_NOT_IMPLEMENTED); +} + +void Test_OS_RwLockGetInfo_Impl(void) +{ + /* Test Case For: + * int32 OS_RwLockGetInfo_Impl(const OS_object_token_t *token, OS_rwlock_prop_t *rw_prop) + */ + OS_rwlock_prop_t rw_prop; + + OSAPI_TEST_FUNCTION_RC(OS_RwLockGetInfo_Impl, (UT_INDEX_0, &rw_prop), OS_ERR_NOT_IMPLEMENTED); +} + +/* ------------------- End of test cases --------------------------------------*/ + +/* Osapi_Test_Setup + * + * Purpose: + * Called by the unit test tool to set up the app prior to each test + */ +void Osapi_Test_Setup(void) +{ + UT_ResetState(0); +} + +/* + * Osapi_Test_Teardown + * + * Purpose: + * Called by the unit test tool to tear down the app after each test + */ +void Osapi_Test_Teardown(void) {} + +/* UtTest_Setup + * + * Purpose: + * Registers the test cases to execute with the unit test tool + */ +void UtTest_Setup(void) +{ + ADD_TEST(OS_RwLockCreate_Impl); + ADD_TEST(OS_RwLockDelete_Impl); + ADD_TEST(OS_RwLockReadGive_Impl); + ADD_TEST(OS_RwLockWriteGive_Impl); + ADD_TEST(OS_RwLockReadTake_Impl); + ADD_TEST(OS_RwLockWriteTake_Impl); + ADD_TEST(OS_RwLockGetInfo_Impl); +} diff --git a/src/unit-test-coverage/portable/src/coveragetest-no-sockets.c b/src/unit-test-coverage/portable/src/coveragetest-no-sockets.c index 6013b9637..9abc73dff 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-no-sockets.c +++ b/src/unit-test-coverage/portable/src/coveragetest-no-sockets.c @@ -40,6 +40,8 @@ void Test_No_Sockets(void) OSAPI_TEST_FUNCTION_RC(OS_SocketAddrFromString_Impl, (NULL, NULL), OS_ERR_NOT_IMPLEMENTED); OSAPI_TEST_FUNCTION_RC(OS_SocketAddrGetPort_Impl, (NULL, NULL), OS_ERR_NOT_IMPLEMENTED); OSAPI_TEST_FUNCTION_RC(OS_SocketAddrSetPort_Impl, (NULL, 0), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_SocketGetOption_Impl, (NULL, 0, NULL), OS_ERR_NOT_IMPLEMENTED); + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption_Impl, (NULL, 0, NULL), OS_ERR_NOT_IMPLEMENTED); } /* ------------------- End of test cases --------------------------------------*/ diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-file-allocate.c b/src/unit-test-coverage/portable/src/coveragetest-posix-file-allocate.c new file mode 100644 index 000000000..00cb5ce57 --- /dev/null +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-file-allocate.c @@ -0,0 +1,89 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup portable + * \author joseph.p.hickey@nasa.gov + * + */ + +#include "os-portable-coveragetest.h" +#include "os-shared-idmap.h" +#include "os-shared-file.h" + +#include "OCS_fcntl.h" +#include "OCS_errno.h" + +void Test_OS_FileAllocate_Impl(void) +{ + /* + * Test Case For: + * int32 OS_FileAllocate_Impl(const OS_object_token_t *token, osal_offset_t offset, osal_offset_t len); + */ + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); + + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate_Impl, (&token, 0, 0), OS_SUCCESS); + + UT_SetDefaultReturnValue(UT_KEY(OCS_posix_fallocate), -1); + + OCS_errno = OCS_EOPNOTSUPP; + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate_Impl, (&token, 0, 0), OS_ERR_OPERATION_NOT_SUPPORTED); + OCS_errno = OCS_EFBIG; + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate_Impl, (&token, 0, 0), OS_ERR_OUTPUT_TOO_LARGE); + OCS_errno = OCS_ENOSPC; + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate_Impl, (&token, 0, 0), OS_ERR_OUTPUT_TOO_LARGE); + OCS_errno = OCS_ESPIPE; + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate_Impl, (&token, 0, 0), OS_ERR_INCORRECT_OBJ_TYPE); + OCS_errno = OCS_ENODEV; + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate_Impl, (&token, 0, 0), OS_ERR_INCORRECT_OBJ_TYPE); + OCS_errno = OCS_EINVAL; /* something for the catch all */ + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate_Impl, (&token, 0, 0), OS_ERROR); +} + +/* ------------------- End of test cases --------------------------------------*/ + +/* Osapi_Test_Setup + * + * Purpose: + * Called by the unit test tool to set up the app prior to each test + */ +void Osapi_Test_Setup(void) +{ + UT_ResetState(0); +} + +/* + * Osapi_Test_Teardown + * + * Purpose: + * Called by the unit test tool to tear down the app after each test + */ +void Osapi_Test_Teardown(void) {} + +/* UtTest_Setup + * + * Purpose: + * Registers the test cases to execute with the unit test tool + */ +void UtTest_Setup(void) +{ + ADD_TEST(OS_FileAllocate_Impl); +} diff --git a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c index 70a1f707b..401ad469e 100644 --- a/src/unit-test-coverage/portable/src/coveragetest-posix-files.c +++ b/src/unit-test-coverage/portable/src/coveragetest-posix-files.c @@ -160,6 +160,34 @@ void Test_OS_FileChmod_Impl(void) OSAPI_TEST_FUNCTION_RC(OS_FileChmod_Impl, ("local", OS_READ_WRITE), OS_SUCCESS); } +void Test_OS_FileTruncate_Impl(void) +{ + /* + * Test Case For: + * int32 OS_FileTruncate_Impl(const OS_object_token_t *token, osal_offset_t len); + */ + OS_object_token_t token; + + memset(&token, 0, sizeof(token)); + + OSAPI_TEST_FUNCTION_RC(OS_FileTruncate_Impl, (&token, 0), OS_SUCCESS); + + UT_SetDefaultReturnValue(UT_KEY(OCS_ftruncate), -1); + + OCS_errno = OCS_EACCES; + OSAPI_TEST_FUNCTION_RC(OS_FileTruncate_Impl, (&token, 0), OS_ERR_OPERATION_NOT_SUPPORTED); + OCS_errno = OCS_EPERM; + OSAPI_TEST_FUNCTION_RC(OS_FileTruncate_Impl, (&token, 0), OS_ERR_OPERATION_NOT_SUPPORTED); + OCS_errno = OCS_ETXTBSY; + OSAPI_TEST_FUNCTION_RC(OS_FileTruncate_Impl, (&token, 0), OS_ERR_OPERATION_NOT_SUPPORTED); + OCS_errno = OCS_EROFS; + OSAPI_TEST_FUNCTION_RC(OS_FileTruncate_Impl, (&token, 0), OS_ERR_OPERATION_NOT_SUPPORTED); + OCS_errno = OCS_EFBIG; + OSAPI_TEST_FUNCTION_RC(OS_FileTruncate_Impl, (&token, 0), OS_ERR_OUTPUT_TOO_LARGE); + OCS_errno = OCS_EINVAL; /* something for the catch all */ + OSAPI_TEST_FUNCTION_RC(OS_FileTruncate_Impl, (&token, 0), OS_ERROR); +} + void Test_OS_FileRemove_Impl(void) { /* @@ -221,4 +249,5 @@ void UtTest_Setup(void) ADD_TEST(OS_FileChmod_Impl); ADD_TEST(OS_FileRemove_Impl); ADD_TEST(OS_FileRename_Impl); + ADD_TEST(OS_FileTruncate_Impl); } diff --git a/src/unit-test-coverage/shared/CMakeLists.txt b/src/unit-test-coverage/shared/CMakeLists.txt index 2b3b98eb4..c8a5ef2ca 100644 --- a/src/unit-test-coverage/shared/CMakeLists.txt +++ b/src/unit-test-coverage/shared/CMakeLists.txt @@ -19,6 +19,7 @@ set(MODULE_LIST network printf queue + rwlock select sockets task diff --git a/src/unit-test-coverage/shared/src/coveragetest-clock.c b/src/unit-test-coverage/shared/src/coveragetest-clock.c index dae84ee71..fa40dcacf 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-clock.c +++ b/src/unit-test-coverage/shared/src/coveragetest-clock.c @@ -25,6 +25,19 @@ #include "os-shared-coveragetest.h" #include "os-shared-clock.h" +void Test_OS_GetMonotonicTime(void) +{ + /* + * Test Case For: + * int32 OS_GetMonotonicTime(OS_time_t *time_struct) + */ + OS_time_t time_struct; + + UtAssert_INT32_EQ(OS_GetMonotonicTime(&time_struct), OS_SUCCESS); + UtAssert_NONZERO(OS_TimeGetTotalMilliseconds(time_struct)); + UtAssert_INT32_EQ(OS_GetMonotonicTime(NULL), OS_INVALID_POINTER); +} + void Test_OS_GetLocalTime(void) { /* @@ -220,6 +233,7 @@ void Osapi_Test_Teardown(void) {} void UtTest_Setup(void) { ADD_TEST(OS_GetLocalTime); + ADD_TEST(OS_GetMonotonicTime); ADD_TEST(OS_SetLocalTime); ADD_TEST(OS_TimeAccessConversions); ADD_TEST(OS_TimeFromRelativeMilliseconds); diff --git a/src/unit-test-coverage/shared/src/coveragetest-file.c b/src/unit-test-coverage/shared/src/coveragetest-file.c index 54ce227c0..4a90aeacb 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-file.c +++ b/src/unit-test-coverage/shared/src/coveragetest-file.c @@ -320,6 +320,38 @@ void Test_OS_FDGetInfo(void) OSAPI_TEST_FUNCTION_RC(OS_FDGetInfo(UT_OBJID_1, &file_prop), OS_ERR_INVALID_ID); } +void Test_OS_FileAllocate(void) +{ + /* + * Test Case For: + * int32 OS_FileAllocate(osal_id_t filedes, osal_offset_t offset, osal_offset_t len) + */ + + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate(UT_OBJID_1, 0, 0), OS_SUCCESS); + + UT_SetDefaultReturnValue(UT_KEY(OS_FileAllocate_Impl), OS_ERR_OUTPUT_TOO_LARGE); + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate(UT_OBJID_1, 0, 0), OS_ERR_OUTPUT_TOO_LARGE); + + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERR_INVALID_ID); + OSAPI_TEST_FUNCTION_RC(OS_FileAllocate(UT_OBJID_1, 0, 0), OS_ERR_INVALID_ID); +} + +void Test_OS_FileTruncate(void) +{ + /* + * Test Case For: + * int32 OS_FileTruncate(osal_id_t filedes, osal_offset_t len); + */ + + OSAPI_TEST_FUNCTION_RC(OS_FileTruncate(UT_OBJID_1, 0), OS_SUCCESS); + + UT_SetDefaultReturnValue(UT_KEY(OS_FileTruncate_Impl), OS_ERR_OUTPUT_TOO_LARGE); + OSAPI_TEST_FUNCTION_RC(OS_FileTruncate(UT_OBJID_1, 0), OS_ERR_OUTPUT_TOO_LARGE); + + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERR_INVALID_ID); + OSAPI_TEST_FUNCTION_RC(OS_FileTruncate(UT_OBJID_1, 0), OS_ERR_INVALID_ID); +} + void Test_OS_FileOpenCheck(void) { /* @@ -411,6 +443,8 @@ void UtTest_Setup(void) ADD_TEST(OS_TimedWrite); ADD_TEST(OS_read); ADD_TEST(OS_write); + ADD_TEST(OS_FileTruncate); + ADD_TEST(OS_FileAllocate); ADD_TEST(OS_chmod); ADD_TEST(OS_stat); ADD_TEST(OS_lseek); diff --git a/src/unit-test-coverage/shared/src/coveragetest-idmap.c b/src/unit-test-coverage/shared/src/coveragetest-idmap.c index 1b8f8ea8a..a40dc67fe 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-idmap.c +++ b/src/unit-test-coverage/shared/src/coveragetest-idmap.c @@ -1041,7 +1041,7 @@ void Test_OS_ForEachObject(void) UtAssert_True(Count.TaskCount == 1, "OS_ForEachObject() TaskCount (%lu) == 1", (unsigned long)Count.TaskCount); UtAssert_True(Count.QueueCount == 1, "OS_ForEachObject() QueueCount (%lu) == 1", (unsigned long)Count.QueueCount); UtAssert_True(Count.MutexCount == 1, "OS_ForEachObject() MutexCount (%lu) == 1", (unsigned long)Count.MutexCount); - UtAssert_True(Count.OtherCount == 10, "OS_ForEachObject() OtherCount (%lu) == 9", (unsigned long)Count.OtherCount); + UtAssert_True(Count.OtherCount == 11, "OS_ForEachObject() OtherCount (%lu) == 11", (unsigned long)Count.OtherCount); OS_ForEachObjectOfType(OS_OBJECT_TYPE_OS_QUEUE, self_id.id, ObjTypeCounter, &Count); UtAssert_True(Count.TaskCount == 1, "OS_ForEachObjectOfType(), creator %08lx TaskCount (%lu) == 1", diff --git a/src/unit-test-coverage/shared/src/coveragetest-rwlock.c b/src/unit-test-coverage/shared/src/coveragetest-rwlock.c new file mode 100644 index 000000000..bc5850da4 --- /dev/null +++ b/src/unit-test-coverage/shared/src/coveragetest-rwlock.c @@ -0,0 +1,259 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup shared + * \author joseph.p.hickey@nasa.gov + * + */ +#include "os-shared-coveragetest.h" +#include "os-shared-rwlock.h" + +#include "OCS_string.h" + +/* +********************************************************************************** +** PUBLIC API FUNCTIONS +********************************************************************************** +*/ + +void Test_OS_RwLockAPI_Init(void) +{ + /* + * Test Case For: + * int32 OS_RwLockAPI_Init(void) + */ + OSAPI_TEST_FUNCTION_RC(OS_RwLockAPI_Init(), OS_SUCCESS); +} + +void Test_OS_RwLockCreate(void) +{ + /* + * Test Case For: + * int32 OS_RwLockCreate (uint32 *rw_id, const char *rw_name, uint32 options) + */ + osal_id_t objid = OS_OBJECT_ID_UNDEFINED; + + OSAPI_TEST_FUNCTION_RC(OS_RwLockCreate(&objid, "UT", 0), OS_SUCCESS); + OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); + + OSAPI_TEST_FUNCTION_RC(OS_RwLockCreate(NULL, "UT", 0), OS_INVALID_POINTER); + OSAPI_TEST_FUNCTION_RC(OS_RwLockCreate(&objid, NULL, 0), OS_INVALID_POINTER); + + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdAllocateNew), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_RwLockCreate(&objid, "UT", 0), OS_ERROR); + + UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_RwLockCreate(&objid, "UT", 0), OS_ERR_NAME_TOO_LONG); +} + +void Test_OS_RwLockDelete(void) +{ + /* + * Test Case For: + * int32 OS_RwLockDelete (uint32 rw_id) + */ + + OSAPI_TEST_FUNCTION_RC(OS_RwLockDelete(UT_OBJID_1), OS_SUCCESS); + + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_RwLockDelete(UT_OBJID_1), OS_ERROR); +} + +void Test_OS_RwLockReadGive(void) +{ + /* + * Test Case For: + * int32 OS_RwLockReadGive ( uint32 rw_id ) + */ + OS_rwlock_internal_record_t *rwlock; + + /* Call when held by a writer. This still works (or at least it calls the OS impl) + * but should generate a debug message */ + rwlock = &OS_rwlock_table[1]; + rwlock->last_writer = OS_TaskGetId(); + OSAPI_TEST_FUNCTION_RC(OS_RwLockReadGive(UT_OBJID_1), OS_SUCCESS); + + /* Since rwlocks have no mechanism to check if a thread holds a read lock, this will always work */ + rwlock->last_writer = OS_OBJECT_ID_UNDEFINED; + OSAPI_TEST_FUNCTION_RC(OS_RwLockReadGive(UT_OBJID_1), OS_SUCCESS); + + /* writer should still be undefined */ + UtAssert_True(!OS_ObjectIdDefined(rwlock->last_writer), "RwLock writer unset"); + + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_RwLockReadGive(UT_OBJID_1), OS_ERROR); +} + +void Test_OS_RwLockWriteGive(void) +{ + /* + * Test Case For: + * int32 OS_RwLockWriteGive ( uint32 rw_id ) + */ + OS_rwlock_internal_record_t *rwlock; + + /* Set up for "last writer" matching the calling task (nominal) */ + rwlock = &OS_rwlock_table[1]; + rwlock->last_writer = OS_TaskGetId(); + OSAPI_TEST_FUNCTION_RC(OS_RwLockWriteGive(UT_OBJID_1), OS_SUCCESS); + + /* writer should be unset */ + UtAssert_True(!OS_ObjectIdDefined(rwlock->last_writer), "RwLock writer unset"); + + /* Call again when not held by a writer. This still works (or at least it calls the OS impl) + * but should generate a debug message */ + OSAPI_TEST_FUNCTION_RC(OS_RwLockWriteGive(UT_OBJID_1), OS_SUCCESS); + + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_RwLockWriteGive(UT_OBJID_1), OS_ERROR); +} + +void Test_OS_RwLockReadTake(void) +{ + /* + * Test Case For: + * int32 OS_RwLockReadTake ( uint32 rw_id ) + */ + OS_rwlock_internal_record_t *rwlock; + + /* Set up for "last writer" being undefined (nominal) */ + rwlock = &OS_rwlock_table[1]; + rwlock->last_writer = OS_OBJECT_ID_UNDEFINED; + OSAPI_TEST_FUNCTION_RC(OS_RwLockReadTake(UT_OBJID_1), OS_SUCCESS); + + /* writer shouldn't be set */ + UtAssert_True(!OS_ObjectIdDefined(rwlock->last_writer), "RwLock writer unset"); + + UT_SetDefaultReturnValue(UT_KEY(OS_RwLockReadTake_Impl), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_RwLockReadTake(UT_OBJID_1), OS_ERROR); + + /* Try and get the debug message to print */ + rwlock->last_writer = OS_OBJECT_ID_RESERVED; + OSAPI_TEST_FUNCTION_RC(OS_RwLockReadTake(UT_OBJID_1), OS_ERROR); + + UT_SetDefaultReturnValue(UT_KEY(OS_RwLockReadTake_Impl), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_RwLockReadTake(UT_OBJID_1), OS_SUCCESS); + rwlock->last_writer = OS_OBJECT_ID_UNDEFINED; + + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERR_INVALID_ID); + OSAPI_TEST_FUNCTION_RC(OS_RwLockReadTake(UT_OBJID_1), OS_ERR_INVALID_ID); +} + +void Test_OS_RwLockWriteTake(void) +{ + /* + * Test Case For: + * int32 OS_RwLockWriteTake ( uint32 rw_id ) + */ + OS_rwlock_internal_record_t *rwlock; + + /* Set up for "last writer" being undefined (nominal) */ + rwlock = &OS_rwlock_table[1]; + rwlock->last_writer = OS_OBJECT_ID_UNDEFINED; + OSAPI_TEST_FUNCTION_RC(OS_RwLockWriteTake(UT_OBJID_1), OS_SUCCESS); + + /* writer should be set */ + UtAssert_True(OS_ObjectIdDefined(rwlock->last_writer), "RwLock writer set"); + + /* Call again when holding write lock. This still works (or at least it calls the OS impl) */ + OSAPI_TEST_FUNCTION_RC(OS_RwLockWriteTake(UT_OBJID_1), OS_SUCCESS); + + UT_SetDefaultReturnValue(UT_KEY(OS_RwLockWriteTake_Impl), OS_ERROR); + OSAPI_TEST_FUNCTION_RC(OS_RwLockWriteTake(UT_OBJID_1), OS_ERROR); + + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERR_INVALID_ID); + OSAPI_TEST_FUNCTION_RC(OS_RwLockWriteTake(UT_OBJID_1), OS_ERR_INVALID_ID); +} + +void Test_OS_RwLockGetIdByName(void) +{ + /* + * Test Case For: + * int32 OS_RwLockGetIdByName (uint32 *rw_id, const char *rw_name) + */ + osal_id_t objid = OS_OBJECT_ID_UNDEFINED; + + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName), OS_SUCCESS); + OSAPI_TEST_FUNCTION_RC(OS_RwLockGetIdByName(&objid, "UT"), OS_SUCCESS); + OSAPI_TEST_OBJID(objid, !=, OS_OBJECT_ID_UNDEFINED); + UT_ClearDefaultReturnValue(UT_KEY(OS_ObjectIdFindByName)); + + OSAPI_TEST_FUNCTION_RC(OS_RwLockGetIdByName(&objid, "NF"), OS_ERR_NAME_NOT_FOUND); + + OSAPI_TEST_FUNCTION_RC(OS_RwLockGetIdByName(NULL, "UT"), OS_INVALID_POINTER); + OSAPI_TEST_FUNCTION_RC(OS_RwLockGetIdByName(&objid, NULL), OS_INVALID_POINTER); +} + +void Test_OS_RwLockGetInfo(void) +{ + /* + * Test Case For: + * int32 OS_RwLockGetInfo (uint32 rw_id, OS_rwlock_prop_t *rw_prop) + */ + OS_rwlock_prop_t prop; + + memset(&prop, 0, sizeof(prop)); + + OS_UT_SetupBasicInfoTest(OS_OBJECT_TYPE_OS_RWLOCK, UT_INDEX_1, "ABC", UT_OBJID_OTHER); + + OSAPI_TEST_FUNCTION_RC(OS_RwLockGetInfo(UT_OBJID_1, &prop), OS_SUCCESS); + + OSAPI_TEST_OBJID(prop.creator, ==, UT_OBJID_OTHER); + UtAssert_True(strcmp(prop.name, "ABC") == 0, "prop.name (%s) == ABC", prop.name); + + OSAPI_TEST_FUNCTION_RC(OS_RwLockGetInfo(UT_OBJID_1, NULL), OS_INVALID_POINTER); + + UT_SetDefaultReturnValue(UT_KEY(OS_ObjectIdGetById), OS_ERR_INVALID_ID); + OSAPI_TEST_FUNCTION_RC(OS_RwLockGetInfo(UT_OBJID_1, &prop), OS_ERR_INVALID_ID); +} + +/* Osapi_Test_Setup + * + * Purpose: + * Called by the unit test tool to set up the app prior to each test + */ +void Osapi_Test_Setup(void) +{ + UT_ResetState(0); +} + +/* + * Osapi_Test_Teardown + * + * Purpose: + * Called by the unit test tool to tear down the app after each test + */ +void Osapi_Test_Teardown(void) {} + +/* + * Register the test cases to execute with the unit test tool + */ +void UtTest_Setup(void) +{ + ADD_TEST(OS_RwLockAPI_Init); + ADD_TEST(OS_RwLockCreate); + ADD_TEST(OS_RwLockDelete); + ADD_TEST(OS_RwLockReadGive); + ADD_TEST(OS_RwLockWriteGive); + ADD_TEST(OS_RwLockReadTake); + ADD_TEST(OS_RwLockWriteTake); + ADD_TEST(OS_RwLockGetIdByName); + ADD_TEST(OS_RwLockGetInfo); +} diff --git a/src/unit-test-coverage/shared/src/coveragetest-sockets.c b/src/unit-test-coverage/shared/src/coveragetest-sockets.c index b2becc22a..7664bf7a8 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-sockets.c +++ b/src/unit-test-coverage/shared/src/coveragetest-sockets.c @@ -548,6 +548,60 @@ void Test_OS_SocketGetInfo(void) OSAPI_TEST_FUNCTION_RC(OS_SocketGetInfo(UT_OBJID_1, &prop), OS_ERR_INVALID_ID); } +/***************************************************************************** + * + * Test case for OS_SocketGetOption() + * + *****************************************************************************/ +void Test_OS_SocketGetOption(void) +{ + /* + * Test Case For: + * int32 OS_SocketGetOption(osal_id_t sock_id, OS_socket_option_t opt_id, OS_socket_optval_t *optval) + */ + OS_socket_optval_t optval; + + memset(&optval, 0, sizeof(optval)); + + /* nominal */ + OSAPI_TEST_FUNCTION_RC(OS_SocketGetOption(UT_OBJID_1, OS_socket_option_UNDEFINED, &optval), OS_SUCCESS); + + /* error cases */ + OSAPI_TEST_FUNCTION_RC(OS_SocketGetOption(UT_OBJID_1, -1, &optval), OS_ERR_INVALID_ARGUMENT); + OSAPI_TEST_FUNCTION_RC(OS_SocketGetOption(UT_OBJID_1, OS_socket_option_MAX, &optval), OS_ERR_INVALID_ARGUMENT); + OSAPI_TEST_FUNCTION_RC(OS_SocketGetOption(UT_OBJID_1, OS_socket_option_UNDEFINED, NULL), OS_INVALID_POINTER); + + UT_SetDeferredRetcode(UT_KEY(OS_ObjectIdGetById), 1, OS_ERR_INVALID_ID); + OSAPI_TEST_FUNCTION_RC(OS_SocketGetOption(UT_OBJID_1, OS_socket_option_UNDEFINED, &optval), OS_ERR_INVALID_ID); +} + +/***************************************************************************** + * + * Test case for OS_SocketSetOption() + * + *****************************************************************************/ +void Test_OS_SocketSetOption(void) +{ + /* + * Test Case For: + * int32 OS_SocketSetOption(osal_id_t sock_id, OS_socket_option_t opt_id, const OS_socket_optval_t *optval) + */ + OS_socket_optval_t optval; + + memset(&optval, 0, sizeof(optval)); + + /* nominal */ + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption(UT_OBJID_1, OS_socket_option_UNDEFINED, &optval), OS_SUCCESS); + + /* error cases */ + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption(UT_OBJID_1, -1, &optval), OS_ERR_INVALID_ARGUMENT); + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption(UT_OBJID_1, OS_socket_option_MAX, &optval), OS_ERR_INVALID_ARGUMENT); + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption(UT_OBJID_1, OS_socket_option_UNDEFINED, NULL), OS_INVALID_POINTER); + + UT_SetDeferredRetcode(UT_KEY(OS_ObjectIdGetById), 1, OS_ERR_INVALID_ID); + OSAPI_TEST_FUNCTION_RC(OS_SocketSetOption(UT_OBJID_1, OS_socket_option_UNDEFINED, &optval), OS_ERR_INVALID_ID); +} + void Test_OS_SocketAddr(void) { /* @@ -622,4 +676,6 @@ void UtTest_Setup(void) ADD_TEST(OS_SocketGetIdByName); ADD_TEST(OS_SocketGetInfo); ADD_TEST(OS_CreateSocketName); + ADD_TEST(OS_SocketGetOption); + ADD_TEST(OS_SocketSetOption); } diff --git a/src/unit-test-coverage/shared/src/coveragetest-task.c b/src/unit-test-coverage/shared/src/coveragetest-task.c index 02e75f463..3b3f1cee7 100644 --- a/src/unit-test-coverage/shared/src/coveragetest-task.c +++ b/src/unit-test-coverage/shared/src/coveragetest-task.c @@ -159,7 +159,7 @@ void Test_OS_TaskExit(void) { /* * Test Case For: - * void OS_TaskExit() + * void OS_TaskExit(void) */ OS_TaskExit(); diff --git a/src/unit-test-coverage/shared/src/os-shared-coverage-support.c b/src/unit-test-coverage/shared/src/os-shared-coverage-support.c index bbfe7878b..9ac25e8e7 100644 --- a/src/unit-test-coverage/shared/src/os-shared-coverage-support.c +++ b/src/unit-test-coverage/shared/src/os-shared-coverage-support.c @@ -101,6 +101,9 @@ void OS_UT_SetupBasicInfoTest(osal_objtype_t obj_type, osal_index_t test_idx, co case OS_OBJECT_TYPE_OS_CONDVAR: rptr = OS_global_condvar_table; break; + case OS_OBJECT_TYPE_OS_RWLOCK: + rptr = OS_global_rwlock_table; + break; default: rptr = NULL; break; diff --git a/src/unit-test-coverage/ut-stubs/CMakeLists.txt b/src/unit-test-coverage/ut-stubs/CMakeLists.txt index d96eef819..ccd585a7e 100644 --- a/src/unit-test-coverage/ut-stubs/CMakeLists.txt +++ b/src/unit-test-coverage/ut-stubs/CMakeLists.txt @@ -56,6 +56,7 @@ add_library(ut_libc_stubs STATIC EXCLUDE_FROM_ALL src/posix-fcntl-stubs.c src/posix-ioctl-stubs.c src/posix-mqueue-stubs.c + src/posix-netdb-stubs.c src/posix-pthread-stubs.c src/posix-sched-stubs.c src/posix-semaphore-stubs.c @@ -126,6 +127,7 @@ set(OSAL_SHARED_IMPL_HEADERS ${OSAL_SOURCE_DIR}/src/os/shared/inc/os-shared-network.h ${OSAL_SOURCE_DIR}/src/os/shared/inc/os-shared-printf.h ${OSAL_SOURCE_DIR}/src/os/shared/inc/os-shared-queue.h + ${OSAL_SOURCE_DIR}/src/os/shared/inc/os-shared-rwlock.h ${OSAL_SOURCE_DIR}/src/os/shared/inc/os-shared-select.h ${OSAL_SOURCE_DIR}/src/os/shared/inc/os-shared-shell.h ${OSAL_SOURCE_DIR}/src/os/shared/inc/os-shared-sockets.h @@ -183,6 +185,7 @@ add_library(ut_osapi_impl_stubs STATIC EXCLUDE_FROM_ALL src/os-shared-network-impl-stubs.c src/os-shared-printf-impl-stubs.c src/os-shared-queue-impl-stubs.c + src/os-shared-rwlock-impl-stubs.c src/os-shared-select-impl-stubs.c src/os-shared-shell-impl-stubs.c src/os-shared-sockets-impl-handlers.c @@ -211,6 +214,7 @@ add_library(ut_osapi_init_stubs STATIC EXCLUDE_FROM_ALL src/os-shared-mutex-init-stubs.c src/os-shared-network-init-stubs.c src/os-shared-queue-init-stubs.c + src/os-shared-queue-init-stubs.c src/os-shared-sockets-init-stubs.c src/os-shared-task-init-stubs.c src/os-shared-timebase-init-stubs.c @@ -259,6 +263,7 @@ add_library(ut_osapi_table_stubs STATIC EXCLUDE_FROM_ALL src/osapi-shared-module-table-stubs.c src/osapi-shared-mutex-table-stubs.c src/osapi-shared-queue-table-stubs.c + src/osapi-shared-rwlock-table-stubs.c src/osapi-shared-stream-table-stubs.c src/osapi-shared-task-table-stubs.c src/osapi-shared-timebase-table-stubs.c diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h b/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h index 3609fdd74..e72db0db7 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_errno.h @@ -32,16 +32,23 @@ /* constants normally defined in errno.h */ /* ----------------------------------------- */ /* POSIX-specific errnos */ -#define OCS_EINTR 0x1801 -#define OCS_EAGAIN 0x1802 -#define OCS_EEXIST 0x180a -#define OCS_EINVAL 0x1803 -#define OCS_EMSGSIZE 0x1804 -#define OCS_ETIMEDOUT 0x1805 -#define OCS_ESPIPE 0x1806 -#define OCS_ENOTSUP 0x1807 -#define OCS_ENOSYS 0x1808 -#define OCS_EROFS 0x1809 +#define OCS_EINTR 0x1801 +#define OCS_EAGAIN 0x1802 +#define OCS_EEXIST 0x180a +#define OCS_EINVAL 0x1803 +#define OCS_EMSGSIZE 0x1804 +#define OCS_ETIMEDOUT 0x1805 +#define OCS_ESPIPE 0x1806 +#define OCS_ENOTSUP 0x1807 +#define OCS_ENOSYS 0x1808 +#define OCS_EROFS 0x1809 +#define OCS_EACCES 0x180b +#define OCS_EFBIG 0x180c +#define OCS_ENODEV 0x180d +#define OCS_ENOSPC 0x180e +#define OCS_EOPNOTSUPP 0x180f +#define OCS_EPERM 0x1810 +#define OCS_ETXTBSY 0x1811 /* ----------------------------------------- */ /* types normally defined in errno.h */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h b/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h index 45635300c..19e960885 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_fcntl.h @@ -27,6 +27,7 @@ #define OCS_FCNTL_H #include "OCS_basetypes.h" +#include "OCS_sys_types.h" /* ----------------------------------------- */ /* constants normally defined in fcntl.h */ @@ -84,5 +85,7 @@ extern int OCS_fcntl(int fd, int cmd, ...); extern int OCS_open(const char *file, int oflag, ...); +extern int OCS_posix_fallocate(int fd, OCS_off_t offset, OCS_off_t len); +extern int OCS_ftruncate(int fd, OCS_off_t len); #endif /* OCS_FCNTL_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h b/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h index 0e3d7b2d2..35f600434 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_netdb.h @@ -27,17 +27,39 @@ #define OCS_NETDB_H #include "OCS_basetypes.h" +#include "OCS_sys_socket.h" /* ----------------------------------------- */ /* constants normally defined in netdb.h */ /* ----------------------------------------- */ +#define OCS_EAI_AGAIN 0x1a1a +#define OCS_EAI_NONAME 0x1a1b + /* ----------------------------------------- */ /* types normally defined in netdb.h */ /* ----------------------------------------- */ +struct OCS_addrinfo +{ + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + OCS_socklen_t ai_addrlen; + struct OCS_sockaddr *ai_addr; + char * ai_canonname; + struct OCS_addrinfo *ai_next; +}; + /* ----------------------------------------- */ /* prototypes normally declared in netdb.h */ /* ----------------------------------------- */ +int OCS_getnameinfo(const struct OCS_sockaddr *addr, OCS_socklen_t addrlen, char *host, OCS_socklen_t hostlen, + char *serv, OCS_socklen_t servlen, int flags); + +int OCS_getaddrinfo(const char *node, const char *service, const struct OCS_addrinfo *hints, struct OCS_addrinfo **res); + +void OCS_freeaddrinfo(struct OCS_addrinfo *res); #endif /* OCS_NETDB_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h index b21c69ea6..b66ea0d19 100644 --- a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_in.h @@ -45,4 +45,7 @@ extern uint16_t OCS_ntohs(uint16_t netshort); extern uint32_t OCS_htonl(uint32_t hostlong); extern uint32_t OCS_ntohl(uint32_t netlong); +#define OCS_IP_TOS 0x2E01 +#define OCS_IPPROTO_IP 0x2F02 + #endif /* OCS_NETINET_IN_H */ diff --git a/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_ip.h b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_ip.h new file mode 100644 index 000000000..a3eb928d5 --- /dev/null +++ b/src/unit-test-coverage/ut-stubs/inc/OCS_netinet_ip.h @@ -0,0 +1,65 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/************************************************************************ + * Note that this file has been cloned-n-owned from its open-source github + * repository for Gateway as of September 2023. Therefore, it is subject to + * NASA Export Control restrictions, as stated below. + ************************************************************************/ + +/************************************************************************/ +/** \export_control EAR ECCN 9E515.a and/or 9E515.f (HALO) + * + * Export Administration Regulations (EAR) Notice + * + * This document contains information which falls under the purview of the + * Export Administration Regulations (EAR), 15 CFR §730-774 and is export + * controlled. It may be used only to fulfill responsibilities of the Parties + * of, or a Cooperating Agency of a NASA Gateway Program Partner (CSA, ESA, + * JAXA, MBRSC) and their contractors in furtherance of the Gateway MOUs + * with ESA, CSA, and Japan and IA with MBRSC. Any use, re-transfer, or + * disclosure to any party for any purpose other than the designated use of + * fulfilling the responsibilities of the Gateway MOUs and IA requires prior + * U.S. Government authorization. + *************************************************************************/ + +/** + * \file + * \ingroup ut-stubs + * + * OSAL coverage stub replacement for netinet/ip.h + */ + +#ifndef OCS_NETINET_IP_H +#define OCS_NETINET_IP_H + +#include "OCS_basetypes.h" + +/* ----------------------------------------- */ +/* constants normally defined in netinet/ip.h */ +/* ----------------------------------------- */ + +/* ----------------------------------------- */ +/* types normally defined in netinet/ip.h */ +/* ----------------------------------------- */ + +/* ----------------------------------------- */ +/* prototypes normally declared in netinet/ip.h */ +/* ----------------------------------------- */ + +#endif /* OCS_NETINET_IP_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/errno.h b/src/unit-test-coverage/ut-stubs/override_inc/errno.h index 9ab7f1782..0adcfe296 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/errno.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/errno.h @@ -31,16 +31,23 @@ /* ----------------------------------------- */ /* mappings for declarations in errno.h */ /* ----------------------------------------- */ -#define EINTR OCS_EINTR -#define EAGAIN OCS_EAGAIN -#define EINVAL OCS_EINVAL -#define EEXIST OCS_EEXIST -#define EMSGSIZE OCS_EMSGSIZE -#define ETIMEDOUT OCS_ETIMEDOUT -#define ESPIPE OCS_ESPIPE -#define ENOTSUP OCS_ENOTSUP -#define ENOSYS OCS_ENOSYS -#define EROFS OCS_EROFS +#define EAGAIN OCS_EAGAIN +#define EACCES OCS_EACCES +#define EEXIST OCS_EEXIST +#define EFBIG OCS_EFBIG +#define EINTR OCS_EINTR +#define EINVAL OCS_EINVAL +#define EMSGSIZE OCS_EMSGSIZE +#define ENODEV OCS_ENODEV +#define ENOSPC OCS_ENOSPC +#define ENOSYS OCS_ENOSYS +#define ENOTSUP OCS_ENOTSUP +#define EOPNOTSUPP OCS_EOPNOTSUPP +#define EPERM OCS_EPERM +#define EROFS OCS_EROFS +#define ESPIPE OCS_ESPIPE +#define ETIMEDOUT OCS_ETIMEDOUT +#define ETXTBSY OCS_ETXTBSY #define errno OCS_errno diff --git a/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h b/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h index 43da5d696..561ca0131 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/fcntl.h @@ -57,7 +57,9 @@ #define F_SETFD OCS_F_SETFD #define F_DUPFD OCS_F_DUPFD -#define fcntl OCS_fcntl -#define open OCS_open +#define fcntl OCS_fcntl +#define open OCS_open +#define posix_fallocate OCS_posix_fallocate +#define ftruncate OCS_ftruncate #endif /* OVERRIDE_FCNTL_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/netdb.h b/src/unit-test-coverage/ut-stubs/override_inc/netdb.h index 5ce893fb9..837686e90 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/netdb.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/netdb.h @@ -32,4 +32,12 @@ /* mappings for declarations in netdb.h */ /* ----------------------------------------- */ +#define EAI_AGAIN OCS_EAI_AGAIN +#define EAI_NONAME OCS_EAI_NONAME + +#define addrinfo OCS_addrinfo +#define getnameinfo OCS_getnameinfo +#define getaddrinfo OCS_getaddrinfo +#define freeaddrinfo OCS_freeaddrinfo + #endif /* OVERRIDE_NETDB_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h b/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h index cdaf00626..08aa97e95 100644 --- a/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h +++ b/src/unit-test-coverage/ut-stubs/override_inc/netinet/in.h @@ -37,4 +37,7 @@ #define htonl OCS_htonl #define ntohl OCS_ntohl +#define IP_TOS OCS_IP_TOS +#define IPPROTO_IP OCS_IPPROTO_IP + #endif /* OVERRIDE_NETINET_IN_H */ diff --git a/src/unit-test-coverage/ut-stubs/override_inc/netinet/ip.h b/src/unit-test-coverage/ut-stubs/override_inc/netinet/ip.h new file mode 100644 index 000000000..e13577c31 --- /dev/null +++ b/src/unit-test-coverage/ut-stubs/override_inc/netinet/ip.h @@ -0,0 +1,57 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/************************************************************************ + * Note that this file has been cloned-n-owned from its open-source github + * repository for Gateway as of September 2023. Therefore, it is subject to + * NASA Export Control restrictions, as stated below. + ************************************************************************/ + +/************************************************************************/ +/** \export_control EAR ECCN 9E515.a and/or 9E515.f (HALO) + * + * Export Administration Regulations (EAR) Notice + * + * This document contains information which falls under the purview of the + * Export Administration Regulations (EAR), 15 CFR §730-774 and is export + * controlled. It may be used only to fulfill responsibilities of the Parties + * of, or a Cooperating Agency of a NASA Gateway Program Partner (CSA, ESA, + * JAXA, MBRSC) and their contractors in furtherance of the Gateway MOUs + * with ESA, CSA, and Japan and IA with MBRSC. Any use, re-transfer, or + * disclosure to any party for any purpose other than the designated use of + * fulfilling the responsibilities of the Gateway MOUs and IA requires prior + * U.S. Government authorization. + *************************************************************************/ + +/** + * \file + * \ingroup ut-stubs + * + * OSAL coverage stub replacement for netinet/ip.h + */ + +#ifndef OVERRIDE_NETINET_IP_H +#define OVERRIDE_NETINET_IP_H + +#include "OCS_netinet_ip.h" + +/* ----------------------------------------- */ +/* mappings for declarations in netinet/ip.h */ +/* ----------------------------------------- */ + +#endif /* OVERRIDE_NETINET_IP_H */ diff --git a/src/unit-test-coverage/ut-stubs/src/os-shared-clock-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/os-shared-clock-impl-stubs.c index e8f2160a2..bb10c7864 100644 --- a/src/unit-test-coverage/ut-stubs/src/os-shared-clock-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/os-shared-clock-impl-stubs.c @@ -43,6 +43,22 @@ int32 OS_GetLocalTime_Impl(OS_time_t *time_struct) return UT_GenStub_GetReturnValue(OS_GetLocalTime_Impl, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_GetMonotonicTime_Impl() + * ---------------------------------------------------- + */ +int32 OS_GetMonotonicTime_Impl(OS_time_t *time_struct) +{ + UT_GenStub_SetupReturnBuffer(OS_GetMonotonicTime_Impl, int32); + + UT_GenStub_AddParam(OS_GetMonotonicTime_Impl, OS_time_t *, time_struct); + + UT_GenStub_Execute(OS_GetMonotonicTime_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_GetMonotonicTime_Impl, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_SetLocalTime_Impl() diff --git a/src/unit-test-coverage/ut-stubs/src/os-shared-file-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/os-shared-file-impl-stubs.c index 87c418997..8bbebfc8a 100644 --- a/src/unit-test-coverage/ut-stubs/src/os-shared-file-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/os-shared-file-impl-stubs.c @@ -28,6 +28,24 @@ void UT_DefaultHandler_OS_GenericRead_Impl(void *, UT_EntryKey_t, const UT_StubContext_t *); void UT_DefaultHandler_OS_GenericWrite_Impl(void *, UT_EntryKey_t, const UT_StubContext_t *); +/* + * ---------------------------------------------------- + * Generated stub function for OS_FileAllocate_Impl() + * ---------------------------------------------------- + */ +int32 OS_FileAllocate_Impl(const OS_object_token_t *token, osal_offset_t offset, osal_offset_t len) +{ + UT_GenStub_SetupReturnBuffer(OS_FileAllocate_Impl, int32); + + UT_GenStub_AddParam(OS_FileAllocate_Impl, const OS_object_token_t *, token); + UT_GenStub_AddParam(OS_FileAllocate_Impl, osal_offset_t, offset); + UT_GenStub_AddParam(OS_FileAllocate_Impl, osal_offset_t, len); + + UT_GenStub_Execute(OS_FileAllocate_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_FileAllocate_Impl, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_FileChmod_Impl() @@ -114,6 +132,23 @@ int32 OS_FileStat_Impl(const char *local_path, os_fstat_t *filestat) return UT_GenStub_GetReturnValue(OS_FileStat_Impl, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_FileTruncate_Impl() + * ---------------------------------------------------- + */ +int32 OS_FileTruncate_Impl(const OS_object_token_t *token, osal_offset_t len) +{ + UT_GenStub_SetupReturnBuffer(OS_FileTruncate_Impl, int32); + + UT_GenStub_AddParam(OS_FileTruncate_Impl, const OS_object_token_t *, token); + UT_GenStub_AddParam(OS_FileTruncate_Impl, osal_offset_t, len); + + UT_GenStub_Execute(OS_FileTruncate_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_FileTruncate_Impl, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_GenericClose_Impl() @@ -154,12 +189,12 @@ int32 OS_GenericRead_Impl(const OS_object_token_t *token, void *buffer, size_t n * Generated stub function for OS_GenericSeek_Impl() * ---------------------------------------------------- */ -int32 OS_GenericSeek_Impl(const OS_object_token_t *token, int32 offset, uint32 whence) +int32 OS_GenericSeek_Impl(const OS_object_token_t *token, osal_offset_t offset, uint32 whence) { UT_GenStub_SetupReturnBuffer(OS_GenericSeek_Impl, int32); UT_GenStub_AddParam(OS_GenericSeek_Impl, const OS_object_token_t *, token); - UT_GenStub_AddParam(OS_GenericSeek_Impl, int32, offset); + UT_GenStub_AddParam(OS_GenericSeek_Impl, osal_offset_t, offset); UT_GenStub_AddParam(OS_GenericSeek_Impl, uint32, whence); UT_GenStub_Execute(OS_GenericSeek_Impl, Basic, NULL); diff --git a/src/unit-test-coverage/ut-stubs/src/os-shared-rwlock-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/os-shared-rwlock-impl-stubs.c new file mode 100644 index 000000000..856731810 --- /dev/null +++ b/src/unit-test-coverage/ut-stubs/src/os-shared-rwlock-impl-stubs.c @@ -0,0 +1,140 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * @file + * + * Auto-Generated stub implementations for functions defined in os-shared-rwlock header + */ + +#include "os-shared-rwlock.h" +#include "utgenstub.h" + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockCreate_Impl() + * ---------------------------------------------------- + */ +int32 OS_RwLockCreate_Impl(const OS_object_token_t *token, uint32 options) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockCreate_Impl, int32); + + UT_GenStub_AddParam(OS_RwLockCreate_Impl, const OS_object_token_t *, token); + UT_GenStub_AddParam(OS_RwLockCreate_Impl, uint32, options); + + UT_GenStub_Execute(OS_RwLockCreate_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockCreate_Impl, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockDelete_Impl() + * ---------------------------------------------------- + */ +int32 OS_RwLockDelete_Impl(const OS_object_token_t *token) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockDelete_Impl, int32); + + UT_GenStub_AddParam(OS_RwLockDelete_Impl, const OS_object_token_t *, token); + + UT_GenStub_Execute(OS_RwLockDelete_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockDelete_Impl, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockGetInfo_Impl() + * ---------------------------------------------------- + */ +int32 OS_RwLockGetInfo_Impl(const OS_object_token_t *token, OS_rwlock_prop_t *rw_prop) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockGetInfo_Impl, int32); + + UT_GenStub_AddParam(OS_RwLockGetInfo_Impl, const OS_object_token_t *, token); + UT_GenStub_AddParam(OS_RwLockGetInfo_Impl, OS_rwlock_prop_t *, rw_prop); + + UT_GenStub_Execute(OS_RwLockGetInfo_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockGetInfo_Impl, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockReadGive_Impl() + * ---------------------------------------------------- + */ +int32 OS_RwLockReadGive_Impl(const OS_object_token_t *token) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockReadGive_Impl, int32); + + UT_GenStub_AddParam(OS_RwLockReadGive_Impl, const OS_object_token_t *, token); + + UT_GenStub_Execute(OS_RwLockReadGive_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockReadGive_Impl, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockReadTake_Impl() + * ---------------------------------------------------- + */ +int32 OS_RwLockReadTake_Impl(const OS_object_token_t *token) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockReadTake_Impl, int32); + + UT_GenStub_AddParam(OS_RwLockReadTake_Impl, const OS_object_token_t *, token); + + UT_GenStub_Execute(OS_RwLockReadTake_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockReadTake_Impl, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockWriteGive_Impl() + * ---------------------------------------------------- + */ +int32 OS_RwLockWriteGive_Impl(const OS_object_token_t *token) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockWriteGive_Impl, int32); + + UT_GenStub_AddParam(OS_RwLockWriteGive_Impl, const OS_object_token_t *, token); + + UT_GenStub_Execute(OS_RwLockWriteGive_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockWriteGive_Impl, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockWriteTake_Impl() + * ---------------------------------------------------- + */ +int32 OS_RwLockWriteTake_Impl(const OS_object_token_t *token) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockWriteTake_Impl, int32); + + UT_GenStub_AddParam(OS_RwLockWriteTake_Impl, const OS_object_token_t *, token); + + UT_GenStub_Execute(OS_RwLockWriteTake_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockWriteTake_Impl, int32); +} diff --git a/src/unit-test-coverage/ut-stubs/src/os-shared-rwlock-init-stubs.c b/src/unit-test-coverage/ut-stubs/src/os-shared-rwlock-init-stubs.c new file mode 100644 index 000000000..fcbe827c6 --- /dev/null +++ b/src/unit-test-coverage/ut-stubs/src/os-shared-rwlock-init-stubs.c @@ -0,0 +1,40 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * @file + * + * Auto-Generated stub implementations for functions defined in os-shared-rwlock header + */ + +#include "os-shared-rwlock.h" +#include "utgenstub.h" + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockAPI_Init() + * ---------------------------------------------------- + */ +int32 OS_RwLockAPI_Init(void) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockAPI_Init, int32); + + UT_GenStub_Execute(OS_RwLockAPI_Init, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockAPI_Init, int32); +} diff --git a/src/unit-test-coverage/ut-stubs/src/os-shared-sockets-impl-stubs.c b/src/unit-test-coverage/ut-stubs/src/os-shared-sockets-impl-stubs.c index 5e258b095..7c4858d95 100644 --- a/src/unit-test-coverage/ut-stubs/src/os-shared-sockets-impl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/os-shared-sockets-impl-stubs.c @@ -197,6 +197,24 @@ int32 OS_SocketGetInfo_Impl(const OS_object_token_t *token, OS_socket_prop_t *so return UT_GenStub_GetReturnValue(OS_SocketGetInfo_Impl, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_SocketGetOption_Impl() + * ---------------------------------------------------- + */ +int32 OS_SocketGetOption_Impl(const OS_object_token_t *token, OS_socket_option_t opt_id, OS_socket_optval_t *optval) +{ + UT_GenStub_SetupReturnBuffer(OS_SocketGetOption_Impl, int32); + + UT_GenStub_AddParam(OS_SocketGetOption_Impl, const OS_object_token_t *, token); + UT_GenStub_AddParam(OS_SocketGetOption_Impl, OS_socket_option_t, opt_id); + UT_GenStub_AddParam(OS_SocketGetOption_Impl, OS_socket_optval_t *, optval); + + UT_GenStub_Execute(OS_SocketGetOption_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_SocketGetOption_Impl, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_SocketListen_Impl() @@ -270,6 +288,25 @@ int32 OS_SocketSendTo_Impl(const OS_object_token_t *token, const void *buffer, s return UT_GenStub_GetReturnValue(OS_SocketSendTo_Impl, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_SocketSetOption_Impl() + * ---------------------------------------------------- + */ +int32 OS_SocketSetOption_Impl(const OS_object_token_t *token, OS_socket_option_t opt_id, + const OS_socket_optval_t *optval) +{ + UT_GenStub_SetupReturnBuffer(OS_SocketSetOption_Impl, int32); + + UT_GenStub_AddParam(OS_SocketSetOption_Impl, const OS_object_token_t *, token); + UT_GenStub_AddParam(OS_SocketSetOption_Impl, OS_socket_option_t, opt_id); + UT_GenStub_AddParam(OS_SocketSetOption_Impl, const OS_socket_optval_t *, optval); + + UT_GenStub_Execute(OS_SocketSetOption_Impl, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_SocketSetOption_Impl, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_SocketShutdown_Impl() diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-shared-idmap-table-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-shared-idmap-table-stubs.c index 42b2f26aa..04c778597 100644 --- a/src/unit-test-coverage/ut-stubs/src/osapi-shared-idmap-table-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/osapi-shared-idmap-table-stubs.c @@ -41,6 +41,7 @@ OS_common_record_t OS_stub_timecb_table[OS_MAX_TIMERS]; OS_common_record_t OS_stub_stream_table[OS_MAX_NUM_OPEN_FILES]; OS_common_record_t OS_stub_dir_table[OS_MAX_NUM_OPEN_DIRS]; OS_common_record_t OS_stub_condvar_table[OS_MAX_CONDVARS]; +OS_common_record_t OS_stub_rwlock_table[OS_MAX_RWLOCKS]; OS_common_record_t *const OS_global_task_table = OS_stub_task_table; OS_common_record_t *const OS_global_queue_table = OS_stub_queue_table; @@ -55,3 +56,4 @@ OS_common_record_t *const OS_global_module_table = OS_stub_module_table; OS_common_record_t *const OS_global_filesys_table = OS_stub_filesys_table; OS_common_record_t *const OS_global_console_table = OS_stub_console_table; OS_common_record_t *const OS_global_condvar_table = OS_stub_condvar_table; +OS_common_record_t *const OS_global_rwlock_table = OS_stub_rwlock_table; diff --git a/src/unit-test-coverage/ut-stubs/src/osapi-shared-rwlock-table-stubs.c b/src/unit-test-coverage/ut-stubs/src/osapi-shared-rwlock-table-stubs.c new file mode 100644 index 000000000..6e4f5946e --- /dev/null +++ b/src/unit-test-coverage/ut-stubs/src/osapi-shared-rwlock-table-stubs.c @@ -0,0 +1,32 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * \ingroup ut-stubs + * \author joseph.p.hickey@nasa.gov + * + */ + +#include +#include +#include "utstubs.h" + +#include "os-shared-rwlock.h" + +OS_rwlock_internal_record_t OS_rwlock_table[OS_MAX_RWLOCKS]; diff --git a/src/unit-test-coverage/ut-stubs/src/posix-fcntl-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-fcntl-stubs.c index 433be792e..886721865 100644 --- a/src/unit-test-coverage/ut-stubs/src/posix-fcntl-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/posix-fcntl-stubs.c @@ -40,3 +40,21 @@ int OCS_open(const char *file, int oflag, ...) return Status; } + +int OCS_posix_fallocate(int fd, OCS_off_t offset, OCS_off_t len) +{ + int32 Status; + + Status = UT_DEFAULT_IMPL(OCS_posix_fallocate); + + return Status; +} + +int OCS_ftruncate(int fd, OCS_off_t len) +{ + int32 Status; + + Status = UT_DEFAULT_IMPL(OCS_ftruncate); + + return Status; +} diff --git a/src/unit-test-coverage/ut-stubs/src/posix-mqueue-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-mqueue-stubs.c index e85f9bc7e..dbe8d14ed 100644 --- a/src/unit-test-coverage/ut-stubs/src/posix-mqueue-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/posix-mqueue-stubs.c @@ -18,7 +18,6 @@ /* OSAL coverage stub replacement for mqueue.h */ #include -#include #include "utstubs.h" #include "OCS_mqueue.h" diff --git a/src/unit-test-coverage/ut-stubs/src/posix-netdb-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-netdb-stubs.c new file mode 100644 index 000000000..28e711d2d --- /dev/null +++ b/src/unit-test-coverage/ut-stubs/src/posix-netdb-stubs.c @@ -0,0 +1,76 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/* OSAL coverage stub replacement for netdb.h */ +#include +#include "utstubs.h" + +#include "OCS_netdb.h" + +/* ----------------------------------------- */ +/* prototypes normally declared in netdb.h */ +/* ----------------------------------------- */ +int OCS_getnameinfo(const struct OCS_sockaddr *addr, OCS_socklen_t addrlen, char *host, OCS_socklen_t hostlen, + char *serv, OCS_socklen_t servlen, int flags) +{ + int32 Status; + + Status = UT_DEFAULT_IMPL(OCS_getnameinfo); + + if (hostlen > 0) + { + memset(host, 0, hostlen); + UT_Stub_CopyToLocal(UT_KEY(OCS_getaddrinfo), host, hostlen - 1); + } + + if (servlen > 0) + { + memset(serv, 0, servlen); + } + + return Status; +} + +int OCS_getaddrinfo(const char *node, const char *service, const struct OCS_addrinfo *hints, struct OCS_addrinfo **res) +{ + static struct OCS_addrinfo DEFAULT_RESULT; + int32 Status; + + Status = UT_DEFAULT_IMPL(OCS_getaddrinfo); + + if (Status == 0) + { + /* this needs to output a value */ + if (UT_Stub_CopyToLocal(UT_KEY(OCS_getaddrinfo), res, sizeof(*res)) < sizeof(*res)) + { + memset(&DEFAULT_RESULT, 0, sizeof(DEFAULT_RESULT)); + *res = &DEFAULT_RESULT; + } + } + else + { + *res = NULL; + } + + return Status; +} + +void OCS_freeaddrinfo(struct OCS_addrinfo *res) +{ + UT_DEFAULT_IMPL(OCS_freeaddrinfo); +} diff --git a/src/unit-test-coverage/ut-stubs/src/posix-pthread-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-pthread-stubs.c index 136b5dcd9..7b9793dd4 100644 --- a/src/unit-test-coverage/ut-stubs/src/posix-pthread-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/posix-pthread-stubs.c @@ -18,7 +18,6 @@ /* OSAL coverage stub replacement for pthread.h */ #include -#include #include "utstubs.h" #include "OCS_pthread.h" diff --git a/src/unit-test-coverage/ut-stubs/src/posix-semaphore-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-semaphore-stubs.c index 6adf9b9f9..087a87182 100644 --- a/src/unit-test-coverage/ut-stubs/src/posix-semaphore-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/posix-semaphore-stubs.c @@ -18,7 +18,6 @@ /* OSAL coverage stub replacement for semaphore.h */ #include -#include #include "utstubs.h" #include "OCS_semaphore.h" diff --git a/src/unit-test-coverage/ut-stubs/src/posix-signal-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-signal-stubs.c index 6f8ee74e5..3294f1154 100644 --- a/src/unit-test-coverage/ut-stubs/src/posix-signal-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/posix-signal-stubs.c @@ -18,7 +18,6 @@ /* OSAL coverage stub replacement for signal.h */ #include -#include #include "utstubs.h" #include "OCS_signal.h" diff --git a/src/unit-test-coverage/ut-stubs/src/posix-stat-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-stat-stubs.c index aadc1e957..da433302a 100644 --- a/src/unit-test-coverage/ut-stubs/src/posix-stat-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/posix-stat-stubs.c @@ -18,7 +18,6 @@ /* OSAL coverage stub replacement for functions in sys/stat.h */ #include -#include #include "utstubs.h" #include "OCS_stat.h" diff --git a/src/unit-test-coverage/ut-stubs/src/posix-time-stubs.c b/src/unit-test-coverage/ut-stubs/src/posix-time-stubs.c index c76e4b6b7..4070ba598 100644 --- a/src/unit-test-coverage/ut-stubs/src/posix-time-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/posix-time-stubs.c @@ -18,7 +18,6 @@ /* OSAL coverage stub replacement for time.h */ #include -#include #include "utstubs.h" #include "OCS_time.h" diff --git a/src/unit-test-coverage/ut-stubs/src/sys-select-stubs.c b/src/unit-test-coverage/ut-stubs/src/sys-select-stubs.c index ffa873b43..6af1ac943 100644 --- a/src/unit-test-coverage/ut-stubs/src/sys-select-stubs.c +++ b/src/unit-test-coverage/ut-stubs/src/sys-select-stubs.c @@ -25,7 +25,6 @@ /* OSAL coverage stub replacement for functions in sys/stat.h */ #include -#include #include "utstubs.h" #include "OCS_sys_select.h" diff --git a/src/unit-test-coverage/vxworks/CMakeLists.txt b/src/unit-test-coverage/vxworks/CMakeLists.txt index d60402652..bdb2e5d6a 100644 --- a/src/unit-test-coverage/vxworks/CMakeLists.txt +++ b/src/unit-test-coverage/vxworks/CMakeLists.txt @@ -25,18 +25,23 @@ set(VXWORKS_PORTABLE_BLOCK_LIST posix-gettime posix-io posix-files + posix-file-allocate posix-dirs console-bsp bsd-select bsd-sockets + bsd-sockets-dns + bsd-sockets-no-dns no-loader no-shell no-symtab - no-network + no-network-gethostname + no-network-gethostid no-sockets no-condvar + no-file-allocate ) @@ -83,3 +88,9 @@ endforeach(MODNAME ${VXWORKS_PORTABLE_BLOCK_LIST}) # Custom flags for specific tests to be able to cover all code set_property(SOURCE ${OSAL_SOURCE_DIR}/src/os/portable/os-impl-bsd-sockets.c APPEND PROPERTY COMPILE_DEFINITIONS OS_NETWORK_SUPPORTS_IPV6) + +set_property(SOURCE ${OSAL_SOURCE_DIR}/src/os/portable/os-impl-bsd-sockets-no-dns.c + APPEND PROPERTY COMPILE_DEFINITIONS OS_NETWORK_SUPPORTS_IPV6) + +set_property(SOURCE ${OSAL_SOURCE_DIR}/src/os/portable/os-impl-bsd-sockets-dns.c + APPEND PROPERTY COMPILE_DEFINITIONS OS_NETWORK_SUPPORTS_IPV6) diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-common.c b/src/unit-test-coverage/vxworks/src/coveragetest-common.c index e2a5f4c66..756448c1f 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-common.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-common.c @@ -58,7 +58,7 @@ void Test_OS_IdleLoop_Impl(void) { /* * Test Case For: - * void OS_IdleLoop_Impl() + * void OS_IdleLoop_Impl(void) */ /* just call the function for coverage */ OS_IdleLoop_Impl(); @@ -68,7 +68,7 @@ void Test_OS_ApplicationShutdown_Impl(void) { /* * Test Case For: - * void OS_ApplicationShutdown_Impl() + * void OS_ApplicationShutdown_Impl(void) */ /* just call the function for coverage */ OS_ApplicationShutdown_Impl(); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c index 4da5f8c43..366eb7c14 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-symtab.c @@ -71,16 +71,16 @@ void Test_OS_SymTableIterator_Impl(void) OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), true); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_GetIteratorStatus(), OS_SUCCESS); - /* Check case where next entry will exceed size limit */ - OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 101), false); - OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_GetIteratorStatus(), OS_ERR_OUTPUT_TOO_LARGE); - /* Check case where entry has a name that is too long */ UT_SetDefaultReturnValue(UT_KEY(OCS_memchr), OS_ERROR); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), true); - OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_GetIteratorStatus(), OS_ERR_NAME_TOO_LONG); + OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_GetIteratorStatus(), OS_SUCCESS); UT_ClearDefaultReturnValue(UT_KEY(OCS_memchr)); + /* Check case where next entry will exceed size limit */ + OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 101), false); + OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_GetIteratorStatus(), OS_ERR_OUTPUT_TOO_LARGE); + /* Check case where writing to file fails */ UT_SetDefaultReturnValue(UT_KEY(OCS_write), -1); OSAPI_TEST_FUNCTION_RC(UT_SymTabTest_CallIteratorFunc("ut", &Data, 100, 1000), false); diff --git a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c index 88b3baa54..780ed6807 100644 --- a/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c +++ b/src/unit-test-coverage/vxworks/src/coveragetest-tasks.c @@ -153,7 +153,7 @@ void Test_OS_TaskExit_Impl(void) { /* * Test Case For: - * void OS_TaskExit_Impl() + * void OS_TaskExit_Impl(void) */ /* just call the function for coverage */ OS_TaskExit_Impl(); diff --git a/src/unit-tests/README.md b/src/unit-tests/README.md index 53b490ff0..8973f8a21 100644 --- a/src/unit-tests/README.md +++ b/src/unit-tests/README.md @@ -20,7 +20,7 @@ Use the following structure for your unit test cases: ** OS_SEM_FAILURE if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_somethingcreate() +void UT_os_somethingcreate(void) { int i; char name[UT_OS_NAME_BUFF_SIZE]; diff --git a/src/unit-tests/oscore-test/ut_oscore_binsem_test.c b/src/unit-tests/oscore-test/ut_oscore_binsem_test.c index e40f41dcb..d5a621e87 100644 --- a/src/unit-tests/oscore-test/ut_oscore_binsem_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_binsem_test.c @@ -63,7 +63,7 @@ ** OS_SEM_FAILURE if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_bin_sem_create_test() +void UT_os_bin_sem_create_test(void) { int i; char sem_name[UT_OS_NAME_BUFF_SIZE]; @@ -128,7 +128,7 @@ void UT_os_bin_sem_create_test() ** OS_SEM_FAILURE if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_bin_sem_delete_test() +void UT_os_bin_sem_delete_test(void) { osal_id_t bin_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -152,7 +152,7 @@ void UT_os_bin_sem_delete_test() ** array of semaphores defined by the system ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_bin_sem_flush_test() +void UT_os_bin_sem_flush_test(void) { osal_id_t bin_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -177,7 +177,7 @@ void UT_os_bin_sem_flush_test() ** array of semaphores defined by the system ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_bin_sem_give_test() +void UT_os_bin_sem_give_test(void) { osal_id_t bin_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -203,7 +203,7 @@ void UT_os_bin_sem_give_test() ** OS_SEM_FAILURE if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_bin_sem_take_test() +void UT_os_bin_sem_take_test(void) { osal_id_t bin_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -228,7 +228,7 @@ void UT_os_bin_sem_take_test() ** OS_SEM_TIMEOUT if the semaphore was not relinquished in time ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_bin_sem_timed_wait_test() +void UT_os_bin_sem_timed_wait_test(void) { osal_id_t bin_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -261,7 +261,7 @@ void UT_os_bin_sem_timed_wait_test() ** semaphore table ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_bin_sem_get_id_by_name_test() +void UT_os_bin_sem_get_id_by_name_test(void) { osal_id_t bin_sem_id = OS_OBJECT_ID_UNDEFINED; char long_sem_name[UT_OS_NAME_BUFF_SIZE]; diff --git a/src/unit-tests/oscore-test/ut_oscore_countsem_test.c b/src/unit-tests/oscore-test/ut_oscore_countsem_test.c index 8d9f8df4f..3f8c8bcfa 100644 --- a/src/unit-tests/oscore-test/ut_oscore_countsem_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_countsem_test.c @@ -63,7 +63,7 @@ ** OS_SEM_FAILURE if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_count_sem_create_test() +void UT_os_count_sem_create_test(void) { int i; osal_id_t count_sem_ids[OS_MAX_COUNT_SEMAPHORES + 1]; @@ -157,7 +157,7 @@ void UT_os_count_sem_create_test() ** OS_SEM_FAILURE if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_count_sem_delete_test() +void UT_os_count_sem_delete_test(void) { osal_id_t count_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -186,7 +186,7 @@ void UT_os_count_sem_delete_test() ** array of semaphores defined by the system ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_count_sem_give_test() +void UT_os_count_sem_give_test(void) { osal_id_t count_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -217,7 +217,7 @@ void UT_os_count_sem_give_test() ** OS_SEM_FAILURE if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_count_sem_take_test() +void UT_os_count_sem_take_test(void) { osal_id_t count_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -247,7 +247,7 @@ void UT_os_count_sem_take_test() ** OS_SEM_TIMEOUT if the semaphore was not relinquished in time ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_count_sem_timed_wait_test() +void UT_os_count_sem_timed_wait_test(void) { osal_id_t count_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -291,7 +291,7 @@ void UT_os_count_sem_timed_wait_test() ** semaphore table ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_count_sem_get_id_by_name_test() +void UT_os_count_sem_get_id_by_name_test(void) { osal_id_t count_sem_id = OS_OBJECT_ID_UNDEFINED; char long_sem_name[UT_OS_NAME_BUFF_SIZE]; diff --git a/src/unit-tests/oscore-test/ut_oscore_misc_test.c b/src/unit-tests/oscore-test/ut_oscore_misc_test.c index 00ebc160e..72f2d9ce8 100644 --- a/src/unit-tests/oscore-test/ut_oscore_misc_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_misc_test.c @@ -84,7 +84,7 @@ ** 4) Expect the returned value from those routines to be ** (a) OS_SUCCESS *--------------------------------------------------------------------------------*/ -void UT_os_apiinit_test() +void UT_os_apiinit_test(void) { osal_id_t qId = OS_OBJECT_ID_UNDEFINED; osal_blockcount_t qDepth = OSAL_BLOCKCOUNT_C(10); @@ -135,7 +135,7 @@ int32 UT_os_eventhandler(OS_Event_t event, osal_id_t object_id, void *data) return OS_SUCCESS; } -void UT_os_registereventhandler_test() +void UT_os_registereventhandler_test(void) { /*-----------------------------------------------------*/ /* #1 Null-pointer-arg */ @@ -158,10 +158,10 @@ void UT_os_registereventhandler_test() ** 2) Call this routine to print a text string. ** 3) Visually observe that the text string in #2 did get print. **--------------------------------------------------------------------------------*/ -void UT_os_printf_test() +void UT_os_printf_test(void) { OS_printf_enable(); - UT_MIR_VOID(OS_printf("OS_printf() - #1 Nominal [This is the expected stdout output after API call]\n")); + UT_MIR_VOID(OS_printf("OS_printf() - #1 Nominal [Seeing this text in stdout constitutes a pass for this MIR]\n")); } /*--------------------------------------------------------------------------------* @@ -176,12 +176,12 @@ void UT_os_printf_test() ** 4) Call OS_printf to print a text string that's different than #2 ** 5) Visually observe that text string in #2 did not print, but text string in #4 did. **--------------------------------------------------------------------------------*/ -void UT_os_printfenable_test() +void UT_os_printfenable_test(void) { OS_printf_disable(); OS_printf_enable(); - UT_MIR_VOID(OS_printf("OS_printf_enable() - #1 Nominal [This is the expected stdout output after API call]\n")); + UT_MIR_VOID(OS_printf("OS_printf_enable() - #1 Nominal [Seeing this text in stdout constitutes a pass for this MIR]\n")); } /*--------------------------------------------------------------------------------* @@ -196,18 +196,18 @@ void UT_os_printfenable_test() ** 4) Call OS_printf() to print a text string that's different than #2 ** 5) Visually observe that text string in #2 did get print, but text string in #4 did not. **--------------------------------------------------------------------------------*/ -void UT_os_printfdisable_test() +void UT_os_printfdisable_test(void) { OS_printf_enable(); - UT_MIR_VOID(OS_printf("OS_printf_disable() - #1 Nominal [This is the expected stdout output before API call]\n")); + UT_MIR_VOID(OS_printf("OS_printf_disable() - #1 Nominal [Seeing this text in stdout constitutes a pass for this MIR]\n")); OS_printf_disable(); UT_MIR_VOID( - OS_printf("OS_printf_disable() - #1 Nominal [This is NOT the expected stdout output after API call]\n")); + OS_printf("OS_printf_disable() - #1 Nominal [Seeing this text in stdout constitutes a failure for this MIR]\n")); /* Reset test environment */ OS_printf_enable(); - UT_MIR_VOID(OS_printf("OS_printf_disable() - #1 Nominal [This is the expected stdout output after test reset]\n")); + UT_MIR_VOID(OS_printf("OS_printf_disable() - #1 Nominal [Seeing this text in stdout constitutes a pass for this MIR]\n")); } /*--------------------------------------------------------------------------------* @@ -241,10 +241,12 @@ void UT_os_printfdisable_test() ** 2) Expect the returned value to be ** (a) OS_SUCCESS (although results are not directly observable) **--------------------------------------------------------------------------------*/ -void UT_os_getlocaltime_test() +void UT_os_getlocaltime_test(void) { - OS_time_t time_struct; - int32 i = 0; + OS_time_t time_struct[10]; + int32 i = 0; + int64 microsecs[10]; + int32 total_sec_inc = 0; memset(&time_struct, 0, sizeof(time_struct)); @@ -262,18 +264,33 @@ void UT_os_getlocaltime_test() /*-----------------------------------------------------*/ /* #3 Nominal */ - for (i = 0; i < 5; i++) { - UT_NOMINAL(OS_GetLocalTime(&time_struct)); + UT_NOMINAL(OS_GetLocalTime(&time_struct[i])); + UtPrintf("[Expecting output after API call to increase over time: %ld.%ld]\n", - (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); + (long)OS_TimeGetTotalSeconds(time_struct[i]), (long)OS_TimeGetMicrosecondsPart(time_struct[i])); + microsecs[i] = OS_TimeGetMicrosecondsPart(time_struct[i]); + + if ( i != 0 ) + { + total_sec_inc = OS_TimeGetTotalSeconds(time_struct[i]) - OS_TimeGetTotalSeconds(time_struct[i-1]); + } + + if (i != 0 && total_sec_inc <= 0) + { + if(total_sec_inc < 0) + { + UtAssert_Failed("UT_os_setlocaltime_test failure: Time not increasing"); + } + else if (microsecs[i] <= microsecs[i-1]) + { + UtAssert_Failed("UT_os_setlocaltime_test failure: Time not increasing"); + } + } OS_TaskDelay(20); } - - /* #3 Nominal - Manual inspection required */ - UT_MIR_STATUS(OS_GetLocalTime(&time_struct)); } /*--------------------------------------------------------------------------------* @@ -307,10 +324,13 @@ void UT_os_getlocaltime_test() ** - Expect the returned value to be ** (a) OS_SUCCESS **--------------------------------------------------------------------------------*/ -void UT_os_setlocaltime_test() +void UT_os_setlocaltime_test(void) { - OS_time_t time_struct; - int32 i = 0; + OS_time_t time_struct[10]; + int32 i = 0; + int64 microsecs[10]; + int32 total_sec_inc; + int32 status; memset(&time_struct, 0, sizeof(time_struct)); @@ -332,34 +352,55 @@ void UT_os_setlocaltime_test() for (i = 0; i < 5; i++) { - UT_NOMINAL(OS_GetLocalTime(&time_struct)); + UT_NOMINAL(OS_GetLocalTime(&time_struct[i])); UtPrintf("[Expecting output before API call to increase over time: %ld.%ld]\n", - (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); + (long)OS_TimeGetTotalSeconds(time_struct[i]), (long)OS_TimeGetMicrosecondsPart(time_struct[i])); OS_TaskDelay(20); } - time_struct = OS_TimeAssembleFromNanoseconds(20000, 123000); + time_struct[0] = OS_TimeAssembleFromNanoseconds(20000, 123000); /* * This case is MIR because on some systems this requires permission, * failure is expected if user does not have the required permission */ - if (UT_MIR_STATUS(OS_SetLocalTime(&time_struct))) + status = OS_SetLocalTime(&time_struct[0]); + if(status != OS_SUCCESS) + { + /* Generate MIR for tester to review */ + UT_MIR_STATUS(OS_SetLocalTime(&time_struct[0])); + UtPrintf("Failed OS_SetLocalTime(), Check to see if your system has the required premission.\n"); + } + else { UtPrintf("OS_SetLocalTime() - #3 Nominal [New time set at %ld.%ld]\n", - (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); + (long)OS_TimeGetTotalSeconds(time_struct[0]), (long)OS_TimeGetMicrosecondsPart(time_struct[0])); for (i = 0; i < 5; i++) { - UT_NOMINAL(OS_GetLocalTime(&time_struct)); - UtPrintf("[Expecting output before API call to increase over time: %ld.%ld]\n", - (long)OS_TimeGetTotalSeconds(time_struct), (long)OS_TimeGetMicrosecondsPart(time_struct)); - - OS_TaskDelay(20); + UT_NOMINAL(OS_GetLocalTime(&time_struct[i])); + + UtPrintf("[Expecting output after API call to increase over time: %ld.%ld]\n", + (long)OS_TimeGetTotalSeconds(time_struct[i]), (long)OS_TimeGetMicrosecondsPart(time_struct[i])); + + microsecs[i] = OS_TimeGetMicrosecondsPart(time_struct[i]); + + total_sec_inc = OS_TimeGetTotalSeconds(time_struct[i]) - OS_TimeGetTotalSeconds(time_struct[i-1]); + + if (i != 0 && total_sec_inc <= 0) + { + if(total_sec_inc < 0) + { + UtAssert_Failed("UT_os_setlocaltime_test failure: Time not increasing"); + } + else if (microsecs[i] <= microsecs[i-1]) + { + UtAssert_Failed("UT_os_setlocaltime_test failure: Time not increasing"); + } + } + OS_TaskDelay(20); } - - UT_MIR_STATUS(OS_GetLocalTime(&time_struct)); } } diff --git a/src/unit-tests/oscore-test/ut_oscore_mutex_test.c b/src/unit-tests/oscore-test/ut_oscore_mutex_test.c index 62ebd5207..5f2f64c07 100644 --- a/src/unit-tests/oscore-test/ut_oscore_mutex_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_mutex_test.c @@ -63,7 +63,7 @@ ** OS_SEM_FAILURE if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_mut_sem_create_test() +void UT_os_mut_sem_create_test(void) { int i; osal_id_t mut_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -139,7 +139,7 @@ void UT_os_mut_sem_create_test() ** OS_SEM_FAILURE if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_mut_sem_delete_test() +void UT_os_mut_sem_delete_test(void) { osal_id_t mut_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -167,7 +167,7 @@ void UT_os_mut_sem_delete_test() ** array of semaphores defined by the system ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_mut_sem_give_test() +void UT_os_mut_sem_give_test(void) { osal_id_t mut_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -200,7 +200,7 @@ void UT_os_mut_sem_give_test() ** array of semaphores defined by the system ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_mut_sem_take_test() +void UT_os_mut_sem_take_test(void) { osal_id_t mut_sem_id = OS_OBJECT_ID_UNDEFINED; @@ -231,7 +231,7 @@ void UT_os_mut_sem_take_test() ** OS_ERR_NAME_NOT_FOUND if the name was not found in the mutex semaphore table ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_mut_sem_get_id_by_name_test() +void UT_os_mut_sem_get_id_by_name_test(void) { osal_id_t mut_sem_id = OS_OBJECT_ID_UNDEFINED; char long_sem_name[UT_OS_NAME_BUFF_SIZE]; @@ -276,7 +276,7 @@ void UT_os_mut_sem_get_id_by_name_test() ** OS_ERR_INVALID_ID if the id passed in is not a valid binary semaphore id ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_mut_sem_get_info_test() +void UT_os_mut_sem_get_info_test(void) { osal_id_t mut_sem_id = OS_OBJECT_ID_UNDEFINED; OS_mut_sem_prop_t mut_sem_prop; diff --git a/src/unit-tests/oscore-test/ut_oscore_queue_test.c b/src/unit-tests/oscore-test/ut_oscore_queue_test.c index 0d858dc66..1ac72c82e 100644 --- a/src/unit-tests/oscore-test/ut_oscore_queue_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_queue_test.c @@ -67,7 +67,7 @@ ** OS_ERROR if the OS create call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_queue_create_test() +void UT_os_queue_create_test(void) { int i = 0; osal_id_t queue_id = OS_OBJECT_ID_UNDEFINED; @@ -151,7 +151,7 @@ void UT_os_queue_create_test() ** OS_ERROR if the OS call to delete the queue failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_queue_delete_test() +void UT_os_queue_delete_test(void) { osal_id_t queue_id = OS_OBJECT_ID_UNDEFINED; @@ -181,7 +181,7 @@ void UT_os_queue_delete_test() ** OS_QUEUE_INVALID_SIZE if the size copied from the queue is incorrect ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_queue_get_test() +void UT_os_queue_get_test(void) { osal_id_t queue_id = OS_OBJECT_ID_UNDEFINED; uint32 queue_data_out; @@ -296,7 +296,7 @@ void UT_os_queue_get_test() ** OS_ERROR if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_queue_put_test() +void UT_os_queue_put_test(void) { osal_id_t queue_id = OS_OBJECT_ID_UNDEFINED; uint32 queue_data_out = 0; @@ -362,7 +362,7 @@ void UT_os_queue_put_test() ** OS_ERR_NAME_NOT_FOUND if the name was not found in the queue table ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_queue_get_id_by_name_test() +void UT_os_queue_get_id_by_name_test(void) { osal_id_t queue_id = OS_OBJECT_ID_UNDEFINED; char long_queue_name[UT_OS_NAME_BUFF_SIZE]; @@ -408,7 +408,7 @@ void UT_os_queue_get_id_by_name_test() ** OS_ERR_INVALID_ID if the id passed in does not exist ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_queue_get_info_test() +void UT_os_queue_get_info_test(void) { osal_id_t queue_id = OS_OBJECT_ID_UNDEFINED; OS_queue_prop_t queue_prop; diff --git a/src/unit-tests/oscore-test/ut_oscore_task_test.c b/src/unit-tests/oscore-test/ut_oscore_task_test.c index 71f5369ce..9ab6b0248 100644 --- a/src/unit-tests/oscore-test/ut_oscore_task_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_task_test.c @@ -102,7 +102,7 @@ void generic_test_task(void) ** OS_ERROR if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_task_create_test() +void UT_os_task_create_test(void) { int32 i = 0; char task_name[UT_OS_NAME_BUFF_SIZE]; @@ -217,7 +217,7 @@ void UT_os_task_create_test() ** OS_ERROR if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_task_delete_test() +void UT_os_task_delete_test(void) { /*-----------------------------------------------------*/ /* #1 Invalid-ID-arg */ @@ -390,7 +390,7 @@ void UT_os_task_exit_test(void) ** Returns: OS_ERROR if sleep failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_task_delay_test() +void UT_os_task_delay_test(void) { OS_time_t before_time; OS_time_t after_time; @@ -434,7 +434,7 @@ void UT_os_task_delay_test() ** OS_ERROR if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_task_set_priority_test() +void UT_os_task_set_priority_test(void) { /*-----------------------------------------------------*/ /* #1 Invalid-ID-arg */ @@ -481,7 +481,7 @@ void getid_test_task(void) ** Parameters: To-be-filled-in ** Returns: Task id of the task that calls this routine **--------------------------------------------------------------------------------*/ -void UT_os_task_get_id_test() +void UT_os_task_get_id_test(void) { /* * Note this function does not return a normal status code, @@ -512,7 +512,7 @@ void UT_os_task_get_id_test() ** OS_ERR_NAME_NOT_FOUND if the name passed in is not in the task table ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_task_get_id_by_name_test() +void UT_os_task_get_id_by_name_test(void) { /*-----------------------------------------------------*/ /* #1 Invalid-pointer-arg-1 */ @@ -559,7 +559,7 @@ void UT_os_task_get_id_by_name_test() ** OS_ERR_INVALID_ID if the id passed in is not a valid task id ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_task_get_info_test() +void UT_os_task_get_info_test(void) { OS_task_prop_t task_prop; @@ -605,7 +605,7 @@ void UT_os_task_get_info_test() ** Syntax: OS_TaskFindIdBySystemData ** Purpose: Finds the abstract OSAL task ID from the system ID data **--------------------------------------------------------------------------------*/ -void UT_os_task_getid_by_sysdata_test() +void UT_os_task_getid_by_sysdata_test(void) { uint8 sysdata = 0; osal_id_t task_id; diff --git a/src/unit-tests/oscore-test/ut_oscore_test.c b/src/unit-tests/oscore-test/ut_oscore_test.c index 8fda28de3..b36d4b372 100644 --- a/src/unit-tests/oscore-test/ut_oscore_test.c +++ b/src/unit-tests/oscore-test/ut_oscore_test.c @@ -71,7 +71,7 @@ void UT_os_init_task_get_info_test(void); ** Local function definitions **--------------------------------------------------------------------------------*/ -void UT_os_init_task_misc() +void UT_os_init_task_misc(void) { memset(g_long_task_name, 'X', sizeof(g_long_task_name)); g_long_task_name[sizeof(g_long_task_name) - 1] = '\0'; @@ -79,7 +79,7 @@ void UT_os_init_task_misc() /*--------------------------------------------------------------------------------*/ -void UT_os_init_task_create_test() +void UT_os_init_task_create_test(void) { g_task_names[0] = "Create_NotImpl"; g_task_names[1] = "Create_NullPtr1"; @@ -95,7 +95,7 @@ void UT_os_init_task_create_test() /*--------------------------------------------------------------------------------*/ -void UT_os_init_task_delete_test() +void UT_os_init_task_delete_test(void) { g_task_names[0] = "Delete_NotImpl"; g_task_names[1] = "Delete_InvArg"; @@ -105,7 +105,7 @@ void UT_os_init_task_delete_test() /*--------------------------------------------------------------------------------*/ -void UT_os_setup_install_delete_handler_test() +void UT_os_setup_install_delete_handler_test(void) { g_task_names[0] = "DelHandler_NotImpl"; g_task_names[1] = "DelHandler_InvArg"; @@ -114,7 +114,7 @@ void UT_os_setup_install_delete_handler_test() /*--------------------------------------------------------------------------------*/ -void UT_os_init_task_exit_test() +void UT_os_init_task_exit_test(void) { g_task_names[0] = "Exit_NotImpl"; g_task_names[1] = "Exit_Nominal"; @@ -122,7 +122,7 @@ void UT_os_init_task_exit_test() /*--------------------------------------------------------------------------------*/ -void UT_os_init_task_delay_test() +void UT_os_init_task_delay_test(void) { g_task_names[0] = "Delay_NotImpl"; g_task_names[1] = "Delay_OsErr"; @@ -131,7 +131,7 @@ void UT_os_init_task_delay_test() /*--------------------------------------------------------------------------------*/ -void UT_os_init_task_set_priority_test() +void UT_os_init_task_set_priority_test(void) { g_task_names[0] = "SetPrio_NotImpl"; g_task_names[1] = "SetPrio_InvArg"; @@ -142,7 +142,7 @@ void UT_os_init_task_set_priority_test() /*--------------------------------------------------------------------------------*/ -void UT_os_init_task_register_test() +void UT_os_init_task_register_test(void) { g_task_names[0] = "Register_NotImpl"; g_task_names[1] = "Register_InvArg"; @@ -152,7 +152,7 @@ void UT_os_init_task_register_test() /*--------------------------------------------------------------------------------*/ -void UT_os_init_task_get_id_test() +void UT_os_init_task_get_id_test(void) { g_task_names[0] = "GetId_NotImpl"; g_task_names[1] = "GetId_Nominal"; @@ -160,7 +160,7 @@ void UT_os_init_task_get_id_test() /*--------------------------------------------------------------------------------*/ -void UT_os_init_task_get_id_by_name_test() +void UT_os_init_task_get_id_by_name_test(void) { g_task_names[0] = "GetIdByName_NotImpl"; g_task_names[1] = "GetIdByName_InvPtr1"; @@ -172,7 +172,7 @@ void UT_os_init_task_get_id_by_name_test() /*--------------------------------------------------------------------------------*/ -void UT_os_init_task_get_info_test() +void UT_os_init_task_get_info_test(void) { g_task_names[0] = "GetInfo_NotImpl"; g_task_names[1] = "GetInfo_InvId"; diff --git a/src/unit-tests/osfile-test/ut_osfile_dirio_test.c b/src/unit-tests/osfile-test/ut_osfile_dirio_test.c index 17c452a05..4aee500b2 100644 --- a/src/unit-tests/osfile-test/ut_osfile_dirio_test.c +++ b/src/unit-tests/osfile-test/ut_osfile_dirio_test.c @@ -122,7 +122,7 @@ void UT_os_read_n_sort_dirs(osal_id_t); ** 4) Expect the returned value to be ** (a) a file descriptor value greater than or equal to 0 **--------------------------------------------------------------------------------*/ -void UT_os_makedir_test() +void UT_os_makedir_test(void) { osal_id_t fileDesc = OS_OBJECT_ID_UNDEFINED; @@ -203,7 +203,7 @@ void UT_os_makedir_test() ** 4) Expect the returned value to be ** (a) a directory descriptor pointer that is __not__ NULL **--------------------------------------------------------------------------------*/ -void UT_os_opendir_test() +void UT_os_opendir_test(void) { osal_id_t dirh = OS_OBJECT_ID_UNDEFINED; @@ -276,7 +276,7 @@ void UT_os_opendir_test() ** 7) Call OS_DirectoryRead() with the directory descriptor pointer returned in #3 as argument ** 8) Expect to not get OS_SUCCESS (closed directory) **--------------------------------------------------------------------------------*/ -void UT_os_closedir_test() +void UT_os_closedir_test(void) { osal_id_t dirh = OS_OBJECT_ID_UNDEFINED; os_dirent_t dirEntry; @@ -345,7 +345,7 @@ void UT_os_closedir_test() ** (a) a directory entry pointer __and__ ** (b) the directory name to be ".." **--------------------------------------------------------------------------------*/ -void UT_os_readdir_test() +void UT_os_readdir_test(void) { osal_id_t dirh = OS_OBJECT_ID_UNDEFINED; os_dirent_t dirent; @@ -438,7 +438,7 @@ void UT_os_readdir_test() ** (a) a directory entry pointer __and__ ** (b) the directory name to be "." **--------------------------------------------------------------------------------*/ -void UT_os_rewinddir_test() +void UT_os_rewinddir_test(void) { osal_id_t dirh = OS_OBJECT_ID_UNDEFINED; @@ -541,7 +541,7 @@ void UT_os_rewinddir_test() ** 10) Expect the returned value to be ** (a) a file descriptor value less than 0 **--------------------------------------------------------------------------------*/ -void UT_os_removedir_test() +void UT_os_removedir_test(void) { osal_id_t fileDesc = OS_OBJECT_ID_UNDEFINED; diff --git a/src/unit-tests/osfile-test/ut_osfile_fileio_test.c b/src/unit-tests/osfile-test/ut_osfile_fileio_test.c index 9a8050228..8fc51767e 100644 --- a/src/unit-tests/osfile-test/ut_osfile_fileio_test.c +++ b/src/unit-tests/osfile-test/ut_osfile_fileio_test.c @@ -101,7 +101,7 @@ char g_writeBuff[UT_OS_IO_BUFF_SIZE]; ** 4) Expect the returned value from those routines to be ** (a) OS_SUCCESS *--------------------------------------------------------------------------------*/ -void UT_os_initfs_test() +void UT_os_initfs_test(void) { UT_NOMINAL(OS_API_Init()); } @@ -165,7 +165,7 @@ void UT_os_initfs_test() ** 6) Expect both returned values to be ** (a) OS_SUCCESS **--------------------------------------------------------------------------------*/ -void UT_os_createfile_test() +void UT_os_createfile_test(void) { int32 i = 0, j = 0; osal_id_t fd; @@ -302,7 +302,7 @@ void UT_os_createfile_test() ** 6) Expect both returned values to be ** (a) OS_SUCCESS **--------------------------------------------------------------------------------*/ -void UT_os_openfile_test() +void UT_os_openfile_test(void) { int32 i = 0, j = 0; osal_id_t fd; @@ -445,7 +445,7 @@ void UT_os_openfile_test() ** 6) Expect both returned value to be ** (a) OS_ERR_INVALID_ID **--------------------------------------------------------------------------------*/ -void UT_os_closefile_test() +void UT_os_closefile_test(void) { char tmpBuff[UT_OS_IO_BUFF_SIZE]; @@ -526,7 +526,7 @@ void UT_os_closefile_test() ** (a) the number of bytes read that is equal to the number of bytes written in #3 __and__ ** (b) the read buffer content is the same as the write buffer content in #3 **--------------------------------------------------------------------------------*/ -void UT_os_readfile_test() +void UT_os_readfile_test(void) { size_t expected_len; @@ -634,7 +634,7 @@ void UT_os_readfile_test() ** (a) the number of bytes read that is equal to the number of bytes written in #3 __and__ ** (b) the read buffer content is the same as the write buffer content in #3 **--------------------------------------------------------------------------------*/ -void UT_os_writefile_test() +void UT_os_writefile_test(void) { size_t expected_len; @@ -739,7 +739,7 @@ void UT_os_writefile_test() ** 6) Expect the returned value each time to be ** (a) the expected file position value given the arguments **--------------------------------------------------------------------------------*/ -void UT_os_lseekfile_test() +void UT_os_lseekfile_test(void) { size_t buffLen; int32 pos1 = 0, pos2 = 0, pos3 = 0; @@ -797,7 +797,7 @@ void UT_os_lseekfile_test() ** 2) If the returned value is OS_ERR_NOT_IMPLEMENTED, then exit test ** 3) Otherwise, continue **--------------------------------------------------------------------------------*/ -void UT_os_chmodfile_test() +void UT_os_chmodfile_test(void) { UT_RETVAL(OS_chmod(NULL, OS_READ_WRITE), OS_INVALID_POINTER); @@ -876,7 +876,7 @@ void UT_os_chmodfile_test() ** (a) OS_SUCCESS __and__ ** (b) fstats1 returned in #3 and fstats2 returned in #9 to be not equal **--------------------------------------------------------------------------------*/ -void UT_os_statfile_test() +void UT_os_statfile_test(void) { os_fstat_t fstats1; os_fstat_t fstats2; @@ -980,7 +980,7 @@ void UT_os_statfile_test() ** 6) Expect the returned values to be ** (a) OS_ERROR **--------------------------------------------------------------------------------*/ -void UT_os_removefile_test() +void UT_os_removefile_test(void) { os_fstat_t fstats; @@ -1077,7 +1077,7 @@ void UT_os_removefile_test() ** 6) Expect the returned values to be ** (a) OS_ERROR **--------------------------------------------------------------------------------*/ -void UT_os_renamefile_test() +void UT_os_renamefile_test(void) { os_fstat_t fstats; @@ -1192,7 +1192,7 @@ void UT_os_renamefile_test() ** 8) Expect the returned value to be ** (a) OS_SUCCESS **--------------------------------------------------------------------------------*/ -void UT_os_copyfile_test() +void UT_os_copyfile_test(void) { os_fstat_t fstats; @@ -1316,7 +1316,7 @@ void UT_os_copyfile_test() ** 10) Expect the returned value to be ** (a) not OS_SUCCESS **--------------------------------------------------------------------------------*/ -void UT_os_movefile_test() +void UT_os_movefile_test(void) { os_fstat_t fstats; @@ -1428,7 +1428,7 @@ void UT_os_movefile_test() ** (a) number of bytes greater than 0 __and__ ** (b) the read string is the same as the string returned from getevn("HOME") call **--------------------------------------------------------------------------------*/ -void UT_os_outputtofile_test() +void UT_os_outputtofile_test(void) { /*-----------------------------------------------------*/ /* #2 Invalid-file-desc-arg */ @@ -1521,7 +1521,7 @@ void UT_os_outputtofile_test() ** 8) Expect the returned value to be ** (a) OS_ERR_INVALID_ID **--------------------------------------------------------------------------------*/ -void UT_os_getfdinfo_test() +void UT_os_getfdinfo_test(void) { OS_file_prop_t fdProps; const char * fileName = "GetInfo_Nom.txt"; @@ -1594,7 +1594,7 @@ void UT_os_getfdinfo_test() ** 4) Expect the returned value to be ** (a) OS_SUCCESS **--------------------------------------------------------------------------------*/ -void UT_os_checkfileopen_test() +void UT_os_checkfileopen_test(void) { /*-----------------------------------------------------*/ /* #1 Null-pointer-arg */ @@ -1655,7 +1655,7 @@ void UT_os_checkfileopen_test() ** 6) Expect all returned values to be ** (a) OS_ERROR **--------------------------------------------------------------------------------*/ -void UT_os_closeallfiles_test() +void UT_os_closeallfiles_test(void) { /*-----------------------------------------------------*/ /* #2 Nominal */ @@ -1731,7 +1731,7 @@ void UT_os_closeallfiles_test() ** 6) Expect the returned value to be ** (a) OS_ERROR **--------------------------------------------------------------------------------*/ -void UT_os_closefilebyname_test() +void UT_os_closefilebyname_test(void) { /*-----------------------------------------------------*/ /* #1 Null-pointer-arg */ diff --git a/src/unit-tests/osfile-test/ut_osfile_test.c b/src/unit-tests/osfile-test/ut_osfile_test.c index d5231b780..0f19083ac 100644 --- a/src/unit-tests/osfile-test/ut_osfile_test.c +++ b/src/unit-tests/osfile-test/ut_osfile_test.c @@ -94,7 +94,7 @@ int32 UT_os_setup_fs() /*--------------------------------------------------------------------------------*/ -void UT_os_teardown_fs() +void UT_os_teardown_fs(void) { OS_unmount(g_mntName); OS_rmfs(g_devName); @@ -102,7 +102,7 @@ void UT_os_teardown_fs() /*--------------------------------------------------------------------------------*/ -void UT_os_init_file_misc() +void UT_os_init_file_misc(void) { memset(g_longPathName, 'Y', sizeof(g_longPathName)); g_longPathName[0] = '/'; diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c index 36106e888..50c8d3d3f 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_diskio_test.c @@ -121,7 +121,7 @@ extern char g_mntNames[UT_OS_FILESYS_LIST_LEN][UT_OS_FILE_BUFF_SIZE]; ** 5) Expect the returned value to be ** (a) OS_SUCCESS **--------------------------------------------------------------------------------*/ -void UT_os_initfs_test() +void UT_os_initfs_test(void) { int32 i = 0, j = 0; @@ -236,7 +236,7 @@ void UT_os_initfs_test() ** 5) Expect the returned value to be ** (a) OS_SUCCESS **--------------------------------------------------------------------------------*/ -void UT_os_makefs_test() +void UT_os_makefs_test(void) { int32 i = 0, j = 0; @@ -333,7 +333,7 @@ void UT_os_makefs_test() ** 6) Expect the returned value to be ** (a) OS_SUCCESS **--------------------------------------------------------------------------------*/ -void UT_os_removefs_test() +void UT_os_removefs_test(void) { /*-----------------------------------------------------*/ /* API not implemented */ @@ -409,7 +409,7 @@ void UT_os_removefs_test() ** 8) Expect the returned value to be ** (a) OS_SUCCESS **--------------------------------------------------------------------------------*/ -void UT_os_mount_test() +void UT_os_mount_test(void) { /*-----------------------------------------------------*/ /* API not implemented */ @@ -494,7 +494,7 @@ void UT_os_mount_test() ** 8) Expect the returned value to be ** (a) OS_ERR_NAME_NOT_FOUND **--------------------------------------------------------------------------------*/ -void UT_os_unmount_test() +void UT_os_unmount_test(void) { /*-----------------------------------------------------*/ /* API not implemented */ @@ -581,7 +581,7 @@ void UT_os_unmount_test() ** 6) Expect the returned value to be ** (a) OS_SUCCESS ** --------------------------------------------------------------------------------*/ -void UT_os_getphysdrivename_test() +void UT_os_getphysdrivename_test(void) { char physDevName[UT_OS_PHYS_NAME_BUFF_SIZE]; @@ -721,7 +721,7 @@ void UT_os_getfsinfo_test(void) ** (a) OS_SUCCESS __and__ ** (b) the returned local path to be ? ** --------------------------------------------------------------------------------*/ -void UT_os_translatepath_test() +void UT_os_translatepath_test(void) { char localPath[UT_OS_LOCAL_PATH_BUFF_SIZE]; char virtPath[OS_MAX_PATH_LEN]; @@ -807,7 +807,7 @@ void UT_os_translatepath_test() ** Test #4: Nominal condition ** 1) Currently only applicable to vxworks platform ** --------------------------------------------------------------------------------*/ -void UT_os_checkfs_test() +void UT_os_checkfs_test(void) { char driveName[UT_OS_PATH_BUFF_SIZE]; diff --git a/src/unit-tests/osfilesys-test/ut_osfilesys_test.c b/src/unit-tests/osfilesys-test/ut_osfilesys_test.c index 7921c40f8..5c586b8ac 100644 --- a/src/unit-tests/osfilesys-test/ut_osfilesys_test.c +++ b/src/unit-tests/osfilesys-test/ut_osfilesys_test.c @@ -69,7 +69,7 @@ void UT_os_init_fs_misc(void); ** Local function definitions **--------------------------------------------------------------------------------*/ -void UT_os_init_fs_misc() +void UT_os_init_fs_misc(void) { memset(g_fsLongName, 'X', sizeof(g_fsLongName)); g_fsLongName[0] = '/'; diff --git a/src/unit-tests/osloader-test/CMakeLists.txt b/src/unit-tests/osloader-test/CMakeLists.txt index dbaece6ac..9cb1dfc45 100644 --- a/src/unit-tests/osloader-test/CMakeLists.txt +++ b/src/unit-tests/osloader-test/CMakeLists.txt @@ -21,6 +21,6 @@ while(MOD GREATER 0) LIBRARY_OUTPUT_DIRECTORY utmod) add_dependencies(osal_loader_UT MODULE${MOD}) foreach(TGT ${INSTALL_TARGET_LIST}) - install(TARGETS MODULE${MOD} DESTINATION ${TGT}/${UT_INSTALL_SUBDIR}/utmod) + install(TARGETS MODULE${MOD} DESTINATION ${TGT}/utmod) endforeach() endwhile(MOD GREATER 0) diff --git a/src/unit-tests/osloader-test/ut_osloader_module_test.c b/src/unit-tests/osloader-test/ut_osloader_module_test.c index 99863af52..c8cfb8150 100644 --- a/src/unit-tests/osloader-test/ut_osloader_module_test.c +++ b/src/unit-tests/osloader-test/ut_osloader_module_test.c @@ -63,7 +63,7 @@ ** OS_ERROR if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_module_load_test() +void UT_os_module_load_test(void) { int i; osal_id_t module_id = OS_OBJECT_ID_UNDEFINED; @@ -167,7 +167,7 @@ void UT_os_module_load_test() ** OS_ERROR if the OS call failed ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_module_unload_test() +void UT_os_module_unload_test(void) { osal_id_t module_id = OS_OBJECT_ID_UNDEFINED; @@ -206,7 +206,7 @@ void UT_os_module_unload_test() ** OS_ERR_INVALID_ID if the id passed in is not a valid module id ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_module_info_test() +void UT_os_module_info_test(void) { osal_id_t module_id = OS_OBJECT_ID_UNDEFINED; OS_module_prop_t module_info; diff --git a/src/unit-tests/osloader-test/ut_osloader_symtable_test.c b/src/unit-tests/osloader-test/ut_osloader_symtable_test.c index 4f1b6f72a..e48820175 100644 --- a/src/unit-tests/osloader-test/ut_osloader_symtable_test.c +++ b/src/unit-tests/osloader-test/ut_osloader_symtable_test.c @@ -39,7 +39,7 @@ * This must be large enough to actually accommodate all of the symbols * in the target system. */ -#define UT_SYMTABLE_SIZE_LIMIT 1048576 +#define UT_SYMTABLE_SIZE_LIMIT (1024 * 1024 * 5) /*--------------------------------------------------------------------------------* ** Data types @@ -70,7 +70,7 @@ ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_symbol_lookup_test() +void UT_os_symbol_lookup_test(void) { cpuaddr symbol_addr; osal_id_t module_id = OS_OBJECT_ID_UNDEFINED; @@ -134,7 +134,7 @@ void UT_os_symbol_lookup_test() ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_module_symbol_lookup_test() +void UT_os_module_symbol_lookup_test(void) { cpuaddr symbol_addr; osal_id_t module_id = OS_OBJECT_ID_UNDEFINED; @@ -186,7 +186,7 @@ void UT_os_module_symbol_lookup_test() ** OS_ERROR if there was any problem writing the symbol table to the file ** OS_SUCCESS if succeeded **--------------------------------------------------------------------------------*/ -void UT_os_symbol_table_dump_test() +void UT_os_symbol_table_dump_test(void) { int32 status; /* @@ -213,23 +213,23 @@ void UT_os_symbol_table_dump_test() { UtAssert_NA("OS_SymbolTableDump API not implemented"); } - else if (status == OS_ERR_OUTPUT_TOO_LARGE) - { - UtAssert_MIR("UT_SYMTABLE_SIZE_LIMIT too small for OS_SymbolTableDump"); - } - else if (status == OS_ERR_NAME_TOO_LONG) - { - UtAssert_MIR("OSAL_CONFIG_MAX_SYM_LEN too small for OS_SymbolTableDump"); - } else { - UtAssert_True(status == OS_SUCCESS, "status after 128k OS_SymbolTableDump = %d", (int)status); + UtAssert_INT32_EQ(status, OS_SUCCESS); + if (status == OS_SUCCESS) + { + UT_RETVAL(OS_SymbolTableDump(UT_OS_GENERIC_MODULE_DIR "SymbolZero.dat", 0), OS_ERR_OUTPUT_TOO_LARGE); + } + else if (status == OS_ERR_OUTPUT_TOO_LARGE) + { + UtPrintf("Failed OS_SymbolTableDump, UT_SYMTABLE_SIZE_LIMIT too small for OS_SymbolTableDump\n"); + } + else if (status == OS_ERR_NAME_TOO_LONG) + { + UtPrintf("OS_SymbolTableDump name to long, consider increasing OSAL_CONFIG_MAX_SYM_LEN\n"); + } } - if (status == OS_SUCCESS) - { - UT_RETVAL(OS_SymbolTableDump(UT_OS_GENERIC_MODULE_DIR "SymbolZero.dat", 0), OS_ERR_OUTPUT_TOO_LARGE); - } } /*================================================================================* diff --git a/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c b/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c index 0455db70b..aa681dfde 100644 --- a/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c +++ b/src/unit-tests/osnetwork-test/ut_osnetwork_misc_test.c @@ -76,7 +76,7 @@ ** (a) OS_ERR_NOT_IMPLEMENTED __or__ ** (b) host id of value greater than 0 **--------------------------------------------------------------------------------*/ -void UT_os_networkgetid_test() +void UT_os_networkgetid_test(void) { /*-----------------------------------------------------*/ /* API Not implemented */ @@ -133,7 +133,7 @@ void UT_os_networkgetid_test() ** (a) OS_SUCCESS, _and_ ** (b) the returned buffer to be non-empty **--------------------------------------------------------------------------------*/ -void UT_os_networkgethostname_test() +void UT_os_networkgethostname_test(void) { char buffer[UT_OS_IO_BUFF_SIZE]; diff --git a/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c b/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c index 8e0f3a128..9f86ad6c2 100644 --- a/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c +++ b/src/unit-tests/ostimer-test/ut_ostimer_timerio_test.c @@ -468,6 +468,7 @@ void UT_os_timerset_test(void) g_timerGlobal.state = UT_TimerState_INIT; startTime = g_clkAccuracy*5; + intervalTime = 500000; UtPrintf("\nOS_TimerSet() - #4 Nominal condition (clk_accuracy=%d)\n", (int)g_clkAccuracy); diff --git a/src/ut-stubs/CMakeLists.txt b/src/ut-stubs/CMakeLists.txt index 1b3908d35..961550427 100644 --- a/src/ut-stubs/CMakeLists.txt +++ b/src/ut-stubs/CMakeLists.txt @@ -29,6 +29,7 @@ set(OSAL_PUBLIC_API_HEADERS ${OSAL_SOURCE_DIR}/src/os/inc/osapi-network.h ${OSAL_SOURCE_DIR}/src/os/inc/osapi-printf.h ${OSAL_SOURCE_DIR}/src/os/inc/osapi-queue.h + ${OSAL_SOURCE_DIR}/src/os/inc/osapi-rwlock.h ${OSAL_SOURCE_DIR}/src/os/inc/osapi-select.h ${OSAL_SOURCE_DIR}/src/os/inc/osapi-shell.h ${OSAL_SOURCE_DIR}/src/os/inc/osapi-sockets.h @@ -86,6 +87,8 @@ add_library(ut_osapi_stubs STATIC osapi-printf-handlers.c osapi-queue-stubs.c osapi-queue-handlers.c + osapi-rwlock-stubs.c + osapi-rwlock-handlers.c osapi-select-stubs.c osapi-shell-stubs.c osapi-sockets-stubs.c diff --git a/src/ut-stubs/osapi-clock-stubs.c b/src/ut-stubs/osapi-clock-stubs.c index 27914ea91..1dbdfa7d1 100644 --- a/src/ut-stubs/osapi-clock-stubs.c +++ b/src/ut-stubs/osapi-clock-stubs.c @@ -44,6 +44,22 @@ int32 OS_GetLocalTime(OS_time_t *time_struct) return UT_GenStub_GetReturnValue(OS_GetLocalTime, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_GetMonotonicTime() + * ---------------------------------------------------- + */ +int32 OS_GetMonotonicTime(OS_time_t *time_struct) +{ + UT_GenStub_SetupReturnBuffer(OS_GetMonotonicTime, int32); + + UT_GenStub_AddParam(OS_GetMonotonicTime, OS_time_t *, time_struct); + + UT_GenStub_Execute(OS_GetMonotonicTime, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_GetMonotonicTime, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_SetLocalTime() diff --git a/src/ut-stubs/osapi-file-handlers.c b/src/ut-stubs/osapi-file-handlers.c index bea4c9a32..60b3533b5 100644 --- a/src/ut-stubs/osapi-file-handlers.c +++ b/src/ut-stubs/osapi-file-handlers.c @@ -214,7 +214,7 @@ void UT_DefaultHandler_OS_stat(void *UserObj, UT_EntryKey_t FuncKey, const UT_St */ void UT_DefaultHandler_OS_lseek(void *UserObj, UT_EntryKey_t FuncKey, const UT_StubContext_t *Context) { - int32 offset = UT_Hook_GetArgValueByName(Context, "offset", int32); + int32 offset = UT_Hook_GetArgValueByName(Context, "offset", osal_offset_t); int32 Status; if (UT_Stub_GetInt32StatusCode(Context, &Status)) diff --git a/src/ut-stubs/osapi-file-stubs.c b/src/ut-stubs/osapi-file-stubs.c index a25c8eacb..6618da61a 100644 --- a/src/ut-stubs/osapi-file-stubs.c +++ b/src/ut-stubs/osapi-file-stubs.c @@ -35,44 +35,6 @@ void UT_DefaultHandler_OS_read(void *, UT_EntryKey_t, const UT_StubContext_t *); void UT_DefaultHandler_OS_stat(void *, UT_EntryKey_t, const UT_StubContext_t *); void UT_DefaultHandler_OS_write(void *, UT_EntryKey_t, const UT_StubContext_t *); -/* - * ---------------------------------------------------- - * Generated stub function for OS_TimedReadAbs() - * ---------------------------------------------------- - */ -int32 OS_TimedReadAbs(osal_id_t filedes, void *buffer, size_t nbytes, OS_time_t abstime) -{ - UT_GenStub_SetupReturnBuffer(OS_TimedReadAbs, int32); - - UT_GenStub_AddParam(OS_TimedReadAbs, osal_id_t, filedes); - UT_GenStub_AddParam(OS_TimedReadAbs, void *, buffer); - UT_GenStub_AddParam(OS_TimedReadAbs, size_t, nbytes); - UT_GenStub_AddParam(OS_TimedReadAbs, OS_time_t, abstime); - - UT_GenStub_Execute(OS_TimedReadAbs, Basic, NULL); - - return UT_GenStub_GetReturnValue(OS_TimedReadAbs, int32); -} - -/* - * ---------------------------------------------------- - * Generated stub function for OS_TimedWriteAbs() - * ---------------------------------------------------- - */ -int32 OS_TimedWriteAbs(osal_id_t filedes, const void *buffer, size_t nbytes, OS_time_t abstime) -{ - UT_GenStub_SetupReturnBuffer(OS_TimedWriteAbs, int32); - - UT_GenStub_AddParam(OS_TimedWriteAbs, osal_id_t, filedes); - UT_GenStub_AddParam(OS_TimedWriteAbs, const void *, buffer); - UT_GenStub_AddParam(OS_TimedWriteAbs, size_t, nbytes); - UT_GenStub_AddParam(OS_TimedWriteAbs, OS_time_t, abstime); - - UT_GenStub_Execute(OS_TimedWriteAbs, Basic, NULL); - - return UT_GenStub_GetReturnValue(OS_TimedWriteAbs, int32); -} - /* * ---------------------------------------------------- * Generated stub function for OS_CloseAllFiles() @@ -120,6 +82,24 @@ int32 OS_FDGetInfo(osal_id_t filedes, OS_file_prop_t *fd_prop) return UT_GenStub_GetReturnValue(OS_FDGetInfo, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_FileAllocate() + * ---------------------------------------------------- + */ +int32 OS_FileAllocate(osal_id_t filedes, osal_offset_t offset, osal_offset_t len) +{ + UT_GenStub_SetupReturnBuffer(OS_FileAllocate, int32); + + UT_GenStub_AddParam(OS_FileAllocate, osal_id_t, filedes); + UT_GenStub_AddParam(OS_FileAllocate, osal_offset_t, offset); + UT_GenStub_AddParam(OS_FileAllocate, osal_offset_t, len); + + UT_GenStub_Execute(OS_FileAllocate, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_FileAllocate, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_FileOpenCheck() @@ -136,6 +116,23 @@ int32 OS_FileOpenCheck(const char *Filename) return UT_GenStub_GetReturnValue(OS_FileOpenCheck, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_FileTruncate() + * ---------------------------------------------------- + */ +int32 OS_FileTruncate(osal_id_t filedes, osal_offset_t len) +{ + UT_GenStub_SetupReturnBuffer(OS_FileTruncate, int32); + + UT_GenStub_AddParam(OS_FileTruncate, osal_id_t, filedes); + UT_GenStub_AddParam(OS_FileTruncate, osal_offset_t, len); + + UT_GenStub_Execute(OS_FileTruncate, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_FileTruncate, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_OpenCreate() @@ -174,6 +171,25 @@ int32 OS_TimedRead(osal_id_t filedes, void *buffer, size_t nbytes, int32 timeout return UT_GenStub_GetReturnValue(OS_TimedRead, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_TimedReadAbs() + * ---------------------------------------------------- + */ +int32 OS_TimedReadAbs(osal_id_t filedes, void *buffer, size_t nbytes, OS_time_t abstime) +{ + UT_GenStub_SetupReturnBuffer(OS_TimedReadAbs, int32); + + UT_GenStub_AddParam(OS_TimedReadAbs, osal_id_t, filedes); + UT_GenStub_AddParam(OS_TimedReadAbs, void *, buffer); + UT_GenStub_AddParam(OS_TimedReadAbs, size_t, nbytes); + UT_GenStub_AddParam(OS_TimedReadAbs, OS_time_t, abstime); + + UT_GenStub_Execute(OS_TimedReadAbs, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_TimedReadAbs, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_TimedWrite() @@ -193,6 +209,25 @@ int32 OS_TimedWrite(osal_id_t filedes, const void *buffer, size_t nbytes, int32 return UT_GenStub_GetReturnValue(OS_TimedWrite, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_TimedWriteAbs() + * ---------------------------------------------------- + */ +int32 OS_TimedWriteAbs(osal_id_t filedes, const void *buffer, size_t nbytes, OS_time_t abstime) +{ + UT_GenStub_SetupReturnBuffer(OS_TimedWriteAbs, int32); + + UT_GenStub_AddParam(OS_TimedWriteAbs, osal_id_t, filedes); + UT_GenStub_AddParam(OS_TimedWriteAbs, const void *, buffer); + UT_GenStub_AddParam(OS_TimedWriteAbs, size_t, nbytes); + UT_GenStub_AddParam(OS_TimedWriteAbs, OS_time_t, abstime); + + UT_GenStub_Execute(OS_TimedWriteAbs, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_TimedWriteAbs, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_chmod() @@ -248,12 +283,12 @@ int32 OS_cp(const char *src, const char *dest) * Generated stub function for OS_lseek() * ---------------------------------------------------- */ -int32 OS_lseek(osal_id_t filedes, int32 offset, uint32 whence) +int32 OS_lseek(osal_id_t filedes, osal_offset_t offset, uint32 whence) { UT_GenStub_SetupReturnBuffer(OS_lseek, int32); UT_GenStub_AddParam(OS_lseek, osal_id_t, filedes); - UT_GenStub_AddParam(OS_lseek, int32, offset); + UT_GenStub_AddParam(OS_lseek, osal_offset_t, offset); UT_GenStub_AddParam(OS_lseek, uint32, whence); UT_GenStub_Execute(OS_lseek, Basic, UT_DefaultHandler_OS_lseek); diff --git a/src/ut-stubs/osapi-rwlock-handlers.c b/src/ut-stubs/osapi-rwlock-handlers.c new file mode 100644 index 000000000..af7babe59 --- /dev/null +++ b/src/ut-stubs/osapi-rwlock-handlers.c @@ -0,0 +1,111 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * \file + * + * Stub implementations for the functions defined in the OSAL API + * + * The stub implementation can be used for unit testing applications built + * on top of OSAL. The stubs do not do any real function, but allow + * the return code to be crafted such that error paths in the application + * can be executed. + */ + +#include "osapi-rwlock.h" /* OSAL public API for this subsystem */ +#include "utstub-helpers.h" + +/* + * ----------------------------------------------------------------- + * Default handler implementation for 'OS_RwLockCreate' stub + * ----------------------------------------------------------------- + */ +void UT_DefaultHandler_OS_RwLockCreate(void *UserObj, UT_EntryKey_t FuncKey, const UT_StubContext_t *Context) +{ + osal_id_t *rw_id = UT_Hook_GetArgValueByName(Context, "rw_id", osal_id_t *); + int32 status; + + UT_Stub_GetInt32StatusCode(Context, &status); + + if (status == OS_SUCCESS) + { + *rw_id = UT_AllocStubObjId(OS_OBJECT_TYPE_OS_RWLOCK); + } + else + { + *rw_id = UT_STUB_FAKE_OBJECT_ID; + } +} + +/* + * ----------------------------------------------------------------- + * Default handler implementation for 'OS_RwLockDelete' stub + * ----------------------------------------------------------------- + */ +void UT_DefaultHandler_OS_RwLockDelete(void *UserObj, UT_EntryKey_t FuncKey, const UT_StubContext_t *Context) +{ + osal_id_t rw_id = UT_Hook_GetArgValueByName(Context, "rw_id", osal_id_t); + int32 status; + + UT_Stub_GetInt32StatusCode(Context, &status); + + if (status == OS_SUCCESS) + { + UT_DeleteStubObjId(OS_OBJECT_TYPE_OS_MUTEX, rw_id); + } +} + +/* + * ----------------------------------------------------------------- + * Default handler implementation for 'OS_RwLockGetIdByName' stub + * ----------------------------------------------------------------- + */ +void UT_DefaultHandler_OS_RwLockGetIdByName(void *UserObj, UT_EntryKey_t FuncKey, const UT_StubContext_t *Context) +{ + osal_id_t *rw_id = UT_Hook_GetArgValueByName(Context, "rw_id", osal_id_t *); + int32 status; + + UT_Stub_GetInt32StatusCode(Context, &status); + + if (status == OS_SUCCESS && + UT_Stub_CopyToLocal(UT_KEY(OS_RwLockGetIdByName), rw_id, sizeof(*rw_id)) < sizeof(*rw_id)) + { + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_RWLOCK, rw_id); + } +} + +/* + * ----------------------------------------------------------------- + * Default handler implementation for 'OS_RwLockGetInfo' stub + * ----------------------------------------------------------------- + */ +void UT_DefaultHandler_OS_RwLockGetInfo(void *UserObj, UT_EntryKey_t FuncKey, const UT_StubContext_t *Context) +{ + OS_rwlock_prop_t *rw_prop = UT_Hook_GetArgValueByName(Context, "rw_prop", OS_rwlock_prop_t *); + int32 status; + + UT_Stub_GetInt32StatusCode(Context, &status); + + if (status == OS_SUCCESS && + UT_Stub_CopyToLocal(UT_KEY(OS_RwLockGetInfo), rw_prop, sizeof(*rw_prop)) < sizeof(*rw_prop)) + { + strncpy(rw_prop->name, "Name", sizeof(rw_prop->name) - 1); + rw_prop->name[sizeof(rw_prop->name) - 1] = '\0'; + UT_ObjIdCompose(1, OS_OBJECT_TYPE_OS_TASK, &rw_prop->creator); + } +} diff --git a/src/ut-stubs/osapi-rwlock-stubs.c b/src/ut-stubs/osapi-rwlock-stubs.c new file mode 100644 index 000000000..67e4cc839 --- /dev/null +++ b/src/ut-stubs/osapi-rwlock-stubs.c @@ -0,0 +1,163 @@ +/************************************************************************ + * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes” + * + * Copyright (c) 2020 United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ************************************************************************/ + +/** + * @file + * + * Auto-Generated stub implementations for functions defined in osapi-rwlock header + */ + +#include "osapi-rwlock.h" +#include "utgenstub.h" + +void UT_DefaultHandler_OS_RwLockCreate(void *, UT_EntryKey_t, const UT_StubContext_t *); +void UT_DefaultHandler_OS_RwLockDelete(void *, UT_EntryKey_t, const UT_StubContext_t *); +void UT_DefaultHandler_OS_RwLockGetIdByName(void *, UT_EntryKey_t, const UT_StubContext_t *); +void UT_DefaultHandler_OS_RwLockGetInfo(void *, UT_EntryKey_t, const UT_StubContext_t *); + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockCreate() + * ---------------------------------------------------- + */ +int32 OS_RwLockCreate(osal_id_t *rw_id, const char *rw_name, uint32 options) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockCreate, int32); + + UT_GenStub_AddParam(OS_RwLockCreate, osal_id_t *, rw_id); + UT_GenStub_AddParam(OS_RwLockCreate, const char *, rw_name); + UT_GenStub_AddParam(OS_RwLockCreate, uint32, options); + + UT_GenStub_Execute(OS_RwLockCreate, Basic, UT_DefaultHandler_OS_RwLockCreate); + + return UT_GenStub_GetReturnValue(OS_RwLockCreate, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockDelete() + * ---------------------------------------------------- + */ +int32 OS_RwLockDelete(osal_id_t rw_id) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockDelete, int32); + + UT_GenStub_AddParam(OS_RwLockDelete, osal_id_t, rw_id); + + UT_GenStub_Execute(OS_RwLockDelete, Basic, UT_DefaultHandler_OS_RwLockDelete); + + return UT_GenStub_GetReturnValue(OS_RwLockDelete, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockGetIdByName() + * ---------------------------------------------------- + */ +int32 OS_RwLockGetIdByName(osal_id_t *rw_id, const char *rw_name) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockGetIdByName, int32); + + UT_GenStub_AddParam(OS_RwLockGetIdByName, osal_id_t *, rw_id); + UT_GenStub_AddParam(OS_RwLockGetIdByName, const char *, rw_name); + + UT_GenStub_Execute(OS_RwLockGetIdByName, Basic, UT_DefaultHandler_OS_RwLockGetIdByName); + + return UT_GenStub_GetReturnValue(OS_RwLockGetIdByName, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockGetInfo() + * ---------------------------------------------------- + */ +int32 OS_RwLockGetInfo(osal_id_t rw_id, OS_rwlock_prop_t *rw_prop) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockGetInfo, int32); + + UT_GenStub_AddParam(OS_RwLockGetInfo, osal_id_t, rw_id); + UT_GenStub_AddParam(OS_RwLockGetInfo, OS_rwlock_prop_t *, rw_prop); + + UT_GenStub_Execute(OS_RwLockGetInfo, Basic, UT_DefaultHandler_OS_RwLockGetInfo); + + return UT_GenStub_GetReturnValue(OS_RwLockGetInfo, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockReadGive() + * ---------------------------------------------------- + */ +int32 OS_RwLockReadGive(osal_id_t rw_id) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockReadGive, int32); + + UT_GenStub_AddParam(OS_RwLockReadGive, osal_id_t, rw_id); + + UT_GenStub_Execute(OS_RwLockReadGive, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockReadGive, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockReadTake() + * ---------------------------------------------------- + */ +int32 OS_RwLockReadTake(osal_id_t rw_id) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockReadTake, int32); + + UT_GenStub_AddParam(OS_RwLockReadTake, osal_id_t, rw_id); + + UT_GenStub_Execute(OS_RwLockReadTake, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockReadTake, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockWriteGive() + * ---------------------------------------------------- + */ +int32 OS_RwLockWriteGive(osal_id_t rw_id) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockWriteGive, int32); + + UT_GenStub_AddParam(OS_RwLockWriteGive, osal_id_t, rw_id); + + UT_GenStub_Execute(OS_RwLockWriteGive, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockWriteGive, int32); +} + +/* + * ---------------------------------------------------- + * Generated stub function for OS_RwLockWriteTake() + * ---------------------------------------------------- + */ +int32 OS_RwLockWriteTake(osal_id_t rw_id) +{ + UT_GenStub_SetupReturnBuffer(OS_RwLockWriteTake, int32); + + UT_GenStub_AddParam(OS_RwLockWriteTake, osal_id_t, rw_id); + + UT_GenStub_Execute(OS_RwLockWriteTake, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_RwLockWriteTake, int32); +} diff --git a/src/ut-stubs/osapi-select-stubs.c b/src/ut-stubs/osapi-select-stubs.c index fa01a36ba..7defacf73 100644 --- a/src/ut-stubs/osapi-select-stubs.c +++ b/src/ut-stubs/osapi-select-stubs.c @@ -110,6 +110,24 @@ int32 OS_SelectMultiple(OS_FdSet *ReadSet, OS_FdSet *WriteSet, int32 msecs) return UT_GenStub_GetReturnValue(OS_SelectMultiple, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_SelectMultipleAbs() + * ---------------------------------------------------- + */ +int32 OS_SelectMultipleAbs(OS_FdSet *ReadSet, OS_FdSet *WriteSet, OS_time_t abs_timeout) +{ + UT_GenStub_SetupReturnBuffer(OS_SelectMultipleAbs, int32); + + UT_GenStub_AddParam(OS_SelectMultipleAbs, OS_FdSet *, ReadSet); + UT_GenStub_AddParam(OS_SelectMultipleAbs, OS_FdSet *, WriteSet); + UT_GenStub_AddParam(OS_SelectMultipleAbs, OS_time_t, abs_timeout); + + UT_GenStub_Execute(OS_SelectMultipleAbs, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_SelectMultipleAbs, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_SelectSingle() @@ -127,3 +145,21 @@ int32 OS_SelectSingle(osal_id_t objid, uint32 *StateFlags, int32 msecs) return UT_GenStub_GetReturnValue(OS_SelectSingle, int32); } + +/* + * ---------------------------------------------------- + * Generated stub function for OS_SelectSingleAbs() + * ---------------------------------------------------- + */ +int32 OS_SelectSingleAbs(osal_id_t objid, uint32 *StateFlags, OS_time_t abs_timeout) +{ + UT_GenStub_SetupReturnBuffer(OS_SelectSingleAbs, int32); + + UT_GenStub_AddParam(OS_SelectSingleAbs, osal_id_t, objid); + UT_GenStub_AddParam(OS_SelectSingleAbs, uint32 *, StateFlags); + UT_GenStub_AddParam(OS_SelectSingleAbs, OS_time_t, abs_timeout); + + UT_GenStub_Execute(OS_SelectSingleAbs, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_SelectSingleAbs, int32); +} diff --git a/src/ut-stubs/osapi-sockets-stubs.c b/src/ut-stubs/osapi-sockets-stubs.c index b61d3f017..847e6f8fc 100644 --- a/src/ut-stubs/osapi-sockets-stubs.c +++ b/src/ut-stubs/osapi-sockets-stubs.c @@ -54,6 +54,25 @@ int32 OS_SocketAccept(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t * return UT_GenStub_GetReturnValue(OS_SocketAccept, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_SocketAcceptAbs() + * ---------------------------------------------------- + */ +int32 OS_SocketAcceptAbs(osal_id_t sock_id, osal_id_t *connsock_id, OS_SockAddr_t *Addr, OS_time_t abs_timeout) +{ + UT_GenStub_SetupReturnBuffer(OS_SocketAcceptAbs, int32); + + UT_GenStub_AddParam(OS_SocketAcceptAbs, osal_id_t, sock_id); + UT_GenStub_AddParam(OS_SocketAcceptAbs, osal_id_t *, connsock_id); + UT_GenStub_AddParam(OS_SocketAcceptAbs, OS_SockAddr_t *, Addr); + UT_GenStub_AddParam(OS_SocketAcceptAbs, OS_time_t, abs_timeout); + + UT_GenStub_Execute(OS_SocketAcceptAbs, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_SocketAcceptAbs, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_SocketAddrFromString() @@ -192,6 +211,24 @@ int32 OS_SocketConnect(osal_id_t sock_id, const OS_SockAddr_t *Addr, int32 timeo return UT_GenStub_GetReturnValue(OS_SocketConnect, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_SocketConnectAbs() + * ---------------------------------------------------- + */ +int32 OS_SocketConnectAbs(osal_id_t sock_id, const OS_SockAddr_t *Addr, OS_time_t abs_timeout) +{ + UT_GenStub_SetupReturnBuffer(OS_SocketConnectAbs, int32); + + UT_GenStub_AddParam(OS_SocketConnectAbs, osal_id_t, sock_id); + UT_GenStub_AddParam(OS_SocketConnectAbs, const OS_SockAddr_t *, Addr); + UT_GenStub_AddParam(OS_SocketConnectAbs, OS_time_t, abs_timeout); + + UT_GenStub_Execute(OS_SocketConnectAbs, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_SocketConnectAbs, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_SocketGetIdByName() @@ -226,6 +263,24 @@ int32 OS_SocketGetInfo(osal_id_t sock_id, OS_socket_prop_t *sock_prop) return UT_GenStub_GetReturnValue(OS_SocketGetInfo, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_SocketGetOption() + * ---------------------------------------------------- + */ +int32 OS_SocketGetOption(osal_id_t sock_id, OS_socket_option_t opt_id, OS_socket_optval_t *optval) +{ + UT_GenStub_SetupReturnBuffer(OS_SocketGetOption, int32); + + UT_GenStub_AddParam(OS_SocketGetOption, osal_id_t, sock_id); + UT_GenStub_AddParam(OS_SocketGetOption, OS_socket_option_t, opt_id); + UT_GenStub_AddParam(OS_SocketGetOption, OS_socket_optval_t *, optval); + + UT_GenStub_Execute(OS_SocketGetOption, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_SocketGetOption, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_SocketListen() @@ -320,6 +375,24 @@ int32 OS_SocketSendTo(osal_id_t sock_id, const void *buffer, size_t buflen, cons return UT_GenStub_GetReturnValue(OS_SocketSendTo, int32); } +/* + * ---------------------------------------------------- + * Generated stub function for OS_SocketSetOption() + * ---------------------------------------------------- + */ +int32 OS_SocketSetOption(osal_id_t sock_id, OS_socket_option_t opt_id, const OS_socket_optval_t *optval) +{ + UT_GenStub_SetupReturnBuffer(OS_SocketSetOption, int32); + + UT_GenStub_AddParam(OS_SocketSetOption, osal_id_t, sock_id); + UT_GenStub_AddParam(OS_SocketSetOption, OS_socket_option_t, opt_id); + UT_GenStub_AddParam(OS_SocketSetOption, const OS_socket_optval_t *, optval); + + UT_GenStub_Execute(OS_SocketSetOption, Basic, NULL); + + return UT_GenStub_GetReturnValue(OS_SocketSetOption, int32); +} + /* * ---------------------------------------------------- * Generated stub function for OS_SocketShutdown() diff --git a/ut_assert/scripts/generate_stubs.pl b/ut_assert/scripts/generate_stubs.pl index a426ee2e7..9737cfb85 100755 --- a/ut_assert/scripts/generate_stubs.pl +++ b/ut_assert/scripts/generate_stubs.pl @@ -101,7 +101,7 @@ foreach my $hdr (@hdrlist) { - next unless open(HDR, "$hdr") || die "Cannot open: $hdr for reading\n"; + next unless open(HDR, '<', $hdr) || die "Cannot open: $hdr for reading\n"; my $fileapi = {}; my @lines = ();