/* * Create a new socket of type TYPE in domain DOMAIN, using * protocol PROTOCOL. If PROTOCOL is zero, one is chosen automatically. * Returns a file descriptor for the new socket, or -1 for errors. * * swift: PROTOCOL is IPPROTO_SWIFT. Ignore TYPE. */ int sw_socket(int __domain, int __type, int __protocol) { int s; int rc; if (__domain != PF_INET || __type != SOCK_DGRAM || __protocol != IPPROTO_SWIFT) { errno = EINVAL; goto sock_err; } s = socket(PF_INET, SOCK_RAW, IPPROTO_SWIFT); if (s < 0) { goto sock_err; } rc = sm_add(s); if (rc < 0) { errno = ENOMEM; goto list_add_err; } /* Socket is not bound. */ sm_mark_unbound(s); return s; list_add_err: close(s); sock_err: return -1; }
/** * Add a single sequence-to-unicode path to the state machine. */ static int sm_add(STATE_MACHINE* sm, char* seq, const wchar_t* unicode, char flag) { STATE_MACHINE* sm_found = sm_search_shallow(sm, seq[0]); /* Empty sequence */ if(seq[0] == '\0') { if(wcslen(sm->output)) { size_t i; fprintf(stderr, "Unicode sequence "); for(i = 0; i < wcslen(sm->output); i++) fprintf(stderr, "%04X ", (int)sm->output[i]); fprintf(stderr, " already defined, overriding with "); for(i = 0; i < wcslen(unicode); i++) fprintf(stderr, "%04X ", (int)unicode[i]); fprintf(stderr, "\n"); } wcscpy(sm->output, unicode); sm->flag = flag; return 0; } /* The key doesn't exist yet */ if(!sm_found) { int index = (int)sm->next_size; SM_WITH_KEY* next = &sm->next[index]; /* Add the key */ next->key = seq[0]; next->state = malloc(sizeof(STATE_MACHINE)); if(!next->state) { perror("sm_add"); return 1; } sm_init(next->state); /* Increase store for next time, if necessary */ if(++(sm->next_size) >= sm->next_maxsize) { if(sm_dblspace(sm)) { fprintf(stderr, "Memory expansion failure\n"); return 1; } } sm_found = next->state; } /* Recurse */ sm_add(sm_found, seq+1, unicode, flag); /* Sort the states */ sm_sort_shallow(sm); return 0; }
/** * Add a character-sequence-to-unicode mapping to the character map. * * @param cm Character map to which to add the mapping. * @param section The section of the character map to add the mapping. * @param seq The character sequence to which to add the mapping. * @param unicode The unicode of the character sequence. * @param flag The flag associated with this state, if any. * * @return 0 if no error, 1 if error. */ static int charmap_add(CHARMAP* cm, int section, char* seq, const wchar_t* unicode, char* flag) { if(section >= MAX_SECTIONS) { fprintf(stderr, "Section count exceeded\n"); return 1; } /* For now, we only utilize one-character flags */ if(strlen(flag) > 1) { fprintf(stderr, "%04X: Multi-character flag, truncated.\n", (int)unicode); } return sm_add(&cm->sections[section], seq, unicode, flag[0]); }