Changeset 00c2de63 in mainline for uspace/lib/posix/sys/wait.c


Ignore:
Timestamp:
2011-07-29T14:50:22Z (13 years ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b6759f4
Parents:
6c69d19 (diff), 7ae249d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge libposix.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/posix/sys/wait.c

    r6c69d19 r00c2de63  
    3939#include "wait.h"
    4040
     41#include "../libc/task.h"
     42#include "../assert.h"
     43#include "../errno.h"
     44#include "../limits.h"
     45#include "../signal.h"
     46
     47int __posix_wifexited(int status) {
     48        return status != INT_MIN;
     49}
     50
     51int __posix_wexitstatus(int status) {
     52        assert(__posix_wifexited(status));
     53        return status;
     54}
     55
     56int __posix_wifsignaled(int status) {
     57        return status == INT_MIN;
     58}
     59
     60int __posix_wtermsig(int status) {
     61        assert(__posix_wifsignaled(status));
     62        /* There is no way to distinguish reason
     63         * for unexpected termination at the moment.
     64         */
     65        return SIGABRT;
     66}
     67
    4168/**
    4269 *
     
    4673posix_pid_t posix_wait(int *stat_ptr)
    4774{
    48         // TODO: low priority, just a compile-time dependency of binutils
    49         not_implemented();
     75        /* HelenOS does not support this. */
     76        errno = ENOSYS;
     77        return (posix_pid_t) -1;
    5078}
    5179
     
    5987posix_pid_t posix_waitpid(posix_pid_t pid, int *stat_ptr, int options)
    6088{
    61         // TODO: low priority, just a compile-time dependency of binutils
    62         not_implemented();
     89        assert(stat_ptr != NULL);
     90        assert(options == 0 /* None of the options are supported. */);
     91       
     92        task_exit_t texit;
     93        int retval;
     94       
     95        int rc = task_wait((task_id_t) pid, &texit, &retval);
     96       
     97        if (rc < 0) {
     98                /* Unable to retrieve status. */
     99                errno = -rc;
     100                return (posix_pid_t) -1;
     101        }
     102       
     103        if (texit == TASK_EXIT_NORMAL) {
     104                // FIXME: relies on application not returning this value
     105                assert(retval != INT_MIN);
     106                *stat_ptr = retval;
     107        } else {
     108                /* Reserve the lowest value for unexpected termination. */
     109                *stat_ptr = INT_MIN;
     110        }
     111       
     112        return pid;
    63113}
    64114
Note: See TracChangeset for help on using the changeset viewer.