int python_initialize() { PyObject *ekg, *ekg_config; /* PyImport_ImportModule spodziewa siê nazwy modu³u, który znajduje * siê w $PYTHONPATH, wiêc dodajemy tam katalog ~/.gg/scripts. mo¿na * to zrobiæ w bardziej elegancki sposób, ale po co komplikowaæ sobie * ¿ycie? * * Argument putenv() nie jest zwalniany xfree(), bo powoduje to * problemy na systemach, w których putenv() jest zgodne z SUSv2 (np * niektóre SunOS). */ if (getenv("PYTHONPATH")) { char *tmp = saprintf("%s:%s", getenv("PYTHONPATH"), prepare_path("scripts", 0)); #ifdef HAVE_SETENV setenv("PYTHONPATH", tmp, 1); #else { char *s = saprintf("PYTHONPATH=%s", tmp); putenv(s); } #endif xfree(tmp); } else { #ifdef HAVE_SETENV setenv("PYTHONPATH", prepare_path("scripts", 0), 1); #else { char *s = saprintf("PYTHONPATH=%s", prepare_path("scripts", 0)); putenv(s); } #endif } Py_Initialize(); PyImport_AddModule("ekg"); if (!(ekg = Py_InitModule("ekg", ekg_methods))) return -1; PyModule_AddStringConstant(ekg, "version", VERSION); ekg_config = PyObject_NEW(PyObject, &ekg_config_type); PyModule_AddObject(ekg, "config", ekg_config); return 0; }
void python_autorun() { const char *path = prepare_path("scripts/autorun", 0); struct dirent *d; struct stat st; char *tmp; DIR *dir; if (!(dir = opendir(path))) return; /* nale¿y utworzyæ plik ~/.gg/scripts/autorun/__init__.py, inaczej * python nie bêdzie mo¿na ³adowaæ skryptów przez ,,autorun.nazwa'' */ tmp = saprintf("%s/__init__.py", path); if (stat(tmp, &st)) { FILE *f = fopen(tmp, "w"); if (f) fclose(f); } xfree(tmp); while ((d = readdir(dir))) { tmp = saprintf("%s/%s", path, d->d_name); if (stat(tmp, &st) || S_ISDIR(st.st_mode)) { xfree(tmp); continue; } xfree(tmp); if (!strcmp(d->d_name, "__init__.py")) continue; if (strlen(d->d_name) < 3 || strcmp(d->d_name + strlen(d->d_name) - 3, ".py")) continue; tmp = saprintf("autorun.%s", d->d_name); tmp[strlen(tmp) - 3] = 0; python_load(tmp, 0); xfree(tmp); } closedir(dir); }
/* * variable_add() * * dodaje zmienn± do listy zmiennych. * * - plugin - opis wtyczki, która obs³uguje zmienn±, * - name - nazwa, * - type - typ zmiennej, * - display - czy i jak ma wy¶wietlaæ, * - ptr - wska¼nik do zmiennej, * - notify - funkcja powiadomienia, * - map - mapa warto¶ci, * - dyndisplay - funkcja sprawdzaj±ca czy wy¶wietliæ zmienn±. * * zwraca 0 je¶li siê nie uda³o, w przeciwnym wypadku adres do strutury. */ variable_t *variable_add(plugin_t *plugin, const char *name, int type, int display, void *ptr, variable_notify_func_t *notify, variable_map_t *map, variable_display_func_t *dyndisplay) { variable_t *v; char *__name; if (!name) return NULL; if (plugin && !xstrchr(name, ':')) __name = saprintf("%s:%s", plugin->name, name); else __name = xstrdup(name); v = xmalloc(sizeof(variable_t)); v->name = __name; v->name_hash = variable_hash(__name); v->type = type; v->display = display; v->ptr = ptr; v->notify = notify; v->map = map; v->dyndisplay = dyndisplay; v->plugin = plugin; variables_add(v); return v; }
static void __display_info(session_t *s, int type, private_data_t *data) { int i, uid = private_item_get_int(&data, "uid"); const char *str; char *theme = saprintf("icq_userinfo_%s", icq_lookuptable(meta_name, type)); for (i=0; userinfo[i].type; i++) { if ( (userinfo[i].type != type) || (!userinfo[i].name) ) continue; if (userinfo[i].ltab) str = icq_lookuptable(userinfo[i].ltab, private_item_get_int(&data, userinfo[i].name)); else if (userinfo[i].item == 'L') str = private_item_get_int(&data, userinfo[i].name) ? _("Yes") : _("No"); else str = private_item_get(&data, userinfo[i].name); if ( str && *str) { char *___str = xstrdup(str); /* XXX, guess recode */ if (!__displayed) print("icq_userinfo_start", session_name(s), itoa(uid), theme); print(theme, session_name(s), itoa(uid), userinfo[i].display, ___str); __displayed = 1; xfree(___str); } } xfree(theme); }
char* DcmeDualModelDebugInfoStr(DcmeBookkeeping* b) { char* ddis = malloc(0x1000); real eem = NumVecMean(b->ent, K); real ees = NumVecStd(b->ent, K); sprintfc(ddis, 'g', 'k', "ENT:%.2e\u00b1%.2e", eem, ees); saprintf(ddis, " "); saprintf(ddis, "twps: %.3e zz: %02d", b->twps[b->last_updated_zz], b->last_updated_zz); if (NumIsNan(b->twps[b->last_updated_zz])) { saprintf(ddis, "NAN"); } else { char* pb = strprogbarc(b->twps[b->last_updated_zz], 80, 0); saprintf(ddis, "%s", pb); free(pb); } return ddis; }
static inline void send_event_delta(int dx, int dy) { char *event; if (dx || dy) { event = saprintf("mouse delta %d %d", dx, dy); robject_event(mouse, event); free(event); } }
static inline void send_event_button(int buttons) { char *event; if (buttons != prevbuttons) { event = saprintf("mouse button %d", buttons); robject_event(mouse, event); free(event); prevbuttons = buttons; } }
/* * msg_queue_write() * * zapisuje niedostarczone wiadomo¶ci na dysku. * * 0/-1 */ int msg_queue_write() { const char *path; list_t l; int num = 0; if (!msg_queue) return -1; path = prepare_path("queue", 1); if (mkdir(path, 0700) && errno != EEXIST) return -1; for (l = msg_queue; l; l = l->next) { struct msg_queue *m = l->data; char *fn; FILE *f; int i; /* nie zapisujemy wiadomo¶ci, które za³apa³y siê do wysy³ki */ if (m->msg_seq != -1) continue; fn = saprintf("%s/%ld.%d", path, (long) m->time, num++); if (!(f = fopen(fn, "w"))) { xfree(fn); continue; } fprintf(f, "%d\n%d\n%d\n", m->msg_class, m->msg_seq, m->uin_count); for (i = 0; i < m->uin_count; i++) fprintf(f, "%d\n", m->uins[i]); fprintf(f, "%d\n%ld\n%d\n", m->secure, (long) m->time, m->formatlen); if (m->formatlen) { for (i = 0; i < m->formatlen; i++) fprintf(f, "%c", m->format[i]); fprintf(f, "\n"); } fprintf(f, "%s", m->msg); fclose(f); chmod(fn, 0600); xfree(fn); } return 0; }
static int icq_offline_message(session_t *s, unsigned char *buf, int len, private_data_t **info) { /* * SNAC(15,03)/0041 SRV_OFFLINE_MESSAGE Offline message response * * This is the server response to CLI_OFFLINE_MSGS_REQ SNAC(15,02)/003C. * This snac contain single offline message that was sent by another user * and buffered by server when client was offline. */ struct { uint32_t uin; /* message sender uin */ uint16_t y; /* year when message was sent (LE) */ uint8_t M; /* month when message was sent */ uint8_t d; /* day when message was sent */ uint8_t h; /* hour (GMT) when message was sent */ uint8_t m; /* minute when message was sent */ uint8_t type; /* message type */ uint8_t flags; /* message flags */ uint16_t len; /* message string length (LE) */ char *msg; /* message string (null-terminated) */ } pkt; char *recode = NULL; char *uid; debug_function("icq_offline_message()\n"); if (ICQ_UNPACK(&buf, "i wcccc cc w", &pkt.uin, &pkt.y, &pkt.M, &pkt.d, &pkt.h, &pkt.m, &pkt.type, &pkt.flags, &pkt.len)) { struct tm lt; lt.tm_sec = 0; lt.tm_min = pkt.m; lt.tm_hour = pkt.h; lt.tm_mday = pkt.d; lt.tm_mon = pkt.M - 1; lt.tm_year = pkt.y - 1900; lt.tm_isdst = -1; recode = icq_convert_from_ucs2be((char *) buf, pkt.len - 1); if (!recode) recode = xstrdup((const char*)buf); uid = saprintf("icq:%u", pkt.uin); if (recode && *recode) protocol_message_emit(s, uid, NULL, recode, NULL, mktime(<), EKG_MSGCLASS_CHAT, NULL, EKG_TRY_BEEP, 0); xfree(uid); xfree(recode); } return 0; }
static PyObject* ekg_cmd_disconnect(PyObject *self, PyObject *args) { char *reason = NULL, *tmp; if (!PyArg_ParseTuple(args, "|s", &reason)) return NULL; tmp = saprintf("disconnect %s", ((reason) ? reason : "")); command_exec(NULL, tmp, 0); xfree(tmp); return Py_BuildValue(""); }
/* * python_exec() * * wykonuje polecenie pythona. * * - command - polecenie. * * 0/-1 */ int python_exec(const char *command) { char *tmp; if (!command) return 0; tmp = saprintf("import ekg\n%s\n", command); PyRun_SimpleString(tmp); xfree(tmp); return 0; }
int main(int argc, char **argv) { uint32_t slot, func, bus; struct pci_header *hdr; struct robject *root; struct robject *device; char *name; rdi_init(); root = rdi_dir_cons(1, ACCS_READ | ACCS_WRITE); for (bus = 0; bus < 256; bus++) { for (slot = 0; slot < 32; slot++) { for (func = 0; func < 8; func++) { if (_pci_ping(bus, slot, func)) { hdr = malloc(sizeof(struct pci_header)); _pci_read(bus, slot, func, hdr); device = rdi_file_cons((bus << 16) | (slot << 11) | (func << 8) + 2, ACCS_READ); robject_set_data(device, "pci-header", hdr); name = saprintf("/b%2Xs%2Xf%1X", bus, slot, func); rdi_vfs_add(root, name, device); free(name); printf("%02x:%02x.%x :\n", bus, slot, func); printf("\tdevice ID: %X\n", hdr->device_id); printf("\tvendor ID: %X\n", hdr->vendor_id); printf("\tclass: %X %X\n", hdr->class_code, hdr->subclass); for (int i = 0; i < 5; i++) { printf("\tBAR%d: %X\n", i, hdr->bar[i]); } } } } } rdi_global_read_hook = pci_read; msendb(getppid(), ACTION_CHILD); _done(); return 0; }
static char *_find(struct robject *r, rp_t src, int argc, char **argv) { char *link; link = robject_get_data(r, "link"); if (argc == 2) { if (link) { return saprintf(">> %s", link); } else { return rtoa(RP_CONS(getpid(), r->index)); } } else if (argc == 3 && !strcmp(argv[1], "-L")) { return rtoa(RP_CONS(getpid(), r->index)); } return errorstr(EINVAL); }
DFSCH_DEFINE_PRIMITIVE(iso_format_time, NULL){ char t = ' '; dfsch_object_t* use_t; dfsch_object_t* time; struct tm* tm; DFSCH_OBJECT_ARG(args, time); DFSCH_OBJECT_ARG_OPT(args, use_t, NULL); DFSCH_ARG_END(args); if (use_t){ t = 'T'; } tm = dfsch_decoded_time_get_tm(time); return dfsch_make_string_cstr(saprintf("%04d-%02d-%02d%c%02d:%02d:%02d", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, t, tm->tm_hour, tm->tm_min, tm->tm_sec)); }
char *tlen_auth_digest(const char *sid, const char *password) { GChecksum *ctx; char *epasswd; unsigned char digest[20]; static char result[41]; gsize len = 20; int i; /* stolen from libtlen function calc_passcode() Copyrighted by libtlen's developer and Piotr Pawłow */ int magic1 = 0x50305735, magic2 = 0x12345671, sum = 7; char z; while ((z = *password++) != 0) { if (z == ' ' || z == '\t') continue; magic1 ^= (((magic1 & 0x3f) + sum) * z) + (magic1 << 8); magic2 += (magic2 << 8) ^ magic1; sum += z; } magic1 &= 0x7fffffff; magic2 &= 0x7fffffff; epasswd = saprintf("%08x%08x", magic1, magic2); ctx = g_checksum_new(G_CHECKSUM_SHA1); g_checksum_update(ctx, (const guchar *)sid, xstrlen(sid)); g_checksum_update(ctx, (const guchar *)epasswd, xstrlen(epasswd)); g_checksum_get_digest(ctx, digest, &len); g_free(epasswd); for (i = 0; i < 20; i++) sprintf(result + i * 2, "%.2x", digest[i]); return result; }
/* * msg_queue_read() * * wczytuje kolejkê niewys³anych wiadomo¶ci z dysku. * * 0/-1 */ int msg_queue_read() { const char *path; struct dirent *d; DIR *dir; path = prepare_path("queue", 0); if (!(dir = opendir(path))) return -1; while ((d = readdir(dir))) { struct msg_queue m; struct stat st; string_t msg; char *fn, *buf; FILE *f; int i; fn = saprintf("%s/%s", path, d->d_name); if (stat(fn, &st) || !S_ISREG(st.st_mode)) { xfree(fn); continue; } if (!(f = fopen(fn, "r"))) { xfree(fn); continue; } memset(&m, 0, sizeof(m)); fscanf(f, "%d\n", &m.msg_class); fscanf(f, "%d\n", &m.msg_seq); fscanf(f, "%d\n", &m.uin_count); /* jaki¶ zdrowy limit */ if (m.uin_count < 1 || m.uin_count > 100) { fclose(f); xfree(fn); continue; } m.uins = xcalloc(m.uin_count, sizeof(uin_t)); for (i = 0; i < m.uin_count; i++) fscanf(f, "%d\n", &m.uins[i]); fscanf(f, "%d\n", &m.secure); fscanf(f, "%ld\n", (long *) &m.time); fscanf(f, "%d\n", &m.formatlen); /* dziwny plik? */ if (!m.time || !m.msg_seq || !m.msg_class) { fclose(f); xfree(fn); xfree(m.uins); continue; } if (m.formatlen) { m.format = xcalloc(m.formatlen, sizeof(unsigned char)); for (i = 0; i < m.formatlen; i++) fscanf(f, "%c", &m.format[i]); fscanf(f, "%*c"); } else m.format = NULL; msg = string_init(NULL); buf = read_file(f); while (buf) { string_append(msg, buf); xfree(buf); buf = read_file(f); if (buf) string_append(msg, "\r\n"); } m.msg = msg->str; string_free(msg, 0); fclose(f); list_add(&msg_queue, &m, sizeof(m)); unlink(fn); xfree(fn); } closedir(dir); return 0; }
/* * plugin_load() * * ³aduje wtyczkê o podanej nazwie. * * 0/-1 */ int plugin_load(const char *name, int prio, int quiet) { #ifdef SHARED_LIBS char lib[PATH_MAX]; char *env_ekg_plugins_path = NULL; char *init = NULL; #endif plugin_t *pl; void *plugin = NULL; int (*plugin_init)() = NULL; if (!name) return -1; if (plugin_find(name)) { printq("plugin_already_loaded", name); return -1; } #ifdef SHARED_LIBS #ifndef NO_POSIX_SYSTEM #ifdef SCONS # define DOTLIBS "" #else # define DOTLIBS ".libs/" #endif if ((env_ekg_plugins_path = getenv("EKG_PLUGINS_PATH"))) { if (snprintf(lib, sizeof(lib), "%s/%s.so", env_ekg_plugins_path, name) < sizeof(lib)) plugin = ekg2_dlopen(lib); if (!plugin && (snprintf(lib, sizeof(lib), "%s/%s/" DOTLIBS "%s.so", env_ekg_plugins_path, name, name) < sizeof(lib))) plugin = ekg2_dlopen(lib); } #ifndef SKIP_RELATIVE_PLUGINS_DIR /* The following lets ekg2 load plugins when it is run directly from * the source tree, without installation. This can be beneficial when * developing the program, or for less knowlegeable users, who don't * know how to or cannot for some other reason use installation prefix * to install in their home directory. However this impses a security * risk if the program installed in the system directory is run in * untrusted $CWD or when $CWD/../plugins is untrusted. * * TODO(porridge,darkjames): This can be fixed by having a wrapper * script in the source tree to run ekg/.libs/ekg2 with * EKG_PLUGINS_PATH set appropriately. */ if (!plugin) { if (snprintf(lib, sizeof(lib), "plugins/%s/" DOTLIBS "%s.so", name, name) < sizeof(lib)) plugin = ekg2_dlopen(lib); } if (!plugin) { if (snprintf(lib, sizeof(lib), "../plugins/%s/" DOTLIBS "%s.so", name, name) < sizeof(lib)) plugin = ekg2_dlopen(lib); } #endif if (!plugin) { if (snprintf(lib, sizeof(lib), "%s/%s.so", PLUGINDIR, name) < sizeof(lib)) plugin = ekg2_dlopen(lib); } #else /* NO_POSIX_SYSTEM */ if (!plugin) { if (snprintf(lib, sizeof(lib), "c:\\ekg2\\plugins\\%s.dll", name) < sizeof(lib)) plugin = ekg2_dlopen(lib); } #endif /* SHARED_LIBS */ if (!plugin) { printq("plugin_doesnt_exist", name); return -1; } #endif #ifdef STATIC_LIBS #ifndef SCONS /* first let's try to load static plugin... */ extern int jabber_plugin_init(int prio); extern int irc_plugin_init(int prio); extern int gtk_plugin_init(int prio); debug("searching for name: %s in STATICLIBS: %s\n", name, STATIC_LIBS); if (!xstrcmp(name, "jabber")) plugin_init = &jabber_plugin_init; if (!xstrcmp(name, "irc")) plugin_init = &irc_plugin_init; if (!xstrcmp(name, "gtk")) plugin_init = >k_plugin_init; // if (!xstrcmp(name, "miranda")) plugin_init = &miranda_plugin_init; #else debug_function("plugin_load(), trying to find static plugin '%s'\n", name); void *plugin_load_static(const char *name); /* autogenerated by scons */ plugin_init = plugin_load_static(name); #endif #endif #ifdef SHARED_LIBS if (!plugin_init) { # ifdef EKG2_WIN32_HELPERS void (*plugin_preinit)(void *); char *preinit = saprintf("win32_plugin_init"); if (!(plugin_preinit = ekg2_dlsym(plugin, preinit))) { debug("NO_POSIX_SYSTEM, PLUGIN:%s NOT COMPILATED WITH EKG2_WIN32_SHARED_LIB?!\n", name); printq("plugin_incorrect", name); xfree(preinit); return -1; } xfree(preinit); plugin_preinit(&win32_helper); # endif /* than if we don't have static plugin... let's try to load it dynamicly */ init = saprintf("%s_plugin_init", name); if (!(plugin_init = ekg2_dlsym(plugin, init))) { printq("plugin_incorrect", name); ekg2_dlclose(plugin); xfree(init); return -1; } xfree(init); } #endif if (!plugin_init) { printq("plugin_doesnt_exist", name); return -1; } if (plugin_init(prio) == -1) { printq("plugin_not_initialized", name); ekg2_dlclose(plugin); return -1; } if ((pl = plugin_find(name))) { pl->dl = plugin; } else { debug_error("plugin_load() plugin_find(%s) not found.\n", name); /* It's FATAL */ } query_emit_id(pl, SET_VARS_DEFAULT); printq("plugin_loaded", name); if (!in_autoexec) { const char *tmp; in_autoexec = 1; if ((tmp = prepare_pathf("config-%s", name))) config_read(tmp); if ((pl->pclass == PLUGIN_PROTOCOL) && (tmp = prepare_pathf("sessions-%s", name))) session_read(tmp); if (pl) query_emit_id(pl, CONFIG_POSTINIT); in_autoexec = 0; config_changed = 1; } return 0; }
/* * ncurses_contacts_update() * * updates contacts window * * it switches also groups, metacontacts, all together * details in documentation * */ int ncurses_contacts_update(window_t *w, int save_pos) { int old_start; const char *header = NULL, *footer = NULL; char *group = NULL; int j; int all = 0; /* 1 - all, 2 - metacontacts */ ncurses_window_t *n; newconference_t *c = NULL; userlist_t *sorted_all = NULL; int (*comp)(void *, void *) = NULL; /* coz userlist's list are sorted we don't need to sort it again... unfortunetly if we create list from serveral userlists (for instance: session && window) we must resort... --- in ekg2 we do list_add_sorted(...., NULL) on session userlist && list_add_sorted(...., contacts_compare) on window userlist */ if (!w) w = window_find_sa(NULL, "__contacts", 1); if (!w) return -1; n = w->priv_data; if (save_pos) old_start = n->start; else old_start = 0; ncurses_clear(w, 1); if (!session_current) goto kon; if (config_contacts_groups) { char **groups = array_make(config_contacts_groups, ", ", 0, 1, 0); int count = array_count(groups); if (contacts_group_index > count + 2) { contacts_group_index = 0; } else if (contacts_group_index > count + 1) { if (metacontacts) all = 2; else contacts_group_index = 0; } else if (contacts_group_index > count) { all = 1; } else if (contacts_group_index > 0) { all = config_contacts_groups_all_sessions ? 1 : 0; group = groups[contacts_group_index - 1]; if (*group == '@') group++; group = xstrdup(group); header = format_find("contacts_header_group"); footer = format_find("contacts_footer_group"); } array_free(groups); } else if (contacts_group_index) { if (contacts_group_index > ((metacontacts) ? 2 :1) ) contacts_group_index = 0; else all = contacts_group_index; } if (all == 2) { header = format_find("contacts_metacontacts_header"); footer = format_find("contacts_metacontacts_footer"); } c = newconference_find(window_current->session, window_current->target); if (!session_current->userlist && !window_current->userlist && (!c || !c->participants) && !all && contacts_group_index == 0) goto kon; if (!header || !footer) { header = format_find("contacts_header"); footer = format_find("contacts_footer"); } if (format_ok(header)) ncurses_backlog_add(w, fstring_new_format(header, group)); if (all == 1) { userlist_t *l; session_t *s; for (s = sessions; s; s = s->next) { userlist_t *lp; if (!s->userlist) continue; for (lp = s->userlist; lp; lp = lp->next) { userlist_t *u = lp; if (!u->nickname) /* don't add users without nickname.. */ continue; LIST_ADD_SORTED2(&sorted_all, userlist_dup(u, u->uid, u->nickname, s), comp); } comp = contacts_compare; /* turn on sorting */ } for (l = c ? c->participants : window_current->userlist; l; l = l->next) { userlist_t *u = l; if (!u->nickname) /* don't add users without nickname.. */ continue; LIST_ADD_SORTED2(&sorted_all, userlist_dup(u, u->uid, u->nickname, w->session), comp); } if (sorted_all) comp = contacts_compare; /* like above */ } if (all == 1 || all == 2) { metacontact_t *m; /* Remove contacts contained in metacontacts. */ if (all == 1 && config_contacts_metacontacts_swallow) { for (m = metacontacts; m; m = m->next) { metacontact_item_t *i; /* metacontact_find_prio() should always success [for current API] */ /* if (!metacontact_find_prio(m)) continue; */ for (i = m->metacontact_items; i; i = i->next) { userlist_t *u; userlist_t *sl; if (!(u = userlist_find_n(i->s_uid, i->name))) continue; for (sl = sorted_all; sl;) { userlist_t *up = sl; userlist_t *next = sl->next;; /* up->uid == u->uid (?) */ if (up->uid && !xstrcmp(up->uid, u->uid)) LIST_REMOVE2(&sorted_all, up, NULL); sl = next; } } } } for (m = metacontacts; m; m = m->next) { metacontact_item_t *i; userlist_t *u; if (!(i = metacontact_find_prio(m))) continue; if (!(u = userlist_find_n(i->s_uid, i->name))) continue; if (!m->name) /* don't add metacontacts without name.. */ continue; LIST_ADD_SORTED2(&sorted_all, userlist_dup(u, NULL, m->name, (void *) 2), comp); } } if (!all) { sorted_all = session_current->userlist; if (c && c->participants) sorted_all = c->participants; else if (window_current->userlist) sorted_all = window_current->userlist; } if (!sorted_all) goto after_loop; /* it skips this loop below */ for (j = 0; j < corderlen; /* xstrlen(contacts_order); */ j += 2) { const char *footer_status = NULL; int count = 0; char tmp[100]; userlist_t *ul; for (ul = sorted_all; ul; ul = ul->next) { userlist_t *u = ul; const char *status_t; const char *format; fstring_t *string; if (!u->nickname || !u->status) continue; status_t = ekg_status_string(u->status, 0); if (config_contacts_orderbystate ? xstrncmp(contacts_order + j, status_t, 2) : /* when config_contacts_orderbystate, we need to have got this status in contacts_order now. */ !xstrstr(contacts_order, get_short_status(status_t))) /* when !config_contacts_orderbystate, we need to have got this status in contacts_order anywhere. */ continue; if (group && (!u->priv_data || (void *) 2 != u->priv_data)) { userlist_t *tmp = userlist_find(u->priv_data ? u->priv_data : session_current, u->uid); if ((group[0]=='!' && ekg_group_member(tmp, group+1)) || (group[0]!='!' && !ekg_group_member(tmp, group))) continue; } if (!count) { snprintf(tmp, sizeof(tmp), "contacts_%s_header", status_t); format = format_find(tmp); if (format_ok(format)) ncurses_backlog_add(w, fstring_new_format(format)); footer_status = status_t; } if (u->descr && config_contacts_descr) snprintf(tmp, sizeof(tmp), "contacts_%s_descr_full", status_t); else if (u->descr && !config_contacts_descr) snprintf(tmp, sizeof(tmp), "contacts_%s_descr", status_t); else snprintf(tmp, sizeof(tmp), "contacts_%s", status_t); if (u->blink) xstrcat(tmp, "_blink"); if (u->typing) xstrcat(tmp, "_typing"); string = fstring_new_format(format_find(tmp), u->nickname, u->descr); if (u->priv_data == (void *) 2) string->priv_data = (void *) xstrdup(u->nickname); else string->priv_data = (void *) saprintf("%s/%s", (u->priv_data) ? ((session_t *) u->priv_data)->uid : session_current->uid, u->nickname); ncurses_backlog_add(w, string); count++; } if (count) { const char *format; snprintf(tmp, sizeof(tmp), "contacts_%s_footer", footer_status); format = format_find(tmp); if (format_ok(format)) ncurses_backlog_add(w, fstring_new_format(format)); } if (!config_contacts_orderbystate) break; } after_loop: if (format_ok(footer)) ncurses_backlog_add(w, fstring_new_format(footer, group)); if (all) LIST_DESTROY2(sorted_all, NULL); xfree(group); kon: /* restore old index */ n->start = old_start; if (n->start > n->lines_count - w->height + n->overflow) n->start = n->lines_count - w->height + n->overflow; if (n->start < 0) n->start = 0; /* redraw */ n->redraw = 1; ncurses_redraw(w); return -1; }
/* * binding_key() * * analizuje nazwê klawisza i wpisuje akcjê do odpowiedniej mapy. * * 0/-1. */ static int binding_key(struct binding *b, const char *key, int add) { /* debug("Key: %s\n", key); */ if (!xstrncasecmp(key, ("Alt-"), 4)) { unsigned char ch; #define __key(x, y, z) \ if (!xstrcasecmp(key + 4, (x))) { \ b->key = saprintf("Alt-%s", (x)); \ if (add) { \ ncurses_binding_map_meta[y] = LIST_ADD2(&bindings, xmemdup(b, sizeof(struct binding))); \ if (z) \ ncurses_binding_map_meta[z] = ncurses_binding_map_meta[y]; \ } \ return 0; \ } __key("Enter", 13, 0); __key("Backspace", KEY_BACKSPACE, 127); __key("Home", KEY_HOME, KEY_FIND); __key("End", KEY_END, KEY_SELECT); __key("Delete", KEY_DC, 0); __key("Insert", KEY_IC, 0); __key("Left", KEY_LEFT, 0); __key("Right", KEY_RIGHT, 0); __key("Up", KEY_UP, 0); __key("Down", KEY_DOWN, 0); __key("PageUp", KEY_PPAGE, 0); __key("PageDown", KEY_NPAGE, 0); #undef __key if (xstrlen(key) != 5) return -1; ch = xtoupper(key[4]); b->key = saprintf(("Alt-%c"), ch); /* XXX Alt-Ó ??? */ if (add) { ncurses_binding_map_meta[ch] = LIST_ADD2(&bindings, xmemdup(b, sizeof(struct binding))); if (xisalpha(ch)) ncurses_binding_map_meta[xtolower(ch)] = ncurses_binding_map_meta[ch]; } return 0; } if (!xstrncasecmp(key, ("Ctrl-"), 5)) { unsigned char ch; // if (xstrlen(key) != 6) // return -1; #define __key(x, y, z) \ if (!xstrcasecmp(key + 5, (x))) { \ b->key = saprintf("Ctrl-%s", (x)); \ if (add) { \ ncurses_binding_map[y] = LIST_ADD2(&bindings, xmemdup(b, sizeof(struct binding))); \ if (z) \ ncurses_binding_map[z] = ncurses_binding_map[y]; \ } \ return 0; \ } __key("Enter", KEY_CTRL_ENTER, 0); __key("Escape", KEY_CTRL_ESCAPE, 0); __key("Delete", KEY_CTRL_DC, 0); __key("Backspace", KEY_CTRL_BACKSPACE, 0); __key("Tab", KEY_CTRL_TAB, 0); #undef __key ch = xtoupper(key[5]); b->key = saprintf(("Ctrl-%c"), ch); if (add) { if (xisalpha(ch)) ncurses_binding_map[ch - 64] = LIST_ADD2(&bindings, xmemdup(b, sizeof(struct binding))); else return -1; } return 0; } if (xtoupper(key[0]) == 'F' && atoi(key + 1)) { int f = atoi(key + 1); if (f < 1 || f > 63) return -1; b->key = saprintf(("F%d"), f); if (add) ncurses_binding_map[KEY_F(f)] = LIST_ADD2(&bindings, xmemdup(b, sizeof(struct binding))); return 0; } #define __key(x, y, z) \ if (!xstrcasecmp(key, (x))) { \ b->key = xstrdup((x)); \ if (add) { \ ncurses_binding_map[y] = LIST_ADD2(&bindings, xmemdup(b, sizeof(struct binding))); \ if (z) \ ncurses_binding_map[z] = ncurses_binding_map[y]; \ } \ return 0; \ } __key("Enter", 13, 0); __key("Escape", 27, 0); __key("Home", KEY_HOME, KEY_FIND); __key("End", KEY_END, KEY_SELECT); __key("Delete", KEY_DC, 0); __key("Insert", KEY_IC, 0); __key("Backspace", KEY_BACKSPACE, 127); __key("Tab", 9, 0); __key("Left", KEY_LEFT, 0); __key("Right", KEY_RIGHT, 0); __key("Up", KEY_UP, 0); __key("Down", KEY_DOWN, 0); __key("PageUp", KEY_PPAGE, 0); __key("PageDown", KEY_NPAGE, 0); #undef __key return -1; }
static int icq_snac_extension_userfound_common(session_t *s, unsigned char *buf, int len, int islast) { char *nickname = NULL; char *first_name = NULL; char *last_name = NULL; char *email = NULL; char *full_name; char *temp; const char *__age = NULL; const char *__gender = ""; char *__active; uint32_t uin; uint16_t len2; uint16_t status, age; uint8_t auth, gender; /* XXX, sprawdzic czy mamy cookie. */ if (!ICQ_UNPACK(&buf, "w", &len2)) return -1; if (len < len2) return -1; if (!ICQ_UNPACK(&buf, "i", &uin)) return -1; if (!ICQ_UNPACK(&buf, "S", &temp)) goto cleanup; nickname = xstrdup(temp); if (!ICQ_UNPACK(&buf, "S", &temp)) goto cleanup; first_name = xstrdup(temp); if (!ICQ_UNPACK(&buf, "S", &temp)) goto cleanup; last_name = xstrdup(temp); if (!ICQ_UNPACK(&buf, "S", &temp)) goto cleanup; email = xstrdup(temp); if (first_name[0] && last_name[0]) full_name = saprintf("%s %s", first_name, last_name); else full_name = xstrdup(first_name[0] ? first_name : last_name); if (ICQ_UNPACK(&buf, "cwcw", &auth, &status, &gender, &age)) { if (age) __age = itoa(age); // XXX calculate birthyear? if (gender) __gender = (gender==2) ? "m" : "f"; } else { debug_error("icq_snac_extension_userfound_common() broken\n"); auth = status = gender = age = 0; } /* XXX, "search_results_multi", "search_results_single" */ /* XXX, instead of email we had city */ /* XXX, some time ago i was thinking to of function which * if data was truncated [because of width in format] * it'd take another line to complete.. * * i don't like truncation of data for instance: * 08:17:12 97320776 | darkjames | Jakub Zawadz | - | darkjames@po * * i was thinking about: * 97320776 | darkjames | Jakub Zawwdz | - | darkjames@po * ki czta.onet.pl * * of course we can do more magic, and wrap... * Jakub * Zawadzki * * or maybe let's align to center? :) * Jakub * Zawadzki */ { const char *fvalue; /* XXX ?wo? new formats for icq status * status (0 - offline, 1 - online, 2 - non_webaware) */ switch (status) { case 0: fvalue = format_find("search_results_multi_notavail"); break; case 1: fvalue = format_find("search_results_multi_avail"); break; default: fvalue = format_find("search_results_multi_unknown"); break; } temp = format_string(fvalue); /* XXX ?wo? add format for "auth" */ __active = saprintf("%s %s", temp, auth ? " " : "A"); xfree(temp); } print_info(NULL, s, "search_results_multi", itoa(uin), full_name, nickname, email, __age ? __age : ("-"), __gender, __active); xfree(__active); xfree(full_name); if (islast && len>=4) { uint32_t omit; ICQ_UNPACK(&buf, "I", &omit); debug_warn("icq_snac_extension_userfound_last() Bulshit warning!\n"); debug_white("icq_snac_extension_userfound_last() %d search results omitted\n", omit); } icq_hexdump(DEBUG_WHITE, buf, len); xfree(nickname); xfree(first_name); xfree(last_name); xfree(email); return 0; cleanup: xfree(nickname); xfree(first_name); xfree(last_name); xfree(email); return -1; }
/* * gg_session_handler_search50() * * zajmuje siê obs³ug± wyniku przeszukiwania katalogu publicznego. * * - s - sesja * - e - opis zdarzenia */ void gg_session_handler_search50(session_t *s, struct gg_event *e) { gg_private_t *g = session_private_get(s); gg_pubdir50_t res = e->event.pubdir50; int i, count, all = 0; list_t l; uin_t last_uin = 0; if (!g) return; if ((count = gg_pubdir50_count(res)) < 1) { print("search_not_found"); return; } debug_function("gg_session_handler_search50() handle_search50, count = %d\n", gg_pubdir50_count(res)); for (l = g->searches; l; l = l->next) { gg_pubdir50_t req = l->data; if (gg_pubdir50_seq(req) == gg_pubdir50_seq(res)) { all = 1; break; } } for (i = 0; i < count; i++) { const char *uin = gg_pubdir50_get(res, i, "fmnumber"); const char *__firstname = gg_pubdir50_get(res, i, "firstname"); const char *__lastname = gg_pubdir50_get(res, i, "lastname"); const char *__nickname = gg_pubdir50_get(res, i, "nickname"); const char *__fmstatus = gg_pubdir50_get(res, i, "fmstatus"); const char *__birthyear = gg_pubdir50_get(res, i, "birthyear"); const char *__city = gg_pubdir50_get(res, i, "city"); char *firstname = gg_to_core_dup(s, __firstname); char *lastname = gg_to_core_dup(s, __lastname); char *nickname = gg_to_core_dup(s, __nickname); char *city = gg_to_core_dup(s, __city); int status = (__fmstatus) ? atoi(__fmstatus) : GG_STATUS_NOT_AVAIL; const char *birthyear = (__birthyear && xstrcmp(__birthyear, "0")) ? __birthyear : NULL; char *name, *active, *gender; const char *target = NULL; if (count == 1 && !all) { xfree(last_search_first_name); xfree(last_search_last_name); xfree(last_search_nickname); xfree(last_search_uid); last_search_first_name = xstrdup(firstname); last_search_last_name = xstrdup(lastname); last_search_nickname = xstrdup(nickname); last_search_uid = saprintf("gg:%s", uin); } name = saprintf( ("%s %s"), firstname ? firstname : (""), lastname ? lastname : ("")); #define __format(x) ((count == 1 && !all) ? "search_results_single" x : "search_results_multi" x) { const char *fvalue; switch (status) { case GG_STATUS_AVAIL: case GG_STATUS_AVAIL_DESCR: fvalue = format_find(__format("_avail")); break; case GG_STATUS_BUSY: case GG_STATUS_BUSY_DESCR: fvalue = format_find(__format("_away")); break; default: fvalue = format_find(__format("_notavail")); } active = format_string(fvalue, (__firstname) ? __firstname : nickname); } gender = format_string(format_find(__format("_unknown")), ""); /* XXX: why do we _exactly_ use it here? can't we just always * define target and thus display result in right conversation window? */ for (l = autofinds; l; l = l->next) { char *d = (char *) l->data; if (!xstrcasecmp(d + 3, uin)) { target = d; break; } } print_info(target, s, __format(""), uin ? uin : ("?"), name, nickname ? nickname : (""), city ? city : (""), birthyear ? birthyear : ("-"), gender, active); #undef __format xfree(name); xfree(active); xfree(gender); xfree(firstname); xfree(lastname); xfree(nickname); xfree(city); last_uin = atoi(uin); } /* je¶li mieli¶my ,,/find --all'', szukamy dalej */ for (l = g->searches; l; l = l->next) { gg_pubdir50_t req = l->data; uin_t next; if (gg_pubdir50_seq(req) != gg_pubdir50_seq(res)) continue; /* nie ma dalszych? to dziêkujemy */ if (!(next = gg_pubdir50_next(res)) || !g->sess || next <= last_uin) { list_remove(&g->searches, req, 0); gg_pubdir50_free(req); break; } gg_pubdir50_add(req, GG_PUBDIR50_START, ekg_itoa(next)); gg_pubdir50(g->sess, req); break; } }
char *svga_rcall_getmode(struct robject *self, rp_t source, int argc, char **argv) { return saprintf("%d %d %d", svga.w, svga.h, svga.d); }
int main(int argc, char **argv) { // Do po³±czenia struct gg_session *sess; struct gg_event *e; struct gg_login_params p; list_t searches = NULL; char *last_search_first_name = NULL; char *last_search_last_name = NULL; char *last_search_nickname = NULL; uin_t last_search_uin = 0; gg_pubdir50_t res; // Do wyszukiwania char *user; gg_pubdir50_t req; int i, all = 0; if (argc < 4) { fprintf(stderr, "Usage: %s <my_uid> <my_password> <params>\n\n", argv[0]); fprintf(stderr, "Parameters:\n"); fprintf(stderr, " -f <val> (--first) - first name\n"); fprintf(stderr, " -l <val> (--last) - last name\n"); fprintf(stderr, " -n <val> (--nickname) - nickname\n"); fprintf(stderr, " -c <val> (--city) - city\n"); fprintf(stderr, " -u <val> (--uin) - user ID\n"); fprintf(stderr, " -F (--female) - search females only\n"); fprintf(stderr, " -M (--male) - search males only\n"); fprintf(stderr, " -a (--active) - search on-line users only\n"); fprintf(stderr, " -b <val> (--born) - year of birth\n"); fprintf(stderr, " -s <val> (--start) - search offset\n"); fprintf(stderr, " -A (--all) - show all\n"); return 1; } // Poziom debugowania gg_debug_level = 5; memset(&p, 0, sizeof(p)); p.uin = atoi(argv[1]); p.password = argv[2]; // Po³±czenie if (!(sess = gg_login(&p))) { printf("Connection failed: %s\n", strerror(errno)); gg_free_session(sess); return 1; } printf("Po³±czono.\n"); // Wyszukiwanie if (!sess || sess->state != GG_STATE_CONNECTED) { printf("not_connected\n"); return 1; } argv = argv + 3; // próba odpalenia trybu szukania konkretnego usera user = strdup(argv[0]); // Konwersja do CP for (i = 0; argv[i]; i++) { iso_to_cp(argv[i]); } // Zapytanie if (!(req = gg_pubdir50_new(GG_PUBDIR50_SEARCH))) { printf("\n"); return 1; } // wyszukiwanie UIN if (argv[0] && argv[0][0] != '-') { uin_t uin = get_uin(user); if (!uin) { printf("User not found (%s)\n", user); return 1; } gg_pubdir50_add(req, GG_PUBDIR50_UIN, itoa(uin)); i = 1; } else { i = 0; } free(user); // Parsowanie argumentów for (; argv[i]; i++) { char *arg = argv[i]; if (match_arg(arg, 'f', "first", 2) && argv[i + 1]) { gg_pubdir50_add(req, GG_PUBDIR50_FIRSTNAME, argv[++i]); continue; } if (match_arg(arg, 'l', "last", 2) && argv[i + 1]) { gg_pubdir50_add(req, GG_PUBDIR50_LASTNAME, argv[++i]); continue; } if (match_arg(arg, 'n', "nickname", 2) && argv[i + 1]) { gg_pubdir50_add(req, GG_PUBDIR50_NICKNAME, argv[++i]); continue; } if (match_arg(arg, 'c', "city", 2) && argv[i + 1]) { gg_pubdir50_add(req, GG_PUBDIR50_CITY, argv[++i]); continue; } if (match_arg(arg, 'u', "uin", 2) && argv[i + 1]) { gg_pubdir50_add(req, GG_PUBDIR50_UIN, itoa(get_uin(argv[++i]))); continue; } if (match_arg(arg, 's', "start", 3) && argv[i + 1]) { gg_pubdir50_add(req, GG_PUBDIR50_START, argv[++i]); continue; } if (match_arg(arg, 'F', "female", 2)) { gg_pubdir50_add(req, GG_PUBDIR50_GENDER, GG_PUBDIR50_GENDER_FEMALE); continue; } if (match_arg(arg, 'M', "male", 2)) { gg_pubdir50_add(req, GG_PUBDIR50_GENDER, GG_PUBDIR50_GENDER_MALE); continue; } if (match_arg(arg, 'a', "active", 2)) { gg_pubdir50_add(req, GG_PUBDIR50_ACTIVE, GG_PUBDIR50_ACTIVE_TRUE); continue; } if (match_arg(arg, 'b', "born", 2) && argv[i + 1]) { char *foo = strchr(argv[++i], ':'); if (foo) *foo = ' '; gg_pubdir50_add(req, GG_PUBDIR50_BIRTHYEAR, argv[i]); continue; } if (match_arg(arg, 'A', "all", 3)) { if (!gg_pubdir50_get(req, 0, GG_PUBDIR50_START)) gg_pubdir50_add(req, GG_PUBDIR50_START, "0"); all = 1; continue; } printf("invalid_params\n"); gg_pubdir50_free(req); return 1; } // Wywo³anie wyszukiwania if (!gg_pubdir50(sess, req)) { printf("Search failed\n"); return 1; } // Dodanie wyniku wyszykiwania do listy if (all) { list_add(&searches, req, 0); } else { gg_pubdir50_free(req); } // Pêtla czekaj±ca na wynik wyszukiwania while (1) { if (!(e = gg_watch_fd(sess))) { printf("Connection interrupted: %s\n", strerror(errno)); gg_logoff(sess); gg_free_session(sess); return 1; } if (e->type == GG_EVENT_PUBDIR50_SEARCH_REPLY) { printf("Received results!\n"); res = e->event.pubdir50; all = i = 0; int count, all = 0; list_t l; uin_t last_uin = 0; if ((count = gg_pubdir50_count(res)) < 1) { printf("search_not_found\n"); return 1; } gg_debug(GG_DEBUG_MISC, "handle_search50, count = %d\n", gg_pubdir50_count(res)); for (l = searches; l; l = l->next) { gg_pubdir50_t req = l->data; if (gg_pubdir50_seq(req) == gg_pubdir50_seq(res)) { all = 1; break; } } for (i = 0; i < count; i++) { const char *__fmnumber = gg_pubdir50_get(res, i, "fmnumber"); const char *uin = (__fmnumber) ? __fmnumber : "?"; const char *__firstname = gg_pubdir50_get(res, i, "firstname"); char *firstname = strdup((__firstname) ? __firstname : ""); const char *__lastname = gg_pubdir50_get(res, i, "lastname"); char *lastname = strdup((__lastname) ? __lastname : ""); const char *__nickname = gg_pubdir50_get(res, i, "nickname"); char *nickname = strdup((__nickname) ? __nickname : ""); const char *__fmstatus = gg_pubdir50_get(res, i, "fmstatus"); int status = (__fmstatus) ? atoi(__fmstatus) : GG_STATUS_NOT_AVAIL; const char *__birthyear = gg_pubdir50_get(res, i, "birthyear"); const char *birthyear = (__birthyear && strcmp(__birthyear, "0")) ? __birthyear : "-"; const char *__city = gg_pubdir50_get(res, i, "city"); char *city = strdup((__city) ? __city : ""); char *name, *active; const char *target = NULL; cp_to_iso(firstname); cp_to_iso(lastname); cp_to_iso(nickname); cp_to_iso(city); if (count == 1 && !all) { free(last_search_first_name); free(last_search_last_name); free(last_search_nickname); last_search_first_name = strdup(firstname); last_search_last_name = strdup(lastname); last_search_nickname = strdup(nickname); last_search_uin = atoi(uin); } name = saprintf("%s %s", firstname, lastname); switch (status & 0x7f) { case GG_STATUS_AVAIL: case GG_STATUS_AVAIL_DESCR: active = strdup("Avail"); break; case GG_STATUS_BUSY: case GG_STATUS_BUSY_DESCR: active = strdup("Busy"); break; case GG_STATUS_INVISIBLE: case GG_STATUS_INVISIBLE_DESCR: active = strdup("Invis"); break; default: active = strdup("Inact"); } printf("UIN\t: %s\n", uin); printf("Name\t: %s\n", name); printf("Nick\t: %s\n", nickname); printf("City\t: %s\n", city); printf("Birth\t: %s\n", birthyear); printf("Active\t: %s\n\n", active); free(name); free(active); free(firstname); free(lastname); free(nickname); free(city); last_uin = atoi(uin); } /* je¶li mieli¶my ,,/find --all'', szukamy dalej */ for (l = searches; l; l = l->next) { gg_pubdir50_t req = l->data; uin_t next; if (gg_pubdir50_seq(req) != gg_pubdir50_seq(res)) continue; /* nie ma dalszych? to dziêkujemy */ if (!(next = gg_pubdir50_next(res)) || !sess || next < last_uin) { list_remove(&searches, req, 0); gg_pubdir50_free(req); break; } gg_pubdir50_add(req, GG_PUBDIR50_START, itoa(next)); gg_pubdir50(sess, req); break; } gg_free_event(e); break; } gg_free_event(e); } gg_logoff(sess); gg_free_session(sess); return 0; }
int irc_parse_line(session_t *s, const char *l) { static GString *strbuf = NULL; irc_private_t *j = s->priv; int i, c=0, ecode, n_params; char *p, *cmd, *colon2, **args = NULL, **pfxcmd = NULL; gchar *buf; int len; if (G_UNLIKELY(!strbuf)) strbuf = g_string_new(l); else g_string_assign(strbuf, l); irc_convert_in(j, strbuf); buf = strbuf->str; len = strbuf->len; query_emit(NULL, "irc-parse-line", &s->uid, &buf); p=buf; if(!p) return -1; /* Each IRC message may consist of up to three main parts: the prefix (optional), the command, and the command parameters (of which there may be up to 15). The prefix, command, and all parameters are separated by one (or more) ASCII space character(s) (0x20). The presence of a prefix is indicated with a single leading ASCII colon character (':', 0x3b), which must be the first character of the message itself. There must be no gap (whitespace) between the colon and the prefix. */ /* GiM: In fact this is probably not needed, but just in case... */ for (i=0; i<len; i++) if (buf[i]=='\n' || buf[i]=='\r') buf[i]='\0'; if ((colon2=xstrstr(p, " :"))) *colon2 = '\0'; args = array_make(OMITCOLON(p), " ", 0, 1, 0); if (colon2) { *colon2 = ' '; array_add(&args, xstrdup(colon2+2)); } #define prefix pfxcmd[0] #define pfx_nick pfxcmd[1] #define pfx_ihost pfxcmd[2] #define cmdname pfxcmd[3] /* prefix is optional... */ if (':' != *buf) { array_add(&pfxcmd, g_strdup("")); // prefix array_add(&pfxcmd, g_strdup("")); // pfx_nick array_add(&pfxcmd, g_strdup("")); // pfx_ihost } else { array_add(&pfxcmd, array_shift(&args)); // prefix p = xstrchr(pfxcmd[0], '!'); array_add(&pfxcmd, p ? g_strndup(pfxcmd[0], p-pfxcmd[0]) : g_strdup("")); // pfx_nick array_add(&pfxcmd, p ? g_strdup(p+1) : g_strdup("")); // pfx_ihost } cmd = array_shift(&args); array_add(&pfxcmd, cmd); // cmdname /* debug only nasty hack ;> */ #ifdef GDEBUG /* mg: well, it's not the exact data sent, but color is needed indeed */ i=0; if (*pfxcmd[0]) debug_iorecv("[%s]", pfxcmd[0]); debug_iorecv("[%s]", cmd); while (args[i] != NULL) debug_iorecv("[%s]",args[i++]); debug_iorecv("\n"); #endif n_params = g_strv_length(args); if (xstrlen(cmd) > 1) { if(!gatoi(cmd, &ecode)) { /* for scripts */ char *emitname = saprintf("irc-protocol-numeric %s", cmd); if ((query_emit(NULL, "irc-protocol-numeric", &s->uid, &ecode, &args) == -1) || (query_emit(NULL, emitname, &s->uid, &args) == -1)) { xfree(emitname); g_strfreev(pfxcmd); g_strfreev(args); return -1; } xfree(emitname); c=0; while(irccommands[c].type != -1) { if (irccommands[c].type == 1 && irccommands[c].num == ecode) { if (irccommands[c].min_params > n_params) { debug_error("[irc] parse_line() Not enough parameters! cmd=%s, n=%d, min=%d\n", cmd, n_params, irccommands[c].min_params); } else /* I'm sending c not ecode!!!! */ if ((*(irccommands[c].handler))(s, j, c, pfxcmd, args) == -1 ) { debug_error("[irc] parse_line() error while executing handler!\n"); } /* GiM: XXX I don't expect more, * then one handler on list... */ break; } c++; } #ifdef GDEBUG if (irccommands[c].type == -1) { debug("trying default handler\n"); if ((*(irccommands[0].handler))(s, j, 0, pfxcmd, args) == -1 ) { debug("[irc] parse_line() error while executing handler!\n"); } } #endif } else { c=0; while(irccommands[c].type != -1) { if (irccommands[c].type == 0 && !xstrcmp(irccommands[c].comm, cmd)) { if (irccommands[c].min_params > n_params) { debug_error("[irc] parse_line() Not enough parameters! cmd=%s, n=%d, min=%d\n", cmd, n_params, irccommands[c].min_params); } else /* dj: instead of ecode, c; */ if ((*(irccommands[c].handler))(s, j, c, pfxcmd, args) == -1 ) { debug_error("[irc] parse_line() error while executing handler!\n"); } break; } c++; } } } g_strfreev(pfxcmd); g_strfreev(args); return 0; }