/* * xmlnode2tstr -- convert given xmlnode tree into a newline terminated string * * parameters * node -- pointer to the xmlnode structure * * results * a pointer to the created string * or NULL if it was unsuccessfull */ char* xmlnode2tstr(xmlnode node) { spool s = _xmlnode2spool(node); if (s != NULL) spool_add(s, "\n"); return spool_print(s); }
/* convenience :) */ char *spools(pool p, ...) { va_list ap; spool s; char *arg = NULL; if(p == NULL) return NULL; s = spool_new(p); va_start(ap, p); /* loop till we hit our end flag, the first arg */ while(1) { arg = va_arg(ap,char *); if((pool)arg == p) break; else spool_add(s, arg); } va_end(ap); return spool_print(s); }
void mt_ns_msg(mpacket mp, session s) { xmlnode msg, oob; char *body, *ctype, *ptr; /* message body spool*/ pool p = pool_new(); spool sp = spool_new(p); if (s->ti->inbox_headlines == 0) return; ctype = strchr(mt_packet_data(mp,5),':') + 2; body = mt_packet_data(mp,mp->count - 1); /* this message is a Hotmail inbox notification */ if ((strncmp(ctype,"text/x-msmsgsinitialemailnotification",37) != 0) && (strncmp(ctype,"text/x-msmsgsemailnotification",30) != 0)) return; /* Fede <*****@*****.**> */ /* cut off the junk at the end */ if ((ptr = strstr(body,"Inbox-URL")) != NULL) { *ptr = '\0'; spool_add(sp,body); } else { if ((ptr = strstr(body,"From:")) != NULL) { char *p = strchr(ptr, '\r'); *p = '\0'; spooler(sp,"Mail from: ", ptr + 6,sp); body = p + 1; } if ((ptr = strstr(body,"From-Addr:")) != NULL) { *strchr(ptr, '\r') = '\0'; spooler(sp," <",ptr + 11,">",sp); } } msg = xmlnode_new_tag("message"); xmlnode_put_attrib(msg,"to",jid_full(s->id)); xmlnode_put_attrib(msg,"from",s->host); xmlnode_put_attrib(msg,"type","headline"); xmlnode_insert_cdata(xmlnode_insert_tag(msg,"subject"),"Hotmail",-1); xmlnode_insert_cdata(xmlnode_insert_tag(msg,"body"),spool_print(sp),-1); oob = xmlnode_insert_tag(msg,"x"); xmlnode_put_attrib(oob,"xmlns","jabber:x:oob"); xmlnode_insert_cdata(xmlnode_insert_tag(oob,"url"),"http://www.hotmail.com/cgi-bin/folders",-1); xmlnode_insert_cdata(xmlnode_insert_tag(oob,"desc"),"Login to your Hotmail e-mail account",-1); mt_deliver(s->ti,msg); pool_free(p); }
static void _xmlnode_tag2str(spool s, xmlnode node, int flag) { xmlnode tmp; if(flag==0 || flag==1) { spooler(s,"<",xmlnode_get_name(node),s); tmp = xmlnode_get_firstattrib(node); while(tmp) { spooler(s," ",xmlnode_get_name(tmp),"='",strescape(xmlnode_pool(node),xmlnode_get_data(tmp)),"'",s); tmp = xmlnode_get_nextsibling(tmp); } if(flag==0) spool_add(s,"/>"); else spool_add(s,">"); } else { spooler(s,"</",xmlnode_get_name(node),">",s); } }
static spool _xmlnode2spool(xmlnode node) { spool s; int level=0,dir=0; xmlnode tmp; if(!node || xmlnode_get_type(node)!=NTYPE_TAG) return NULL; s = spool_new(xmlnode_pool(node)); if(!s) return(NULL); while(1) { if(dir==0) { if(xmlnode_get_type(node) == NTYPE_TAG) { if(xmlnode_has_children(node)) { _xmlnode_tag2str(s,node,1); node = xmlnode_get_firstchild(node); level++; continue; }else{ _xmlnode_tag2str(s,node,0); } }else{ spool_add(s,strescape(xmlnode_pool(node),xmlnode_get_data(node))); } } tmp = xmlnode_get_nextsibling(node); if(!tmp) { node = xmlnode_get_parent(node); level--; if(level>=0) _xmlnode_tag2str(s,node,2); if(level<1) break; dir = 1; }else{ node = tmp; dir = 0; } } return s; }
/*----------------------------------------------------------------------------- * create a new symbol, needs to be deleted by OBJ_DELETE() * adds a reference to the page were referred to *----------------------------------------------------------------------------*/ Symbol *Symbol_create(const char *name, long value, sym_type_t type, sym_scope_t scope, Module *module, Section *section ) { Symbol *self = OBJ_NEW( Symbol ); self->name = spool_add(name); /* name in strpool, not freed */ self->value = value; self->type = type; self->scope = scope; self->module = module; self->section = section; self->filename = get_error_file(); self->line_nr = get_error_line(); return self; /* pointer to new symbol */ }
/*----------------------------------------------------------------------------- * return full symbol name NAME@MODULE stored in strpool *----------------------------------------------------------------------------*/ const char *Symbol_fullname( Symbol *sym ) { STR_DEFINE(name, STR_SIZE); const char *ret; Str_set( name, sym->name ); if ( sym->module && sym->module->modname ) { Str_append_char( name, '@' ); Str_append( name, sym->module->modname ); } ret = spool_add( Str_data(name) ); STR_DELETE(name); return ret; }
void spooler(spool s, ...) { va_list ap; char *arg = NULL; if(s == NULL) return; va_start(ap, s); /* loop till we hit our end flag, the first arg */ while(1) { arg = va_arg(ap,char *); if((spool)arg == s) break; else spool_add(s, arg); } va_end(ap); }
char *jid_full(jid id) { spool s; if(id == NULL) return NULL; /* use cached copy */ if(id->full != NULL) return id->full; s = spool_new(id->p); if(id->user != NULL) spooler(s, id->user,"@",s); spool_add(s, id->server); if(id->resource != NULL) spooler(s, "/",id->resource,s); id->full = spool_print(s); return id->full; }
void con_room_log_new(cnr room) { char *filename; char *curdate; char *dirname; char datePart[5]; struct stat fileinfo; time_t now = time(NULL); int type; pool p; spool sp; if(room == NULL || !room->master->logsEnabled) { log_warn(NAME, "[%s] Aborting - NULL room", FZONE); return; } p = pool_heap(1024); type = room->logformat; dirname = jid_full(room->id); sp = spool_new(p); if(room->master->logdir) { spooler(sp, room->master->logdir, "/", dirname, sp); } else { spooler(sp, "./", dirname, sp); } filename = spool_print(sp); if(stat(filename,&fileinfo) < 0 && mkdir(filename, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) { log_warn(NAME, "[%s] ERR: unable to open log directory >%s<", FZONE, filename); return; } curdate = dateget(now); if (room->master->flatLogs) { spooler(sp, "/", curdate, sp); } else { strftime(datePart, 5, "%Y", localtime(&now)); spooler(sp, "/", datePart, sp); filename = spool_print(sp); if(stat(filename,&fileinfo) < 0 && mkdir(filename, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) { log_warn(NAME, "[%s] ERR: unable to open log directory >%s<", FZONE, filename); return; } strftime(datePart, 5, "%m", localtime(&now)); spooler(sp, "/", datePart, sp); filename = spool_print(sp); if(stat(filename,&fileinfo) < 0 && mkdir(filename, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) { log_warn(NAME, "[%s] ERR: unable to open log directory >%s<", FZONE, filename); return; } strftime(datePart, 5, "%d", localtime(&now)); spooler(sp, "/", datePart, sp); } if(type == LOG_XML) spool_add(sp, ".xml"); else if(type == LOG_XHTML) spool_add(sp, ".html"); else spool_add(sp, ".txt"); filename = spool_print(sp); if(stat(filename,&fileinfo) < 0) { log_debug(NAME, "[%s] New logfile >%s<", FZONE, filename); room->logfile = fopen(filename, "a"); if(type == LOG_XHTML && room->logfile != NULL) { fprintf(room->logfile, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head>\n<title>Logs for %s, %s</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n", jid_full(room->id), curdate); if (room->master->stylesheet!=NULL) fprintf(room->logfile, "<link rel=\"stylesheet\" type=\"text/css\" href=\"%s\" />\n",room->master->stylesheet); fprintf(room->logfile, "</head><body>\n<p class=\"logs\">\n"); fflush(room->logfile); } } else { room->logfile = fopen(filename, "a"); } if(room->logfile == NULL) log_warn(NAME, "[%s] ERR: unable to open log file >%s<", FZONE, filename); else log_debug(NAME, "[%s] Opened logfile >%s<", FZONE, filename); pool_free(p); free(curdate); return; }
void mt_ns_not(mpacket mp, session s) { int i = 0; xmlnode msg, oob1, oob2; /* message body spool*/ pool p = pool_new(); spool sp = spool_new(p); /* parsing the message... */ xmlnode notification, msgtag, action, subscr, body, text; spool action_url = spool_new(p); spool subscr_url = spool_new(p); char *chunk, *fixedchunk, *notification_id, *msg_id, *bodytext; if (s->ti->inbox_headlines == 0) return; /* grab the <notification/> chunk */ for(i = 2; i < mp->count; i++) { spool_add(sp, mt_packet_data(mp,i)); } msg = xmlnode_new_tag("message"); xmlnode_put_attrib(msg,"to",jid_full(s->id)); xmlnode_put_attrib(msg,"from",s->host); xmlnode_put_attrib(msg,"type","headline"); xmlnode_insert_cdata(xmlnode_insert_tag(msg,"subject"),"MSN Alert",-1); /* Parse the alert -- there's probably better ways to do this */ chunk = spool_print(sp); log_debug(ZONE, "chunk from spool_print: \"%s\"", chunk); fixedchunk = mt_fix_amps(p, chunk); log_debug(ZONE, "fixedchunk: \"%s\"", fixedchunk); // Get the notification ID notification = xmlnode_str(fixedchunk, strlen(fixedchunk)); notification_id = xmlnode_get_attrib(notification, "id"); log_debug(ZONE, "notification - %X\nn_id - %s", notification, notification_id); // Get the message ID msgtag = xmlnode_get_tag(notification, "MSG"); msg_id = xmlnode_get_attrib(msgtag, "id"); // Get the action URL action = xmlnode_get_tag(msgtag, "ACTION"); spool_add(action_url, xmlnode_get_attrib(action, "url")); spool_add(action_url, "¬ification="); spool_add(action_url, notification_id); spool_add(action_url, "&message_id="); spool_add(action_url, msg_id); spool_add(action_url, "&agent=messenger"); // Get the subscription URL subscr = xmlnode_get_tag(msgtag, "SUBSCR"); spool_add(subscr_url, xmlnode_get_attrib(subscr, "url")); spool_add(subscr_url, "¬ification="); spool_add(subscr_url, notification_id); spool_add(subscr_url, "&message_id="); spool_add(subscr_url, msg_id); spool_add(subscr_url, "&agent=messenger"); // Get the body body = xmlnode_get_tag(msgtag, "BODY"); text = xmlnode_get_tag(body, "TEXT"); bodytext = xmlnode_get_data(text); /* Finished parsing the XML */ // Insert the body xmlnode_insert_cdata(xmlnode_insert_tag(msg,"body"),bodytext,-1); // Insert the action URL oob1 = xmlnode_insert_tag(msg,"x"); xmlnode_put_attrib(oob1,"xmlns","jabber:x:oob"); xmlnode_insert_cdata(xmlnode_insert_tag(oob1,"url"),spool_print(action_url),-1); xmlnode_insert_cdata(xmlnode_insert_tag(oob1,"desc"),"More information on this alert",-1); // Insert the subscription URL oob2 = xmlnode_insert_tag(msg,"x"); xmlnode_put_attrib(oob2,"xmlns","jabber:x:oob"); xmlnode_insert_cdata(xmlnode_insert_tag(oob2,"url"),spool_print(subscr_url),-1); xmlnode_insert_cdata(xmlnode_insert_tag(oob2,"desc"),"Manage subscriptions to alerts",-1); mt_deliver(s->ti,msg); xmlnode_free(notification); pool_free(p); }
void SrcFile_set_filename(SrcFile * self, const char * filename) { self->line_filename = spool_add(filename); }