18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* misc.c - Miscellaneous library functions */
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* Written 1997-2000 by Werner Almesberger, EPFL-ICA/ICA */
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if HAVE_CONFIG_H
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <config.h>
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdint.h>
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdarg.h>
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <string.h>
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/socket.h>
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/ioctl.h>
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <netinet/in.h> /* for htons */
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <atm.h>
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <atmsap.h>
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint __atmlib_fetch(const char **pos,...)
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    const char *value;
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int ref_len,best_len,len;
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int i,best;
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_list ap;
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_start(ap,pos);
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ref_len = strlen(*pos);
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    best_len = 0;
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    best = -1;
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    for (i = 0; (value = va_arg(ap,const char *)); i++) {
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	len = strlen(value);
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (*value != '!' && len <= ref_len && len > best_len &&
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	  !strncasecmp(*pos,value,len)) {
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    best = i;
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    best_len = len;
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    va_end(ap);
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (best > -1) (*pos) += best_len;
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return best;
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid atm_tcpip_port_mapping(char *vs_id,uint8_t protocol,uint16_t port)
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    memcpy(vs_id,ATM_FORUM_OUI "\x01",4);
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    vs_id[4] = protocol; /* e.g. IP_TCP or IP_UDP; from netinet/protocols.h */
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    vs_id[5] = (htons(port) >> 8) & 255;
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    vs_id[6] = htons(port) & 255;
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
52