int main(void) { /* Not defined in any header, we must define it ourselves! TODO why? */ union semun mysemun; int fd; int *map; char *name = "/" TMPFILE(); /* ID to a set of semaphores. */ int semid; enum Constexpr { size = sizeof(int) }; struct sembuf mysembuf; /* Operate on first semaphore in set. */ mysembuf.sem_num = 0; /* No special options for operation */ mysembuf.sem_flg = 0; /* Returns the ID to a new set of semaphores. */ semid = semget( /* Create new semaphores, don't reuse existing ones. */ IPC_PRIVATE, /* How many semaphores to create in the set. */ 1, /* Open-like permissions. */ S_IRUSR | S_IWUSR ); mysemun.val = 1; /* Set the semaphore values to 1. */ semctl(semid, 0, SETVAL, mysemun); fd = shm_open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); ftruncate(fd, size); map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); *map = 0; if (fork() == 0) { *map = 1; msync(map, size, MS_SYNC); /* Subtract 1. */ mysembuf.sem_op = -1; semop( semid, /* Array of operations to do. Here a single one. */ &mysembuf, /* The length of the mysembuf array is 1: single element case. */ 1 ); exit(EXIT_SUCCESS); } /* Wait for 0. */ mysembuf.sem_op = 0; semop(semid, &mysembuf, 1); assert(*map == 1); wait(NULL); assert(*map == 1); munmap(map, size); close(fd); shm_unlink(name); return EXIT_SUCCESS; }
int strls_unix(PCStr(path),PVStr(ls),int size){ FILE *tmp = TMPFILE("CRYPT-ls"); const char *tail; ls_unix(tmp,"-l",VStrNULL,path,NULL); fflush(tmp); fseek(tmp,0,0); fgets(ls,size,tmp); fclose(tmp); if( tail = strpbrk(ls,"\r\n") ){ *(char*)tail = 0; } return 0; }
void sort_file(FILE *src,FILE *dst,int rev) { FILE *tmp; CStr(line,4096); const char *lines[0x10000]; /**/ int nlines,li; if( src == dst ) tmp = dst = TMPFILE("SORT"); else tmp = NULL; fseek(src,0,0); for( nlines = 0; fgets(line,sizeof(line),src); nlines++ ){ if( elnumof(lines) <= nlines ){ break; } lines[nlines] = stralloc(line); } if( rev ) qsort(lines,nlines,sizeof(char*),(sortFunc)cmpstr_reverse); else qsort(lines,nlines,sizeof(char*),(sortFunc)cmpstr); fseek(dst,0,0); for( li = 0; li < nlines; li++ ){ fputs(lines[li],dst); free((char*)lines[li]); } fflush(dst); if( tmp != NULL ){ fseek(src,0,0); fseek(tmp,0,0); copy_file(tmp,src,NULL); fclose(tmp); fflush(src); } }
int service_vsap(Connection *Conn) { CStr(request,1024); CStr(reqver,128); const char *req; int svsock,shared,clsock,rcode; CStr(myport,256); CStr(sockname,MaxHostNameLen); CStr(peername,MaxHostNameLen); int wcc,rcc; CStr(com,1024); CStr(arg,1024); const char *argp; CStr(opt,32); const char *op; int timeout; int AuthOk; FILE *authout; minit_vsapsv(); if( ToS <= 0 || FromS <= 0 ){ /* If the DST_HOST is not local connect to the master and simple_relay... */ } if( !isMYSELF(DFLT_HOST) ){ daemonlog("E","VSAP relaying to %s:%d\n",DFLT_HOST,DFLT_PORT); if( ToS < 0 ) connect_to_serv(Conn,FromC,ToC,0); relay_svcl(Conn,FromC,ToC,FromS,ToS); close(ToS); return 0; } /* timeout = 300; */ timeout = IO_TIMEOUT; shared = 0; myport[0] = 0; SvSockN = 0; ClSockN = 0; clsock = -1; svsock = -1; reqver[0] = 0; authout = TMPFILE("VSAP-AUTH"); if( doAUTH(Conn,NULL,authout,"vsap","-",0,CVStr("user-xxxx:pass-xxxx"),CVStr("host-xxxx"),NULL,NULL) == EOF ){ AuthOk = 0; }else AuthOk = -1; if( ImMaster ){ sprintf(myport,"%s:%d",DST_HOST,DST_PORT); }else for(;;){ if( DDI_fgetsFromCbuf(Conn,AVStr(request),sizeof(request),NULL) == 0 ) { int closed = 0; for(;;){ if( PollIn(FromC,1*1000) != 0 ) break; closed |= checkCloseOnTimeout(1); if( 0 <= clsock && !IsAlive(clsock) ){ daemonlog("E","## disconnected by peer\n"); SockPrintf(ToC,"%s %d %s.\r\n",VER,NO_GENERIC_BYE,"disconnected by peer"); close(clsock);del_clsock(clsock); goto EXIT; } } if( (rcc = RecvLine(FromC,request,sizeof(request))) <= 0 ) break; } daemonlog("D","CLIENT-SAYS: %s",request); daemonlog("E","CLIENT-SAYS: %s",request); req = request; if( strncmp(req,"VSAP/",5) == 0 ) req = wordScan(req,reqver); argp = wordScan(req,com); arg[0] = 0; lineScan(argp,arg); if( strcasecmp(com,"AUTH") == 0 ){ CStr(ahost,MaxHostNameLen); ahost[0] = 0; if( doAUTH(Conn,NULL,authout,"vsap","-",0,AVStr(arg),AVStr(ahost),NULL,NULL) == EOF ){ }else{ AuthOk = 1; SockPrintf(ToC,"%s %d OK\r\n",VER,OK_GENERIC); continue; } } if( AuthOk == 0 ){ SockPrintf(ToC,"%s %d forbidden\r\n",VER,NO_PERMISSION); sv1log("WITH AUTHORIZER, but NO AUTH from client\n"); break; } if( strcasecmp(com,"ECHO") == 0 ){ CStr(stime,64); StrftimeLocal(AVStr(stime),sizeof(stime),TIMEFORM_HTTPD,time(0),0); SockPrintf(ToC,"%s %d [%s] %s\r\n",VER,OK_GENERIC, stime,arg); }else if( strcasecmp(com,"CONNECT") == 0 ){ strcpy(myport,arg); if( !vsap_permit(Conn,myport) ) break; clsock = do_connect(svsock,myport,ToC); if( clsock < 0 ) break; }else if( strcasecmp(com,"BIND") == 0 ){ CStr(opts,1024); opts[0] = 0; Xsscanf(arg,"%s %[^\r\n]",AVStr(myport),AVStr(opts)); if( !vsap_permit(Conn,myport) ) break; svsock = do_bind(-1,AVStr(myport),opts,&shared,AVStr(sockname),ToC); if( svsock < 0 ) break; }else if( strcasecmp(com,"LISTEN") == 0 ){ int nlisten = atoi(arg); Socket1("VSAP",svsock,NULL,NULL,NULL,VStrANYPORT,ANYPORT,nlisten,NULL,0); SockPrintf(ToC,"%s %d listen ok.\r\n",VER,OK_LISTEN); }else if( strcasecmp(com,"ACCEPT") == 0 ){ int priority; if( Conn->cl_count <= 1 ) priority = 0; else priority = 1; clsock = do_accept(myport,arg,shared,priority,FromC,ToC); if( !shared ) svsock = -1; if( clsock < 0 ){ wcc = SockPrintf(ToC,"%s %d accept fail\r\n", VER,NO_ACCEPT); break; } add_clsock(clsock); if( myport[0] == '/' ){ strcpy(sockname,myport); strcpy(peername,myport); }else getpairName(clsock,AVStr(sockname),AVStr(peername)); wcc = SockPrintf(ToC,"%s %d %d %s %s accepted.\r\n", VER,OK_ACCEPT,ClSockN,sockname,peername); }else if( strcasecmp(com,"QUIT") == 0 ){ SockPrintf(ToC,"%s %d bye.\r\n",VER,OK_BYE); break; }else if( strcasecmp(com,"FORWARD") == 0 ){ do_forward(Conn,myport,arg,shared,svsock,0,FromC,ToC); }else if( strcasecmp(com,"RELAY") == 0 ){ /* -t timeout */ for( op = arg; *op == '-'; ){ if( strneq(op,"-t=",3) ){ int to; op = numscanX(op+3,AVStr(opt),sizeof(opt)); to = atoi(opt); if( to < timeout ) timeout = to; }else{ break; } } tcp_relay2(timeout*1000,FromC,clsock,clsock,ToC); /* set_linger(clsock,10); */ set_linger(clsock,LIN_TIMEOUT); close(clsock);del_clsock(clsock); break; }else if( strcasecmp(com,"PROXY") == 0 ){ ToS = FromS = ToC; ToC = FromC = clsock; daemonlog("E","##### VSAP switch protocol to '%s'\n",arg); if( strcmp(arg,"http")==0 ) service_http(Conn); else if( strcmp(arg,"ftp")==0 ) service_ftp(Conn); set_linger(clsock,10); close(clsock);del_clsock(clsock); break; }else { /* wcc = write(clsock,req,rcc); tcp_relay2(timeout*1000,FromC,clsock,clsock,ToC); */ SockPrintf(ToC,"%s %d %s",VER,NO_GENERIC,request); } } EXIT: fclose(authout); return 0; }
void notify_ADMINX(Connection *xConn,PCStr(admin),PCStr(what),PCStr(body)) { FILE *tmp; FILE *bt; Connection ConnBuff,*Conn = &ConnBuff; CStr(head,1024); CStr(me,128); CStr(date,128); CStr(load,128); CStr(cwd,1024); CStr(uname,128); int now; const char *bugbox = "*****@*****.**"; CStr(msgid,1024); CStr(buf,1024); if( strncasecmp(what,"sig",3) != 0 ) if( strncasecmp(what,"failed",6) != 0 ) if( strncasecmp(what,"modified",8) != 0 ) if( strncasecmp(what,"approved",8) != 0 ) if( strncasecmp(what,"detected",8) != 0 ) if( strncasecmp(what,"[",1) != 0 ) /* abort in child process */ return; if( admin == NULL || *admin == 0 ) admin = getADMIN1(); now = time(NULL); if( xConn ) *Conn = *xConn; else bzero(Conn,sizeof(Connection)); tmp = TMPFILE("NOTIFY"); head[0] = 0; if( gethostname(me,sizeof(me)) != 0 ) strcpy(me,"?"); sprintf(msgid,"%d.%d.%d@%s",getpid(),itime(0),getuid(),me); StrftimeLocal(AVStr(date),sizeof(date),TIMEFORM_RFC822,now,0); Xsprintf(TVStr(head),"Subject: DeleGate-Report: %s\r\n",what); Xsprintf(TVStr(head),"From: [%d]@%s\r\n",getuid(),me); Xsprintf(TVStr(head),"To: %s (DeleGate ADMIN)\r\n",admin); Xsprintf(TVStr(head),"Reply-To: %s\r\n",bugbox); Xsprintf(TVStr(head),"Date: %s\r\n",date); Xsprintf(TVStr(head),"Message-Id: <%s>\r\n",msgid); Xsprintf(TVStr(head),"Content-Type: text/plain\r\n"); fprintf(tmp,"%s\r\n",head); fprintf(tmp,"PLEASE FORWARD THIS MESSAGE TO <%s>.\r\n",bugbox); fprintf(tmp,"IT WILL BE HELPFUL FOR DEBUGGING.\r\n"); fprintf(tmp,"\r\n"); fprintf(tmp,"%s",head); fprintf(tmp,"Event: %s\r\n",what); Uname(AVStr(uname)); fprintf(tmp,"Version: %s (%s)\r\n",DELEGATE_verdate(),uname); fprintf(tmp,"Host: %s\r\n",me); fprintf(tmp,"Owner: uid=%d/%d, gid=%d/%d\r\n", geteuid(),getuid(),getegid(),getgid()); StrftimeLocal(AVStr(date),sizeof(date),TIMEFORM_RFC822,START_TIME,0); fprintf(tmp,"Started: %s\r\n",date); fprintf(tmp,"Pid: %d\r\n",getpid()); cwd[0] = 0; IGNRETS getcwd(cwd,sizeof(cwd)); fprintf(tmp,"Cwd: %s\r\n",cwd); strfLoadStat(AVStr(load),sizeof(load),"%L (%l)",now); fprintf(tmp,"Load: %s\r\n",load); fprintf(tmp,"Stack: %X %d/%d\r\n",p2i(STACK_PEAK),ll2i(STACK_BASE-STACK_PEAK), STACK_SIZE); fprintf(tmp,"\r\n"); if( iamServer() ) { } else { fprintf(tmp,"Client-Proto: %s\r\n",CLNT_PROTO); fprintf(tmp,"Client-Host: %s:%d\r\n",Client_Addr(buf),Client_Port); if( TeleportHost[0] ) fprintf(tmp,"Rident-Host: %s:%d..%s:%d\r\n",TelesockHost,TelesockPort, TeleportAddr,TeleportPort); fprintf(tmp,"\r\n"); } fprintf(tmp,"%s\r\n",body); /* if( strncasecmp(what,"sig",3) == 0 || *what == '[' ){ */ if( strncasecmp(what,"sig",3) == 0 || strncasecmp(what,"failed",6) == 0 || *what == '[' ) { fprintf(tmp,"--iLog--begin\r\n"); iLOGdump1(tmp,0); fprintf(tmp,"--iLog--end\r\n"); fprintf(tmp,"\r\n"); fprintf(tmp,"--AbortLog--begin\r\n"); putAbortLog(tmp); fprintf(tmp,"--AbortLog--end\r\n"); } if( strncasecmp(what,"sig",3) == 0 ) { int btout[2]; double Start = Time(); int rcc; fprintf(tmp,"\r\n"); fprintf(tmp,"--BackTrace--begin\r\n"); fflush(tmp); if( pipe(btout) == 0 ) { setNonblockingIO(btout[1],1); bt = fdopen(btout[1],"w"); putBackTrace(bt); fclose(bt); bt = fdopen(btout[0],"r"); rcc = file_copyTimeout(bt,tmp,NULL,128*1024,NULL,15); fclose(bt); sv1log("BatckTrace: %dB / %.1fs\n",rcc,Time()-Start); } else { bt = TMPFILE("BackTrace"); putBackTrace(bt); fseek(bt,0,0); copyfile1(bt,tmp); fclose(bt); } fprintf(tmp,"\r\n"); fprintf(tmp,"--BackTrace--end\r\n"); } fflush(tmp); fseek(tmp,0,0); if( curLogFp() ) { CStr(line,1024); while( fgets(line,sizeof(line),tmp) != NULL ) fprintf(curLogFp(),"--ABORT-- %s",line); fseek(tmp,0,0); } Conn->co_mask = (CONN_NOPROXY | CONN_NOMASTER); sendmail1(Conn,admin,admin,tmp,NULL); fclose(tmp); }
int service_lpr(DGC*Conn,int _1,int _2,int fromC,int toC,PCStr(svproto),PCStr(svhost),int svport,PCStr(svpath)) { FILE *ts,*fs,*fc,*tc; CStr(req,1024); CStr(resp,0x8000); char op; int nowait; FILE *tmp; const char *host = svhost; int port = svport; LprJob lpj_buf, *lpj = &lpj_buf; nowait = getenv("LPR_NOWAIT") != NULL; /* if( withMount || filter_withCFI(Conn,X_FTOSV) ) nowait = 1; */ if( nowait ) fc = fdopen(dup(fromC),"r"); else fc = fdopen(fromC,"r"); tc = fdopen(toC,"w"); bzero(lpj,sizeof(LprJob)); op = 0; if( nowait ){ tmp = TMPFILE("LPR"); op = relay_commands(lpj,tmp,NULL,tc,fc); fclose(fc); fc = tmp; fflush(tmp); fseek(tmp,0,0); if( op == 0 ){ syslog_ERROR("disconnect with the client.\n"); fclose(tc); tc = NULL; closedups(0); /* maybe necessary for Win32 ? */ } /* MOUNT host,port using CONTROL DATA */ /* conver the data */ /* { int off,siz,rcc; const char *buff; sv1log("#### DATA:%d+%d CTRL:%d+%d SIZE=%d\n", lpj->l_data_off, lpj->l_data_siz, lpj->l_ctrl_off, lpj->l_ctrl_siz, lpj->l_off); if( siz = lpj->l_data_siz ){ fseek(tmp,lpj->l_data_off,0); buff = (char*)malloc(lpj->l_data_siz+1); rcc = fread (buff,1,lpj->l_data_siz,tmp); buff[rcc] = 0; fprintf(stderr,"---\n%s---\n",buff); free(buff); fseek(tmp,0,0); } } */ } if( open_lpr(host,port,&ts,&fs) != 0 ){ syslog_ERROR("cannot connect to LPR %s:%d\n",host,port); resp[0] = (char)-1; IGNRETP write(toC,resp,1); return -1; } relay_commands(lpj,ts,fs,tc,fc); if( tc != NULL ){ switch( op ){ case JC_SENDQSTATS: case JC_SENDQSTATL: fprintf(tc,"#### NOWAIT MODE LPR-DeleGate/%s ####\r\n", DELEGATE_ver()); } fclose(tc); } fclose(fc); set_linger(fileno(ts),30); fclose(ts); fclose(fs); return 0; }