/** * \brief Parse the tail of Dialogue line * \param track track * \param event parsed data goes here * \param str string to parse, zero-terminated * \param n_ignored number of format options to skip at the beginning */ static int process_event_tail(ASS_Track *track, ASS_Event *event, char *str, int n_ignored) { char *token; char *tname; char *p = str; int i; ASS_Event *target = event; char *format = strdup(track->event_format); char *q = format; // format scanning pointer if (track->n_styles == 0) { // add "Default" style to the end // will be used if track does not contain a default style (or even does not contain styles at all) int sid = ass_alloc_style(track); set_default_style(&track->styles[sid]); track->default_style = sid; } for (i = 0; i < n_ignored; ++i) { NEXT(q, tname); } while (1) { NEXT(q, tname); if (strcasecmp(tname, "Text") == 0) { char *last; event->Text = strdup(p); if (*event->Text != 0) { last = event->Text + strlen(event->Text) - 1; if (last >= event->Text && *last == '\r') *last = 0; } ass_msg(track->library, MSGL_DBG2, "Text = %s", event->Text); event->Duration -= event->Start; free(format); return 0; // "Text" is always the last } NEXT(p, token); ALIAS(End, Duration) // temporarily store end timecode in event->Duration if (0) { // cool ;) INTVAL(Layer) STYLEVAL(Style) STRVAL(Name) STRVAL(Effect) INTVAL(MarginL) INTVAL(MarginR) INTVAL(MarginV) TIMEVAL(Start) TIMEVAL(Duration) } } free(format); return 1; }
void sort_queue_list(t_list **begin) { t_list *p; t_list *swap; p = *begin; while ((*begin)->next) { if (TIMEVAL(((t_queue*)(*begin)->data)->time)->tv_sec > TIMEVAL(((t_queue*)(*begin)->next->data)->time)->tv_sec || (TIMEVAL(((t_queue*)(*begin)->data)->time)->tv_sec == TIMEVAL(((t_queue*)(*begin)->next->data)->time)->tv_sec && TIMEVAL(((t_queue*)(*begin)->data)->time)->tv_usec > TIMEVAL(((t_queue*)(*begin)->next->data)->time)->tv_usec)) { swap = (*begin)->next->data; (*begin)->next->data = (*begin)->data; (*begin)->data = swap; *begin = p; } else *begin = (*begin)->next; } *begin = p; }
#include <callout.h> #include <sched.h> #include <timer.h> #include <sysinit.h> static timeval_t tick = TIMEVAL(0.001); static void clock(timer_event_t *tev) { systime_t st = tv2st(tev->tev_when); tev->tev_when = timeval_add(&tev->tev_when, &tick); cpu_timer_add_event(tev); callout_process(st); sched_clock(); } static timer_event_t *clock_event = &(timer_event_t){.tev_func = clock}; static void clock_init(void) { timeval_t now = get_uptime(); clock_event->tev_when = timeval_add(&now, &tick); cpu_timer_add_event(clock_event); } SYSINIT_ADD(clock, clock_init, DEPS("sched", "callout"));
void wifi_pcap_callback(u_char* av, const struct pcap_pkthdr * pkthdr, const u_char * pkt) { ieee80211_header_t mac_header; prism2_header_t prism2_header; u_int8_t dir, type, subtype; ovm_var_t **attr; DebugLog(DF_MOD, DS_TRACE, "wifi_pcap_callback()\n"); attr = (ovm_var_t **) av; if (datalink_type == DLT_PRISM_HEADER) { prism2_header = (prism2_header_t) pkt; mac_header = (ieee80211_header_t) (pkt + 144); attr[F_RSSI] = ovm_int_new(); INT(attr[F_RSSI]) = (&(prism2_header->rssi))->data; } else { return ; } /* fixation du champ .wifi.time */ attr[F_TIME] = ovm_timeval_new(); attr[F_TIME]->flags |= TYPE_MONO; gettimeofday( &(TIMEVAL(attr[F_TIME])) , NULL); type = mac_header->fc[0] & 0x0c; subtype = mac_header->fc[0] & SUBTYPE_MASK; dir = mac_header->fc[1] & DIR_MASK; switch (type) { /******************** Dans le cas d'une trame de gestion */ case TYPE_MGT: attr[F_TYPE] = ovm_str_new(strlen("management")); memcpy(STR(attr[F_TYPE]), "management", STRLEN(attr[F_TYPE])); /* fixation du champ .wifi.seqnum */ attr[F_SEQNUM] = ovm_int_new(); INT(attr[F_SEQNUM]) = (int) (mac_header->seqnum & SEQ_MASK) \ >> SEQ_SHIFT; /* addr1 = DA addr2 = SA addr3 = BSSID */ GETADDR(mac_header->addr1, attr[F_DA]); GETADDR(mac_header->addr2, attr[F_SA]); GETADDR(mac_header->addr3, attr[F_BSSID]); switch(subtype) { case SUBTYPE_ASSOC_REQ: attr[F_SUBTYPE] = ovm_str_new(strlen("assocreq")); memcpy(STR(attr[F_SUBTYPE]), "assocreq", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_ASSOC_RESP: attr[F_SUBTYPE] = ovm_str_new(strlen("assocresp")); memcpy(STR(attr[F_SUBTYPE]), "assocresp", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_PROBE_REQ: attr[F_SUBTYPE] = ovm_str_new(strlen("probereq")); memcpy(STR(attr[F_SUBTYPE]), "probereq", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_PROBE_RESP: attr[F_SUBTYPE] = ovm_str_new(strlen("proberesp")); memcpy(STR(attr[F_SUBTYPE]), "proberesp", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_BEACON: attr[F_SUBTYPE] = ovm_str_new(strlen("beacon")); memcpy(STR(attr[F_SUBTYPE]), "beacon", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_DISASSOC: attr[F_SUBTYPE] = ovm_str_new(strlen("disassoc")); memcpy(STR(attr[F_SUBTYPE]), "disassoc", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_AUTH: attr[F_SUBTYPE] = ovm_str_new(strlen("auth")); memcpy(STR(attr[F_SUBTYPE]), "auth", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_DEAUTH: attr[F_SUBTYPE] = ovm_str_new(strlen("deauth")); memcpy(STR(attr[F_SUBTYPE]), "deauth", STRLEN(attr[F_SUBTYPE])); break; default: DebugLog(DF_MOD, DS_DEBUG, "unknown_80211_mgmt_subtype_0x%.2x\n", subtype); attr[F_SUBTYPE] = ovm_str_new(strlen("unknown_mgmt_subtype")); memcpy(STR(attr[F_SUBTYPE]), "unknown_mgmt_subtype", STRLEN(attr[F_SUBTYPE])); } /* end switch(subtype) */ break; /******************** Dans le cas d'une trame de controle */ case TYPE_CTL: attr[F_TYPE] = ovm_str_new(strlen("control")); memcpy(STR(attr[F_TYPE]), "control", STRLEN(attr[F_TYPE])); switch(subtype) { case SUBTYPE_RTS: attr[F_SUBTYPE] = ovm_str_new(strlen("rts")); memcpy(STR(attr[F_SUBTYPE]), "rts", STRLEN(attr[F_SUBTYPE])); GETADDR(mac_header->addr1, attr[F_RA]); GETADDR(mac_header->addr2, attr[F_TA]); break; case SUBTYPE_CTS: attr[F_SUBTYPE] = ovm_str_new(strlen("cts")); memcpy(STR(attr[F_SUBTYPE]), "cts", STRLEN(attr[F_SUBTYPE])); GETADDR(mac_header->addr1, attr[F_RA]); break; case SUBTYPE_ACK: attr[F_SUBTYPE] = ovm_str_new(strlen("ack")); memcpy(STR(attr[F_SUBTYPE]), "ack", STRLEN(attr[F_SUBTYPE])); GETADDR(mac_header->addr1, attr[F_RA]); break; default: DebugLog(DF_MOD, DS_DEBUG, "unknown_80211_ctl_subtype_0x%.2x\n", subtype); attr[F_SUBTYPE] = ovm_str_new(strlen("unknown_ctl_subtype")); memcpy(STR(attr[F_SUBTYPE]), "unknown_ctl_subtype", STRLEN(attr[F_SUBTYPE])); }; /* end switch(subtype) */ break; /******************** Dans le cas d'une trame de donnees */ case TYPE_DATA: attr[F_TYPE] = ovm_str_new(strlen("data")); memcpy(STR(attr[F_TYPE]), "data", STRLEN(attr[F_TYPE])); /* fixation du champ .wifi.iswep */ attr[F_ISWEP] = ovm_int_new(); INT(attr[F_ISWEP]) = (mac_header->fc[1] & PROT) / 64; /* fixation du champ .wifi.seqnum */ attr[F_SEQNUM] = ovm_int_new(); INT(attr[F_SEQNUM]) = (int) (mac_header->seqnum & SEQ_MASK) \ >> SEQ_SHIFT; switch(subtype) { case SUBTYPE_DATA: attr[F_SUBTYPE] = ovm_str_new(strlen("data")); memcpy(STR(attr[F_SUBTYPE]), "data", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_CF_ACK: attr[F_SUBTYPE] = ovm_str_new(strlen("datacfack")); memcpy(STR(attr[F_SUBTYPE]), "datacfack", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_CF_POLL: attr[F_SUBTYPE] = ovm_str_new(strlen("datacfpoll")); memcpy(STR(attr[F_SUBTYPE]), "datacfpoll", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_CF_ACPL: attr[F_SUBTYPE] = ovm_str_new(strlen("datacfacpl")); memcpy(STR(attr[F_SUBTYPE]), "datacfacpl", STRLEN(attr[F_SUBTYPE])); break; case SUBTYPE_NODATA: attr[F_SUBTYPE] = ovm_str_new(strlen("nodata")); memcpy(STR(attr[F_SUBTYPE]), "nodata", STRLEN(attr[F_SUBTYPE])); break; default: DebugLog(DF_MOD, DS_DEBUG, "unknown_80211_data_subtype_0x%.2x\n", subtype); attr[F_SUBTYPE] = ovm_str_new(strlen("unknown_data_subtype")); memcpy(STR(attr[F_SUBTYPE]), "unknown_data_subtype", STRLEN(attr[F_SUBTYPE])); } /* end switch(subtype) */ switch(dir) { case DIR_NODS: attr[F_DIR] = ovm_str_new(strlen("nods")); memcpy(STR(attr[F_DIR]), "nods", STRLEN(attr[F_DIR])); attr[F_BODYLENGTH] = ovm_int_new(); INT(attr[F_BODYLENGTH]) = pkthdr->caplen - 144 - 28 ; /* addr1 = DA addr2 = SA addr3 = BSSID */ GETADDR(mac_header->addr1, attr[F_DA]); GETADDR(mac_header->addr2, attr[F_SA]); GETADDR(mac_header->addr3, attr[F_BSSID]); break; case DIR_TODS: attr[F_DIR] = ovm_str_new(strlen("tods")); memcpy(STR(attr[F_DIR]), "tods", STRLEN(attr[F_DIR])); attr[F_BODYLENGTH] = ovm_int_new(); INT(attr[F_BODYLENGTH]) = pkthdr->caplen - 144 - 28 ; /* addr1 = BSSID addr2 = SA addr3 = DA */ GETADDR(mac_header->addr1, attr[F_BSSID]); GETADDR(mac_header->addr2, attr[F_SA]); GETADDR(mac_header->addr3, attr[F_DA]); break; case DIR_FROMDS: attr[F_DIR] = ovm_str_new(strlen("fromds")); memcpy(STR(attr[F_DIR]), "fromds", STRLEN(attr[F_DIR])); attr[F_BODYLENGTH] = ovm_int_new(); INT(attr[F_BODYLENGTH]) = pkthdr->caplen - 144 - 28 ; /* addr1 = DA addr2 = BSSID addr3 = SA */ GETADDR(mac_header->addr1, attr[F_DA]); GETADDR(mac_header->addr2, attr[F_BSSID]); GETADDR(mac_header->addr3, attr[F_SA]); break; case DIR_DSTODS: attr[F_DIR] = ovm_str_new(strlen("dstods")); memcpy(STR(attr[F_DIR]), "fromds", STRLEN(attr[F_DIR])); attr[F_BODYLENGTH] = ovm_int_new(); INT(attr[F_BODYLENGTH]) = pkthdr->caplen - 144 - 34 ; /* addr1 = RA addr2 = TA addr3 = DA addr4 = SA */ GETADDR(mac_header->addr1, attr[F_RA]); GETADDR(mac_header->addr2, attr[F_TA]); GETADDR(mac_header->addr3, attr[F_DA]); GETADDR(mac_header->addr4, attr[F_SA]); break; default: DebugLog(DF_MOD, DS_DEBUG, "unknown_80211_frame_direction_0x%.2x\n", dir); } /* end switch(dir) */ break; default: DebugLog(DF_MOD, DS_DEBUG, "unknown_80211_frame_type_0x%.2x\n", type); } /* end switch(type) */ }