예제 #1
0
파일: Posix.c 프로젝트: ee08b397/mlkit
uintptr_t
REG_POLY_FUN_HDR(sml_ttyname, uintptr_t pair, Region rs, int fd)
{
    char *buf;
    int i = 100, r;
    fd = convertIntToC(fd);
    mkTagPairML(pair);
    r = 0;
    if (r == ERANGE) r++;
    do
    {
        buf = (char *) malloc(i);
        if (!buf)
        {
            first(pair) = convertIntToML(errno);
            second(pair) = (uintptr_t) NULL;
        }
        buf[i-1] = 0;
        r = ttyname_r(fd, buf, i-1);
        if (r == 0)
        {
            first(pair) = convertIntToML(0);
            second(pair) = (uintptr_t) REG_POLY_CALL(convertStringToML, rs, buf);
            free(buf);
            return pair;
        }
        r = errno;
        free(buf);
        i <<= 1;
    } while (r == ERANGE);
    first(pair) = convertIntToML(r);
    second(pair) = (uintptr_t) NULL;
    return pair;
}
예제 #2
0
파일: Time.c 프로젝트: HIPERFIT/mlkit
uintptr_t 
sml_getrealtime (uintptr_t vAddr) 
{
  struct timeval tp;
  gettimeofday(&tp, NULL);
  first(vAddr) = convertIntToML((tp.tv_sec+TIMEBASE));
  second(vAddr) = convertIntToML(tp.tv_usec);
  mkTagPairML(vAddr);
  return vAddr;
}
예제 #3
0
파일: Posix.c 프로젝트: ee08b397/mlkit
uintptr_t
sml_fstat(uintptr_t pair, size_t fd)
{
    int res;
    struct stat b;
    mkTagPairML(pair);
    res = fstat((int) fd, &b);
    if (res == -1)
    {
        elemRecordML(pair,0) = convertIntToML(-1);
        return pair;
    }
    return sml_statA(pair, &b);
}
예제 #4
0
파일: Posix.c 프로젝트: ee08b397/mlkit
uintptr_t
sml_stat(uintptr_t pair, String file)
{
    int res;
    struct stat b;
    mkTagPairML(pair);
    res = stat(&(file->data), &b);
    if (res == -1)
    {
        elemRecordML(pair,0) = convertIntToML(-1);
        return pair;
    }
    return sml_statA(pair, &b);
}
예제 #5
0
파일: Posix.c 프로젝트: ee08b397/mlkit
uintptr_t
sml_waitpid(uintptr_t pair, size_t waitpid_arg, size_t flags)
{
    int status;
    int f = 0x0;
    flags = convertIntToC(flags);
    if (flags & 0x1) f |= WUNTRACED;
    if (flags & 0x2) f |= WNOHANG;
    int pid = waitpid(convertIntToC((pid_t) waitpid_arg),
                      &status, f);
    mkTagPairML(pair);
    first(pair) = convertIntToML((size_t) pid);
    second(pair) = convertIntToML((size_t) status);
    return pair;
}
예제 #6
0
파일: Posix.c 프로젝트: ee08b397/mlkit
uintptr_t
REG_POLY_FUN_HDR(sml_readVec,uintptr_t pair, Region sr, int fd, int n1)
{
    int r, n;
    String s;
    mkTagPairML(pair);
    n = convertIntToC(n1);
    s = REG_POLY_CALL(allocStringC, sr, n+1);
    ((char *)&(s->data))[n] = 0;
    r = read(convertIntToC(fd), &(s->data), n);
    if (r > 0)
    {
        ((char *)&(s->data))[r] = 0;
    }
    first(pair) = (uintptr_t) s;
    second(pair) = convertIntToML(r);
    return pair;
}
예제 #7
0
파일: Posix.c 프로젝트: ee08b397/mlkit
uintptr_t
REG_POLY_FUN_HDR(sml_getgroups, uintptr_t rp, Region rs, uintptr_t exn)
{
    uintptr_t *pair, *list;
    gid_t *tmp;
    size_t r, i;
    makeNIL(list);
    mkTagPairML(rp);
    r = getgroups(0, NULL);
    if (r == -1)
    {
        first (rp) = r;
        second(rp) = (uintptr_t) list;
        return rp;
    }
    tmp = (gid_t *) malloc(sizeof(gid_t) * r);
    if (!tmp)
    {
        first (rp) = convertIntToML(-1);
        second(rp) = (uintptr_t) list;
        return rp;
    }
    r = getgroups(r, tmp);
    if (r == -1)
    {
        free(tmp);
        raise_exn(exn);
    }
    for(i=0; i<r; i++)
    {
        REG_POLY_CALL(allocPairML, rs, pair);
        first(pair) = (uintptr_t) convertIntToML(tmp[i]);
        second(pair) = (uintptr_t) list;
        makeCONS(pair, list)
    }
    free(tmp);
    first(rp) = convertIntToML(0);
    second(rp) = (uintptr_t) list;
    return rp;
}