#include <string.h>
#include "smasi_pdu.h"
#include "smasi_pdu.def"
 
Go to the source code of this file.
 | 
| #define  | NONTERMINATED(name)   p->name = NULL; | 
|   | 
| #define  | COMATERMINATED(name)   p->name = NULL; | 
|   | 
| #define  | PDU(name,  id,  fields) | 
|   | 
| #define  | NONTERMINATED(name)   octstr_destroy(p->name); | 
|   | 
| #define  | COMATERMINATED(name)   octstr_destroy(p->name); | 
|   | 
| #define  | PDU(name,  id,  fields)   case id: { struct name *p = &pdu->u.name; fields } break; | 
|   | 
| #define  | NONTERMINATED(name)   p = *(&p); | 
|   | 
| #define  | COMATERMINATED(name)   p = *(&p); | 
|   | 
| #define  | PDU(name,  id,  fields)   case id: { struct name *p = &pdu->u.name; fields } break; | 
|   | 
| #define  | NONTERMINATED(name)   p = *(&p); | 
|   | 
| #define  | COMATERMINATED(name) | 
|   | 
| #define  | PDU(name,  id,  fields)   case id: { struct name *p = &pdu->u.name; fields } break; | 
|   | 
| #define  | NONTERMINATED(name)   p = *(&p); | 
|   | 
| #define  | COMATERMINATED(name)   p = *(&p); | 
|   | 
| #define  | PDU(name,  id,  fields)   else if (strcmp(type_name, #name) == 0) type = id; | 
|   | 
| #define  | NONTERMINATED(name)   p = *(&p); | 
|   | 
| #define  | COMATERMINATED(name) | 
|   | 
| #define  | PDU(name,  id,  fields) | 
|   | 
| #define  | NONTERMINATED(name)   p = *(&p); | 
|   | 
| #define  | COMATERMINATED(name)   octstr_dump_short(p->name, 2, #name); | 
|   | 
| #define  | PDU(name,  id,  fields)   case id: { struct name *p = &pdu->u.name; fields } break; | 
|   | 
◆ COMATERMINATED [1/7]
      
        
          | #define COMATERMINATED | 
          ( | 
            | 
          name | ) | 
             p->name = NULL; | 
        
      
 
 
◆ COMATERMINATED [2/7]
◆ COMATERMINATED [3/7]
      
        
          | #define COMATERMINATED | 
          ( | 
            | 
          name | ) | 
             p = *(&p); | 
        
      
 
 
◆ COMATERMINATED [4/7]
      
        
          | #define COMATERMINATED | 
          ( | 
            | 
          name | ) | 
           | 
        
      
 
Value:    octstr_append_char(os, '='); \
    octstr_append(os, p->name); \
    octstr_append_char(os, ','); }
void octstr_append_cstr(Octstr *ostr, const char *cstr)
 
 
 
 
◆ COMATERMINATED [5/7]
      
        
          | #define COMATERMINATED | 
          ( | 
            | 
          name | ) | 
             p = *(&p); | 
        
      
 
 
◆ COMATERMINATED [6/7]
      
        
          | #define COMATERMINATED | 
          ( | 
            | 
          name | ) | 
           | 
        
      
 
Value:#define octstr_duplicate(ostr)
 
int octstr_str_compare(const Octstr *ostr, const char *str)
 
 
 
 
◆ COMATERMINATED [7/7]
◆ NONTERMINATED [1/7]
      
        
          | #define NONTERMINATED | 
          ( | 
            | 
          name | ) | 
             p->name = NULL; | 
        
      
 
 
◆ NONTERMINATED [2/7]
◆ NONTERMINATED [3/7]
      
        
          | #define NONTERMINATED | 
          ( | 
            | 
          name | ) | 
             p = *(&p); | 
        
      
 
 
◆ NONTERMINATED [4/7]
      
        
          | #define NONTERMINATED | 
          ( | 
            | 
          name | ) | 
             p = *(&p); | 
        
      
 
 
◆ NONTERMINATED [5/7]
      
        
          | #define NONTERMINATED | 
          ( | 
            | 
          name | ) | 
             p = *(&p); | 
        
      
 
 
◆ NONTERMINATED [6/7]
      
        
          | #define NONTERMINATED | 
          ( | 
            | 
          name | ) | 
             p = *(&p); | 
        
      
 
 
◆ NONTERMINATED [7/7]
      
        
          | #define NONTERMINATED | 
          ( | 
            | 
          name | ) | 
             p = *(&p); | 
        
      
 
 
◆ PDU [1/7]
      
        
          | #define PDU | 
          ( | 
            | 
          name,  | 
        
        
           | 
           | 
            | 
          id,  | 
        
        
           | 
           | 
            | 
          fields  | 
        
        
           | 
          ) | 
           |  | 
        
      
 
Value:case id: { \
        struct 
name *p = &pdu->u.name; \
        pdu->type_name = #
name; \
        fields \
    } break;
 
 
 
