diff options
| -rw-r--r-- | xup/xup.c | 115 | ||||
| -rw-r--r-- | xup/xup.h | 1 | 
2 files changed, 113 insertions, 3 deletions
| @@ -116,6 +116,7 @@ lib_mod_start(struct mod* mod, int w, int h, int bpp)    DEBUG(("in lib_mod_start\r\n"));    mod->width = w;    mod->height = h; +  mod->bpp = bpp;    DEBUG(("out lib_mod_start\r\n"));    return 0;  } @@ -127,7 +128,14 @@ lib_mod_connect(struct mod* mod)  {    int error;    int len; +  int display; +  int i; +  int version; +  int size; +  int code; +  int ok;    struct stream* s; +  char con_port[256];    DEBUG(("in lib_mod_connect\r\n"));    /* clear screen */ @@ -135,9 +143,106 @@ lib_mod_connect(struct mod* mod)    mod->server_set_fgcolor(mod, 0);    mod->server_fill_rect(mod, 0, 0, mod->width, mod->height);    mod->server_end_update(mod); +  mod->server_msg(mod, "started connecting", 0); +  /* only support 8 and 16 bpp connections from rdp client */ +  if (mod->bpp != 8 && mod->bpp != 16) +  { +    mod->server_msg(mod, +      "error - only supporting 8 and 16 bpp rdp connections", 0); +    return 1; +  } +  if (g_strncmp(mod->ip, "", 1) == 0) +  { +    mod->server_msg(mod, "error - no ip set", 0); +    return 1; +  } +  make_stream(s); +  /* if port = -1, use sesman to get port / desktop */ +  if (g_strncmp(mod->port, "-1", 2) == 0) +  { +    display = 0; +    error = 0; +    init_stream(s, 8192); +    mod->sck = g_tcp_socket(); +    mod->sck_closed = 0; +    mod->server_msg(mod, "connecting to sesman", 0); +    if (g_tcp_connect(mod->sck, mod->ip, "3350") == 0) +    { +      g_tcp_set_non_blocking(mod->sck); +      g_tcp_set_no_delay(mod->sck); +      s_push_layer(s, channel_hdr, 8); +      out_uint16_be(s, 10); // code +      i = g_strlen(mod->username); +      out_uint16_be(s, i); +      out_uint8a(s, mod->username, i); +      i = g_strlen(mod->password); +      out_uint16_be(s, i); +      out_uint8a(s, mod->password, i); +      out_uint16_be(s, mod->width); +      out_uint16_be(s, mod->height); +      out_uint16_be(s, mod->bpp); +      s_mark_end(s); +      s_pop_layer(s, channel_hdr); +      out_uint32_be(s, 0); // version +      out_uint32_be(s, s->end - s->data); // size +      mod->server_msg(mod, "sending login info to sesman", 0); +      error = lib_send(mod, s->data, s->end - s->data); +      if (error == 0) +      { +        init_stream(s, 8192); +        mod->server_msg(mod, "receiving sesman header", 0); +        error = lib_recv(mod, s->data, 8); +      } +      if (error == 0) +      { +        in_uint32_be(s, version); +        in_uint32_be(s, size); +        init_stream(s, 8192); +        mod->server_msg(mod, "receiving sesman data", 0); +        error = lib_recv(mod, s->data, size - 8); +      } +      if (error == 0) +      { +        if (version == 0) +        { +          in_uint16_be(s, code); +          if (code == 3) +          { +            in_uint16_be(s, ok); +            if (ok) +            { +              in_uint16_be(s, display); +            } +            else +            { +              in_uint8s(s, 2); +              mod->server_msg(mod, "error - sesman returned no", 0); +            } +          } +        } +      } +    } +    else +    { +      mod->server_msg(mod, "error - connecting to sesman", 0); +    } +    g_tcp_close(mod->sck); +    if (error != 0 || display == 0) +    { +      mod->server_msg(mod, "error - connection failed", 0); +      free_stream(s); +      return 1; +    } +    mod->server_msg(mod, "sesman started a session", 0); +    g_sprintf(con_port, "%d", 6200 + display); +  } +  else +  { +    g_sprintf(con_port, "%s", mod->port); +  }    mod->sck = g_tcp_socket();    mod->sck_closed = 0; -  error = g_tcp_connect(mod->sck, "127.0.0.1", "6210"); +  error = g_tcp_connect(mod->sck, mod->ip, con_port);    if (error == 0)    {      g_tcp_set_non_blocking(mod->sck); @@ -145,7 +250,6 @@ lib_mod_connect(struct mod* mod)    }    if (error == 0)    { -    make_stream(s);      init_stream(s, 8192);      s_push_layer(s, iso_hdr, 4);      out_uint16_le(s, 103); @@ -159,9 +263,14 @@ lib_mod_connect(struct mod* mod)      s_pop_layer(s, iso_hdr);      out_uint32_le(s, len);      lib_send(mod, s->data, len); -    free_stream(s);    } +  free_stream(s);    DEBUG(("out lib_mod_connect error\r\n")); +  if (error != 0) +  { +    mod->server_msg(mod, "some problem", 0); +    return 1; +  }    return 0;  } @@ -78,6 +78,7 @@ struct mod    /* mod data */    int width;    int height; +  int bpp;    int sck_closed;    char username[256];    char password[256]; | 
