open_serial (char * devfile)
{
  int D.6369;
  int fd;

  fd = open (devfile, 2306);
  D.6369 = fd;
  return D.6369;
}


open (const char * __path, int __oflag)
{
  int D.6371;
  int D.6374;
  int D.6379;
  int D.6381;
  int D.6382;
  int D.6385;
  int D.6386;

  D.6371 = __builtin_va_arg_pack_len ();
  if (D.6371 > 1) goto <D.6372>; else goto <D.6373>;
  <D.6372>:
  __open_too_many_args ();
  <D.6373>:
  D.6374 = __builtin_constant_p (__oflag);
  if (D.6374 != 0) goto <D.6375>; else goto <D.6376>;
  <D.6375>:
  D.6379 = __oflag & 64;
  if (D.6379 != 0) goto <D.6377>; else goto <D.6380>;
  <D.6380>:
  D.6381 = __oflag & 4259840;
  if (D.6381 == 4259840) goto <D.6377>; else goto <D.6378>;
  <D.6377>:
  D.6382 = __builtin_va_arg_pack_len ();
  if (D.6382 <= 0) goto <D.6383>; else goto <D.6384>;
  <D.6383>:
  __open_missing_mode ();
  D.6385 = __open_2 (__path, __oflag);
  return D.6385;
  <D.6384>:
  <D.6378>:
  D.6385 = __open_alias (__path, __oflag, __builtin_va_arg_pack ());
  return D.6385;
  <D.6376>:
  D.6386 = __builtin_va_arg_pack_len ();
  if (D.6386 <= 0) goto <D.6387>; else goto <D.6388>;
  <D.6387>:
  D.6385 = __open_2 (__path, __oflag);
  return D.6385;
  <D.6388>:
  D.6385 = __open_alias (__path, __oflag, __builtin_va_arg_pack ());
  return D.6385;
}


close_serial (int unix_fd)
{
  int D.6390;

  D.6390 = close (unix_fd);
  return D.6390;
}


read_serial (int fd, guchar * buffer, int offset, int count)
{
  long unsigned int D.6392;
  sizetype D.6393;
  void * D.6394;
  long int D.6395;
  guint32 D.6396;
  guint32 n;

  D.6392 = (long unsigned int) count;
  D.6393 = (sizetype) offset;
  D.6394 = buffer + D.6393;
  D.6395 = read (fd, D.6394, D.6392);
  n = (guint32) D.6395;
  D.6396 = n;
  return D.6396;
}


read (int __fd, void * __buf, size_t __nbytes)
{
  long unsigned int D.6398;
  int D.6401;
  ssize_t D.6404;
  long unsigned int D.6405;
  long unsigned int D.6406;
  long unsigned int D.6409;

  D.6398 = __builtin_object_size (__buf, 0);
  if (D.6398 != 18446744073709551615) goto <D.6399>; else goto <D.6400>;
  <D.6399>:
  D.6401 = __builtin_constant_p (__nbytes);
  if (D.6401 == 0) goto <D.6402>; else goto <D.6403>;
  <D.6402>:
  D.6405 = __builtin_object_size (__buf, 0);
  D.6404 = __read_chk (__fd, __buf, __nbytes, D.6405);
  return D.6404;
  <D.6403>:
  D.6406 = __builtin_object_size (__buf, 0);
  if (D.6406 < __nbytes) goto <D.6407>; else goto <D.6408>;
  <D.6407>:
  D.6409 = __builtin_object_size (__buf, 0);
  D.6404 = __read_chk_warn (__fd, __buf, __nbytes, D.6409);
  return D.6404;
  <D.6408>:
  <D.6400>:
  D.6404 = __read_alias (__fd, __buf, __nbytes);
  return D.6404;
}