◆ PDU [2/7]
      
        
          | #define PDU | 
          ( | 
            | 
          name,  | 
        
        
           | 
           | 
            | 
          id,  | 
        
        
           | 
           | 
            | 
          fields  | 
        
        
           | 
          ) | 
           |    case id: { struct name *p = &pdu->u.name; fields } break; | 
        
      
 
 
◆ PDU [3/7]
      
        
          | #define PDU | 
          ( | 
            | 
          name,  | 
        
        
           | 
           | 
            | 
          id,  | 
        
        
           | 
           | 
            | 
          fields  | 
        
        
           | 
          ) | 
           |    case id: { struct name *p = &pdu->u.name; fields } break; | 
        
      
 
 
◆ PDU [4/7]
      
        
          | #define PDU | 
          ( | 
            | 
          name,  | 
        
        
           | 
           | 
            | 
          id,  | 
        
        
           | 
           | 
            | 
          fields  | 
        
        
           | 
          ) | 
           |    case id: { struct name *p = &pdu->u.name; fields } break; | 
        
      
 
 
◆ PDU [5/7]
      
        
          | #define PDU | 
          ( | 
            | 
          name,  | 
        
        
           | 
           | 
            | 
          id,  | 
        
        
           | 
           | 
            | 
          fields  | 
        
        
           | 
          ) | 
           |    else if (strcmp(type_name, #name) == 0) type = id; | 
        
      
 
 
◆ PDU [6/7]
      
        
          | #define PDU | 
          ( | 
            | 
          name,  | 
        
        
           | 
           | 
            | 
          id,  | 
        
        
           | 
           | 
            | 
          fields  | 
        
        
           | 
          ) | 
           |  | 
        
      
 
Value:case id: { \
            Octstr * field_name = NULL; \
            Octstr * field_value = NULL; \
            struct 
name *p = &pdu->u.name; \
                if (field_name == NULL) break; \
                if (field_value == NULL) 
continue; 
\                octstr_destroy(field_value); \
            } \
        } break;
static Octstr * copy_until_coma(Octstr *os, long *pos)
 
void octstr_destroy(Octstr *ostr)
 
static Octstr * copy_until_assign(Octstr *os, long *pos)
 
long octstr_len(const Octstr *ostr)
 
 
 
 
◆ PDU [7/7]
      
        
          | #define PDU | 
          ( | 
            | 
          name,  | 
        
        
           | 
           | 
            | 
          id,  | 
        
        
           | 
           | 
            | 
          fields  | 
        
        
           | 
          ) | 
           |    case id: { struct name *p = &pdu->u.name; fields } break; | 
        
      
 
 
◆ copy_until_assign()
  
  
      
        
          | static Octstr* copy_until_assign  | 
          ( | 
          Octstr *  | 
          os,  | 
         
        
           | 
           | 
          long *  | 
          pos  | 
         
        
           | 
          ) | 
           |  | 
         
       
   | 
  
static   | 
  
 
Definition at line 104 of file smasi_pdu.c.
References octstr_copy, octstr_get_cstr, octstr_len(), octstr_search_char(), and warning().
  110     if (nul == -1 && (
octstr_len(os) - *pos) > 1) {
 #define octstr_get_cstr(ostr)
 
#define octstr_copy(ostr, from, len)
 
long octstr_search_char(const Octstr *ostr, int ch, long pos)
 
void warning(int err, const char *fmt,...)
 
long octstr_len(const Octstr *ostr)
 
 
 
 
◆ copy_until_coma()
◆ decode_type()
◆ skip_until_after_colon()
  
  
      
        
          | static void skip_until_after_colon  | 
          ( | 
          Octstr *  | 
          os,  | 
         
        
           | 
           | 
          long *  | 
          pos  | 
         
        
           | 
          ) | 
           |  | 
         
       
   | 
  
static   | 
  
 
 
◆ smasi_pdu_create()
      
        
          | SMASI_PDU* smasi_pdu_create  | 
          ( | 
          unsigned long  | 
          type | ) | 
           | 
        
      
 
Definition at line 132 of file smasi_pdu.c.
References SMASI_PDU::type, type, and warning().
Referenced by handle_pdu(), msg_to_pdu(), open_connection(), send_enquire_link(), send_logoff(), and smasi_pdu_unpack().
  136     pdu = gw_malloc(
sizeof(*pdu));
   140     #define NONTERMINATED(name) p->name = NULL;   141     #define COMATERMINATED(name) p->name = NULL;   142     #define PDU(name, id, fields) \   144         struct name *p = &pdu->u.name; \   145         pdu->type_name = #name; \   146         pdu->needs_hyphen = (id < SMASI_HYPHEN_ID ? 1 : 0); \   151         warning(0, 
"Unknown SMASI_PDU type, internal error.");
 
void warning(int err, const char *fmt,...)
 
 
 
 
◆ smasi_pdu_destroy()
Definition at line 160 of file smasi_pdu.c.
References error(), and SMASI_PDU::type.
Referenced by handle_pdu(), open_connection(), send_enquire_link(), send_logoff(), send_messages(), and smasi_thread().
  166     #define NONTERMINATED(name) octstr_destroy(p->name);   167     #define COMATERMINATED(name) octstr_destroy(p->name);   168     #define PDU(name, id, fields) \   169         case id: { struct name *p = &pdu->u.name; fields } break;   172         error(0, 
"Unknown SMASI_PDU type, internal error while destroying.");
 void error(int err, const char *fmt,...)
 
 
 
 
