File: sidl_net.c

package info (click to toggle)
babel 0.10.2-1
  • links: PTS
  • area: contrib
  • in suites: sarge
  • size: 43,932 kB
  • ctags: 29,707
  • sloc: java: 74,695; ansic: 73,142; cpp: 40,649; sh: 18,411; f90: 10,062; fortran: 6,727; python: 6,406; makefile: 3,866; xml: 118; perl: 48
file content (86 lines) | stat: -rw-r--r-- 1,952 bytes parent folder | download
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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "sidl_net.h"


struct sidl_net_Connection* sidl_net_Connection__create( /*in*/ const char* url ) { 
  struct sidl_net_Connection *conn = malloc(sizeof(struct sidl_net_Connection));
  int end = strlen(url), 
      i = 0, start = i,
      size;

  /* extract protocol name */
  while ((i < end) && (url[i] != ':')) {
    i++;
  }

  if ((i == start) || (i == end)) {
    printf("ERROR: invalid URL format\n");
    exit(2);
  }

  /* printf("i = %i\n", i); */
  size = i - start;
  conn->protocol = malloc(size + 1);
  memset(conn->protocol, 0 , size + 1);
  strncpy(conn->protocol, url + start, size);

  /* printf("protocol:    %s\n", conn->protocol); */

  /* extract server name   */
  i += 3; /* skip the double slashes */
  start = i;
  while ((i < end) && (url[i] != ':')) {
    i++;
  }

  if ((i == start) || (i == end)) {
    printf("ERROR: invalid URL format\n");
    exit(2);
  }

  size = i - start;
  conn->server_name = malloc(size + 1);
  memset(conn->server_name, 0 , size + 1);
  strncpy(conn->server_name, url + start, size);

  /* printf("server_name: %s\n", conn->server_name); */

  /* extract port number */

  i++; /* skip the colon */
  start = i;
  while ((i < end) && (url[i] != '/')) {
    if ((url[i] < 48) || (url[i] > 57))
      printf("ERROR: invalid URL format\n");
    i++;
  }

  conn->port = atoi(url + start);

  /* printf("port:        %i\n", conn->port); */

  /* extract path */

  i++; /* skip the single slash */
  start = i;

  if (i < end) {
    size = end - start;
    conn->path = malloc(size + 1);
    memset(conn->path, 0 , size + 1);
    strcpy(conn->path, url + start);
    /* printf("path:        %s\n", conn->path); */
  }

  return conn;
}

void sidl_net_Connection__destroy( /*in*/ struct sidl_net_Connection* conn ) { 
  free(conn->protocol);
  free(conn->server_name);
  free(conn->path);
  free(conn->session_id);
  free(conn);
}