write_serial (int fd, guchar * buffer, int offset, int count, int timeout)
{
  int * D.6414;
  int D.6415;
  int D.6418;
  long unsigned int D.6419;
  sizetype D.6420;
  const void * D.6421;
  unsigned int D.6425;
  unsigned int offset.0;
  unsigned int D.6427;
  unsigned int D.6428;
  struct pollfd pinfo;
  guint32 n;

  try
    {
      pinfo.fd = fd;
      pinfo.events = 4;
      pinfo.revents = 4;
      n = (guint32) count;
      goto <D.6256>;
      <D.6255>:
      {
        ssize_t t;

        if (timeout != 0) goto <D.6411>; else goto <D.6412>;
        <D.6411>:
        {
          int c;

          goto <D.6251>;
          <D.6250>:
          <D.6251>:
          c = poll (&pinfo, 1, timeout);
          if (c == -1) goto <D.6413>; else goto <D.6252>;
          <D.6413>:
          D.6414 = __errno_location ();
          D.6415 = *D.6414;
          if (D.6415 == 4) goto <D.6250>; else goto <D.6252>;
          <D.6252>:
          if (c == -1) goto <D.6416>; else goto <D.6417>;
          <D.6416>:
          D.6418 = -1;
          return D.6418;
          <D.6417>:
        }
        <D.6412>:
        <D.6253>:
        D.6419 = (long unsigned int) n;
        D.6420 = (sizetype) offset;
        D.6421 = buffer + D.6420;
        t = write (fd, D.6421, D.6419);
        if (t == -1) goto <D.6422>; else goto <D.6254>;
        <D.6422>:
        D.6414 = __errno_location ();
        D.6415 = *D.6414;
        if (D.6415 == 4) goto <D.6253>; else goto <D.6254>;
        <D.6254>:
        if (t < 0) goto <D.6423>; else goto <D.6424>;
        <D.6423>:
        D.6418 = -1;
        return D.6418;
        <D.6424>:
        D.6425 = (unsigned int) t;
        offset.0 = (unsigned int) offset;
        D.6427 = D.6425 + offset.0;
        offset = (int) D.6427;
        D.6428 = (unsigned int) t;
        n = n - D.6428;
      }
      <D.6256>:
      if (n != 0) goto <D.6255>; else goto <D.6257>;
      <D.6257>:
      D.6418 = 0;
      return D.6418;
    }
  finally
    {
      pinfo = {CLOBBER};
    }
}


poll (struct pollfd * __fds, nfds_t __nfds, int __timeout)
{
  long unsigned int D.6431;
  int D.6434;
  int D.6437;
  long unsigned int D.6438;
  long unsigned int D.6439;
  long unsigned int D.6440;
  long unsigned int D.6443;

  D.6431 = __builtin_object_size (__fds, 1);
  if (D.6431 != 18446744073709551615) goto <D.6432>; else goto <D.6433>;
  <D.6432>:
  D.6434 = __builtin_constant_p (__nfds);
  if (D.6434 == 0) goto <D.6435>; else goto <D.6436>;
  <D.6435>:
  D.6438 = __builtin_object_size (__fds, 1);
  D.6437 = __poll_chk (__fds, __nfds, __timeout, D.6438);
  return D.6437;
  <D.6436>:
  D.6439 = __builtin_object_size (__fds, 1);
  D.6440 = D.6439 / 8;
  if (D.6440 < __nfds) goto <D.6441>; else goto <D.6442>;
  <D.6441>:
  D.6443 = __builtin_object_size (__fds, 1);
  D.6437 = __poll_chk_warn (__fds, __nfds, __timeout, D.6443);
  return D.6437;
  <D.6442>:
  <D.6433>:
  D.6437 = __poll_alias (__fds, __nfds, __timeout);
  return D.6437;
}


discard_buffer (int fd, gboolean input)
{
  int D.6445;
  _Bool D.6446;
  int D.6447;

  D.6446 = input == 0;
  D.6447 = (int) D.6446;
  D.6445 = tcflush (fd, D.6447);
  return D.6445;
}