◆ smasi_pdu_dump()
Definition at line 280 of file smasi_pdu.c.
References debug(), and warning().
Referenced by dump_pdu().
  282     debug(
"sms.smasi", 0, 
"SMASI PDU %p dump:", (
void *) pdu);
   285     #define NONTERMINATED(name) p = *(&p);   286     #define COMATERMINATED(name) \   287     octstr_dump_short(p->name, 2, #name);   288     #define PDU(name, id, fields) \   289         case id: { struct name *p = &pdu->u.name; fields } break;   292         warning(0, 
"Unknown SMASI_PDU type, internal error.");
   295     debug(
"sms.smasi", 0, 
"SMASI PDU dump ends.");
 
void warning(int err, const char *fmt,...)
 
void debug(const char *place, int err, const char *fmt,...)
 
 
 
 
◆ smasi_pdu_pack()
Definition at line 178 of file smasi_pdu.c.
References error(), SMASI_PDU::needs_hyphen, octstr_append_char(), octstr_append_cstr(), octstr_create, octstr_destroy(), octstr_insert(), SMASI_PDU::type, and SMASI_PDU::type_name.
Referenced by send_enquire_link(), send_logoff(), and send_pdu().
  189     #define NONTERMINATED(name) p = *(&p);   190     #define COMATERMINATED(name) p = *(&p);   191     #define PDU(name, id, fields) \   192         case id: { struct name *p = &pdu->u.name; fields } break;   195         error(0, 
"Unknown SMASI_PDU type, internal error while packing.");
   199     #define NONTERMINATED(name) p = *(&p);   200     #define COMATERMINATED(name) \   201     if (p->name != NULL) { octstr_append_cstr(os, #name); \   202     octstr_append_char(os, '='); \   203     octstr_append(os, p->name); \   204     octstr_append_char(os, ','); }   205     #define PDU(name, id, fields) \   206         case id: { struct name *p = &pdu->u.name; fields } break;   209         error(0, 
"Unknown SMASI_PDU type, internal error while packing.");
 void error(int err, const char *fmt,...)
 
unsigned int needs_hyphen
 
void octstr_append_char(Octstr *ostr, int ch)
 
void octstr_append_cstr(Octstr *ostr, const char *cstr)
 
void octstr_insert(Octstr *ostr1, const Octstr *ostr2, long pos)
 
void octstr_destroy(Octstr *ostr)
 
#define octstr_create(cstr)
 
 
 
 
◆ smasi_pdu_read()
◆ smasi_pdu_unpack()
Definition at line 223 of file smasi_pdu.c.
References decode_type(), octstr_destroy(), octstr_get_cstr, skip_until_after_colon(), smasi_pdu_create(), type, and warning().
Referenced by read_pdu().
  229     unsigned long type = 0;
   235     if (strcmp(type_name, 
"dummy") == 0) 
type = 0;
   236     #define NONTERMINATED(name) p = *(&p);   237     #define COMATERMINATED(name) p = *(&p);   238     #define PDU(name, id, fields) \   239     else if (strcmp(type_name, #name) == 0) type = id;   241     else warning(0, 
"unknown SMASI PDU type");
   244     if (pdu == NULL) 
return NULL;
   250     #define NONTERMINATED(name) p = *(&p);   251     #define COMATERMINATED(name) \   252                 if (octstr_str_compare(field_name, #name) == 0 && field_value != NULL) \   253                     p->name = octstr_duplicate(field_value);   254     #define PDU(name, id, fields) \   256             Octstr * field_name = NULL; \   257             Octstr * field_value = NULL; \   258             struct name *p = &pdu->u.name; \   259             while (pos < octstr_len(data_without_len)) { \   260                 field_name = copy_until_assign(data_without_len, &pos); \   261                 if (field_name == NULL) break; \   262                 field_value = copy_until_coma(data_without_len, &pos); \   263                 if (field_value == NULL) continue; \   265                 octstr_destroy(field_name); \   266                 octstr_destroy(field_value); \   271         warning(0, 
"Unknown SMASI_PDU type, internal error while unpacking.");
 static Octstr * decode_type(Octstr *os)
 
SMASI_PDU * smasi_pdu_create(unsigned long type)
 
#define octstr_get_cstr(ostr)
 
static void skip_until_after_colon(Octstr *os, long *pos)
 
void warning(int err, const char *fmt,...)
 
void octstr_destroy(Octstr *ostr)