summary refs log tree commit diff stats
path: root/tests/stdlib/tposix.nim
blob: 060482229a4b86ebf0c56ed6dae9acdfab25fc2c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
discard """
  matrix: "--mm:refc; --mm:orc"
  disabled: windows
"""

# Test Posix interface

when not defined(windows):

  import posix
  import std/[assertions, syncio]

  var
    u: Utsname

  discard uname(u)

  writeLine(stdout, u.sysname)
  writeLine(stdout, u.nodename)
  writeLine(stdout, u.release)
  writeLine(stdout, u.machine)

  when not (defined(nintendoswitch) or defined(macos) or defined(macosx)):
    block:
      type Message = object
        value: int

      const MQ_PATH: cstring = "/top_level_file"
      const MQ_PRIORITY: cuint = 170
      const MQ_MESSAGE_SIZE: csize_t = csize_t(sizeof(Message))

      let mqd_a: posix.MqAttr = MqAttr(mq_maxmsg: 10, mq_msgsize: clong(MQ_MESSAGE_SIZE))
      let writable: posix.Mqd = posix.mq_open(
        MQ_PATH,
        posix.O_CREAT or posix.O_WRONLY or posix.O_NONBLOCK,
        posix.S_IRWXU,
        addr(mqd_a)
      )
      let readable: posix.Mqd = posix.mq_open(
        MQ_PATH,
        posix.O_RDONLY or posix.O_NONBLOCK,
        posix.S_IRWXU,
        addr(mqd_a)
      )

      let sent: Message = Message(value: 88)
      block:
        let success: int = writable.mq_send(
          cast[cstring](sent.addr),
          MQ_MESSAGE_SIZE,
          MQ_PRIORITY
        )
        doAssert success == 0, $success

      block:
        var buffer: Message
        var priority: cuint
        let bytesRead: int = readable.mq_receive(
          cast[cstring](buffer.addr),
          MQ_MESSAGE_SIZE,
          priority
        )
        doAssert buffer == sent
        doAssert bytesRead == int(MQ_MESSAGE_SIZE)

  block:
    var rl: RLimit
    var res = getrlimit(RLIMIT_STACK, rl)
    doAssert res == 0

    # save old value
    let oldrlim = rl.rlim_cur

    # set new value
    rl.rlim_cur = rl.rlim_max - 1
    res = setrlimit(RLIMIT_STACK, rl)
    doAssert res == 0

    # get new value
    var rl1: RLimit
    res = getrlimit(RLIMIT_STACK, rl1)
    doAssert res == 0
    doAssert rl1.rlim_cur == rl.rlim_max - 1

    # restore old value
    rl.rlim_cur = oldrlim
    res = setrlimit(RLIMIT_STACK, rl)
    doAssert res == 0