get_bytes_in_buffer (int fd, gboolean input)
{
  long unsigned int iftmp.1;
  int D.6453;
  gint32 D.6456;
  gint32 retval;

  try
    {
      if (input != 0) goto <D.6450>; else goto <D.6451>;
      <D.6450>:
      iftmp.1 = 21531;
      goto <D.6452>;
      <D.6451>:
      iftmp.1 = 21521;
      <D.6452>:
      D.6453 = ioctl (fd, iftmp.1, &retval);
      if (D.6453 == -1) goto <D.6454>; else goto <D.6455>;
      <D.6454>:
      D.6456 = -1;
      return D.6456;
      <D.6455>:
      D.6456 = retval;
      return D.6456;
    }
  finally
    {
      retval = {CLOBBER};
    }
}


is_baud_rate_legal (int baud_rate)
{
  gboolean D.6459;
  int D.6460;
  _Bool D.6461;

  D.6460 = setup_baud_rate (baud_rate);
  D.6461 = D.6460 != -1;
  D.6459 = (gboolean) D.6461;
  return D.6459;
}


setup_baud_rate (int baud_rate)
{
  int D.6463;

  switch (baud_rate) <default: <D.6295>, case 0: <D.6294>, case 50: <D.6293>, case 75: <D.6292>, case 110: <D.6291>, case 134: <D.6290>, case 150: <D.6289>, case 200: <D.6288>, case 300: <D.6287>, case 600: <D.6286>, case 1200: <D.6285>, case 1800: <D.6284>, case 2400: <D.6283>, case 4800: <D.6282>, case 9600: <D.6281>, case 19200: <D.6280>, case 38400: <D.6279>, case 57600: <D.6278>, case 115200: <D.6277>, case 230400: <D.6276>, case 460800: <D.6275>, case 921600: <D.6273>>
  <D.6273>:
  baud_rate = 4103;
  goto <D.6274>;
  <D.6275>:
  baud_rate = 4100;
  goto <D.6274>;
  <D.6276>:
  baud_rate = 4099;
  goto <D.6274>;
  <D.6277>:
  baud_rate = 4098;
  goto <D.6274>;
  <D.6278>:
  baud_rate = 4097;
  goto <D.6274>;
  <D.6279>:
  baud_rate = 15;
  goto <D.6274>;
  <D.6280>:
  baud_rate = 14;
  goto <D.6274>;
  <D.6281>:
  baud_rate = 13;
  goto <D.6274>;
  <D.6282>:
  baud_rate = 12;
  goto <D.6274>;
  <D.6283>:
  baud_rate = 11;
  goto <D.6274>;
  <D.6284>:
  baud_rate = 10;
  goto <D.6274>;
  <D.6285>:
  baud_rate = 9;
  goto <D.6274>;
  <D.6286>:
  baud_rate = 8;
  goto <D.6274>;
  <D.6287>:
  baud_rate = 7;
  goto <D.6274>;
  <D.6288>:
  baud_rate = 6;
  goto <D.6274>;
  <D.6289>:
  baud_rate = 5;
  goto <D.6274>;
  <D.6290>:
  baud_rate = 4;
  goto <D.6274>;
  <D.6291>:
  baud_rate = 3;
  goto <D.6274>;
  <D.6292>:
  baud_rate = 2;
  goto <D.6274>;
  <D.6293>:
  <D.6294>:
  <D.6295>:
  baud_rate = -1;
  goto <D.6274>;
  <D.6274>:
  D.6463 = baud_rate;
  return D.6463;
}


