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; }
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; }
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); }
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); }
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; }
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; }
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; }