
  -spec erlang:port_call(Port, Operation, Data) -> term()
                            when
                                Port :: port() | atom(),
                                Operation :: integer(),
                                Data :: term().

  Performs a synchronous call to a port. The meaning of Operation
  and Data depends on the port, that is, on the port driver. Not
  all port drivers support this feature.

  Port is a port identifier, referring to a driver.

  Operation is an integer, which is passed on to the driver.

  Data is any Erlang term. This data is converted to binary term
  format and sent to the port.

  Returns a term from the driver. The meaning of the returned data
  also depends on the port driver.

  Failures:

  badarg:
    If Port is not an identifier of an open port, or the
    registered name of an open port. If the calling process was
    previously linked to the closed port, identified by Port,
    the exit signal from the port is guaranteed to be delivered
    before this badarg exception occurs.

  badarg:
    If Operation does not fit in a 32-bit integer.

  badarg:
    If the port driver does not support synchronous control
    operations.

  badarg:
    If the port driver so decides for any reason (probably
    something wrong with Operation or Data).

    Warning:
      Do not call port_call with an unknown Port identifier
      and expect badarg exception. Any undefined behavior is
      possible (including node crash) depending on how the port
      driver interprets the supplied arguments.