set_attributes (int fd, int baud_rate, MonoParity parity, int dataBits, MonoStopBits stopBits, MonoHandshake handshake)
{
  int D.6465;
  gboolean D.6468;
  unsigned int D.6469;
  unsigned int D.6470;
  unsigned int D.6471;
  unsigned int D.6472;
  unsigned int D.6473;
  unsigned int D.6474;
  unsigned int D.6475;
  unsigned int D.6476;
  unsigned int D.6477;
  unsigned int D.6478;
  unsigned int D.6479;
  unsigned int D.6480;
  unsigned int D.6482;
  unsigned int D.6483;
  unsigned int D.6484;
  unsigned int D.6485;
  unsigned int D.6486;
  unsigned int D.6487;
  unsigned int D.6489;
  unsigned int D.6490;
  unsigned int D.6491;
  unsigned int D.6492;
  unsigned int baud_rate.2;
  int D.6497;
  int D.6499;
  int D.6501;
  struct termios newtio;

  try
    {
      D.6465 = tcgetattr (fd, &newtio);
      if (D.6465 == -1) goto <D.6466>; else goto <D.6467>;
      <D.6466>:
      D.6468 = 0;
      return D.6468;
      <D.6467>:
      D.6469 = newtio.c_cflag;
      D.6470 = D.6469 | 2176;
      newtio.c_cflag = D.6470;
      D.6471 = newtio.c_lflag;
      D.6472 = D.6471 & 4294934404;
      newtio.c_lflag = D.6472;
      D.6473 = newtio.c_oflag;
      D.6474 = D.6473 & 4294967294;
      newtio.c_oflag = D.6474;
      newtio.c_iflag = 1;
      baud_rate = setup_baud_rate (baud_rate);
      D.6469 = newtio.c_cflag;
      D.6475 = D.6469 & 4294967247;
      newtio.c_cflag = D.6475;
      switch (dataBits) <default: <D.6310>, case 5: <D.6305>, case 6: <D.6307>, case 7: <D.6308>, case 8: <D.6309>>
      <D.6305>:
      D.6469 = newtio.c_cflag;
      newtio.c_cflag = D.6469;
      goto <D.6306>;
      <D.6307>:
      D.6469 = newtio.c_cflag;
      D.6476 = D.6469 | 16;
      newtio.c_cflag = D.6476;
      goto <D.6306>;
      <D.6308>:
      D.6469 = newtio.c_cflag;
      D.6477 = D.6469 | 32;
      newtio.c_cflag = D.6477;
      goto <D.6306>;
      <D.6309>:
      <D.6310>:
      D.6469 = newtio.c_cflag;
      D.6478 = D.6469 | 48;
      newtio.c_cflag = D.6478;
      goto <D.6306>;
      <D.6306>:
      switch (stopBits) <default: <D.6481>, case 0: <D.6311>, case 1: <D.6313>, case 2: <D.6314>, case 3: <D.6315>>
      <D.6311>:
      goto <D.6312>;
      <D.6313>:
      D.6469 = newtio.c_cflag;
      D.6479 = D.6469 & 4294967231;
      newtio.c_cflag = D.6479;
      goto <D.6312>;
      <D.6314>:
      D.6469 = newtio.c_cflag;
      D.6480 = D.6469 | 64;
      newtio.c_cflag = D.6480;
      goto <D.6312>;
      <D.6315>:
      goto <D.6312>;
      <D.6481>:
      <D.6312>:
      D.6482 = newtio.c_iflag;
      D.6483 = D.6482 & 4294967247;
      newtio.c_iflag = D.6483;
      switch (parity) <default: <D.6488>, case 0: <D.6316>, case 1: <D.6318>, case 2: <D.6319>, case 3: <D.6320>, case 4: <D.6321>>
      <D.6316>:
      D.6469 = newtio.c_cflag;
      D.6484 = D.6469 & 4294966527;
      newtio.c_cflag = D.6484;
      goto <D.6317>;
      <D.6318>:
      D.6469 = newtio.c_cflag;
      D.6485 = D.6469 | 768;
      newtio.c_cflag = D.6485;
      goto <D.6317>;
      <D.6319>:
      D.6469 = newtio.c_cflag;
      D.6486 = D.6469 & 4294966783;
      newtio.c_cflag = D.6486;
      D.6469 = newtio.c_cflag;
      D.6487 = D.6469 | 256;
      newtio.c_cflag = D.6487;
      goto <D.6317>;
      <D.6320>:
      goto <D.6317>;
      <D.6321>:
      goto <D.6317>;
      <D.6488>:
      <D.6317>:
      D.6482 = newtio.c_iflag;
      D.6489 = D.6482 & 4294962175;
      newtio.c_iflag = D.6489;
      D.6469 = newtio.c_cflag;
      D.6490 = D.6469 & 2147483647;
      newtio.c_cflag = D.6490;
      switch (handshake) <default: <D.6493>, case 0: <D.6322>, case 1: <D.6326>, case 2: <D.6324>, case 3: <D.6325>>
      <D.6322>:
      goto <D.6323>;
      <D.6324>:
      D.6469 = newtio.c_cflag;
      D.6491 = D.6469 | 2147483648;
      newtio.c_cflag = D.6491;
      goto <D.6323>;
      <D.6325>:
      D.6469 = newtio.c_cflag;
      D.6491 = D.6469 | 2147483648;
      newtio.c_cflag = D.6491;
      <D.6326>:
      D.6482 = newtio.c_iflag;
      D.6492 = D.6482 | 5120;
      newtio.c_iflag = D.6492;
      goto <D.6323>;
      <D.6493>:
      <D.6323>:
      baud_rate.2 = (unsigned int) baud_rate;
      D.6497 = cfsetospeed (&newtio, baud_rate.2);
      if (D.6497 < 0) goto <D.6494>; else goto <D.6498>;
      <D.6498>:
      baud_rate.2 = (unsigned int) baud_rate;
      D.6499 = cfsetispeed (&newtio, baud_rate.2);
      if (D.6499 < 0) goto <D.6494>; else goto <D.6500>;
      <D.6500>:
      D.6501 = tcsetattr (fd, 0, &newtio);
      if (D.6501 < 0) goto <D.6494>; else goto <D.6495>;
      <D.6494>:
      D.6468 = 0;
      return D.6468;
      <D.6495>:
      D.6468 = 1;
      return D.6468;
    }
  finally
    {
      newtio = {CLOBBER};
    }
}


get_signals (int fd, gint32 * error)
{
  int D.6504;
  MonoSerialSignal D.6507;
  int signals.3;
  int signals;

  try
    {
      *error = 0;
      D.6504 = ioctl (fd, 21525, &signals);
      if (D.6504 == -1) goto <D.6505>; else goto <D.6506>;
      <D.6505>:
      *error = -1;
      D.6507 = 0;
      return D.6507;
      <D.6506>:
      signals.3 = signals;
      D.6507 = get_mono_signal_codes (signals.3);
      return D.6507;
    }
  finally
    {
      signals = {CLOBBER};
    }
}


get_mono_signal_codes (int signals)
{
  int D.6511;
  int D.6514;
  int D.6517;
  int D.6520;
  int D.6523;
  MonoSerialSignal D.6526;
  MonoSerialSignal retval;

  retval = 0;
  D.6511 = signals & 64;
  if (D.6511 != 0) goto <D.6512>; else goto <D.6513>;
  <D.6512>:
  retval = retval | 1;
  <D.6513>:
  D.6514 = signals & 32;
  if (D.6514 != 0) goto <D.6515>; else goto <D.6516>;
  <D.6515>:
  retval = retval | 2;
  <D.6516>:
  D.6517 = signals & 256;
  if (D.6517 != 0) goto <D.6518>; else goto <D.6519>;
  <D.6518>:
  retval = retval | 4;
  <D.6519>:
  D.6520 = signals & 2;
  if (D.6520 != 0) goto <D.6521>; else goto <D.6522>;
  <D.6521>:
  retval = retval | 8;
  <D.6522>:
  D.6523 = signals & 4;
  if (D.6523 != 0) goto <D.6524>; else goto <D.6525>;
  <D.6524>:
  retval = retval | 16;
  <D.6525>:
  D.6526 = retval;
  return D.6526;
}


set_signal (int fd, MonoSerialSignal signal, gboolean value)
{
  int D.6528;
  gint32 D.6531;
  int signals.4;
  int D.6533;
  _Bool D.6534;
  int signals.5;
  int D.6541;
  int signals.6;
  int D.6543;
  int signals;
  int expected;
  int activated;

  try
    {
      expected = get_signal_code (signal);
      D.6528 = ioctl (fd, 21525, &signals);
      if (D.6528 == -1) goto <D.6529>; else goto <D.6530>;
      <D.6529>:
      D.6531 = -1;
      return D.6531;
      <D.6530>:
      signals.4 = signals;
      D.6533 = signals.4 & expected;
      D.6534 = D.6533 != 0;
      activated = (int) D.6534;
      if (activated == value) goto <D.6535>; else goto <D.6536>;
      <D.6535>:
      D.6531 = 1;
      return D.6531;
      <D.6536>:
      if (value != 0) goto <D.6537>; else goto <D.6538>;
      <D.6537>:
      signals.4 = signals;
      signals.5 = signals.4 | expected;
      signals = signals.5;
      goto <D.6540>;
      <D.6538>:
      D.6541 = ~expected;
      signals.4 = signals;
      signals.6 = D.6541 & signals.4;
      signals = signals.6;
      <D.6540>:
      D.6543 = ioctl (fd, 21528, &signals);
      if (D.6543 == -1) goto <D.6544>; else goto <D.6545>;
      <D.6544>:
      D.6531 = -1;
      return D.6531;
      <D.6545>:
      D.6531 = 1;
      return D.6531;
    }
  finally
    {
      signals = {CLOBBER};
    }
}


get_signal_code (MonoSerialSignal signal)
{
  gint32 D.6548;

  switch (signal) <default: <D.6335>, case 1: <D.6330>, case 2: <D.6331>, case 4: <D.6332>, case 8: <D.6333>, case 16: <D.6334>>
  <D.6330>:
  D.6548 = 64;
  return D.6548;
  <D.6331>:
  D.6548 = 32;
  return D.6548;
  <D.6332>:
  D.6548 = 256;
  return D.6548;
  <D.6333>:
  D.6548 = 2;
  return D.6548;
  <D.6334>:
  D.6548 = 4;
  return D.6548;
  <D.6335>:
  D.6548 = 0;
  return D.6548;
  D.6548 = 0;
  return D.6548;
}


breakprop (int fd)
{
  int D.6550;

  D.6550 = tcsendbreak (fd, 0);
  return D.6550;
}


poll_serial (int fd, gint32 * error, int timeout)
{
  int * D.6552;
  int D.6553;
  gboolean D.6556;
  int D.6557;
  short int D.6559;
  int D.6560;
  int D.6561;
  _Bool D.6562;
  struct pollfd pinfo;

  try
    {
      *error = 0;
      pinfo.fd = fd;
      pinfo.events = 1;
      pinfo.revents = 0;
      goto <D.6363>;
      <D.6362>:
      D.6552 = __errno_location ();
      D.6553 = *D.6552;
      if (D.6553 != 4) goto <D.6554>; else goto <D.6555>;
      <D.6554>:
      *error = -1;
      D.6556 = 0;
      return D.6556;
      <D.6555>:
      <D.6363>:
      D.6557 = poll (&pinfo, 1, timeout);
      if (D.6557 == -1) goto <D.6558>; else goto <D.6364>;
      <D.6558>:
      D.6552 = __errno_location ();
      D.6553 = *D.6552;
      if (D.6553 == 4) goto <D.6362>; else goto <D.6364>;
      <D.6364>:
      D.6559 = pinfo.revents;
      D.6560 = (int) D.6559;
      D.6561 = D.6560 & 1;
      D.6562 = D.6561 != 0;
      D.6556 = (gboolean) D.6562;
      return D.6556;
    }
  finally
    {
      pinfo = {CLOBBER};
    }
}


list_serial_devices ()
{
  void * D.6565;

  D.6565 = 0B;
  return D.6565;
}


