/****************************************************************************** (c) 2000-2003 Patrick Caulfield patrick@debian.org This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ******************************************************************************/ #include #include #include #include #include #include #include #include #include "utils.h" void add_string(unsigned char *packet, int *ptr, const unsigned char *string) { int len = strlen((char *)string); packet[(*ptr)++] = len; strcpy((char *)packet + *ptr, (char *)string); *ptr += len; } void get_string(unsigned char *packet, int *ptr, unsigned char *string) { int len = packet[(*ptr)++]; strncpy((char*)string, (char*)packet + *ptr, len); string[len] = '\0'; *ptr += len; } #ifdef VERBOSE_DEBUG void pjc_debuglog(char *fmt, ...) { static time_t starttime = time(NULL); va_list ap; fprintf(stderr, "%5ld: ", time(NULL)-starttime); va_start(ap, fmt); vfprintf(stderr, fmt, ap); } #endif #ifndef HAVE_OPENPTY int pjc_openpty(int *master, int *slave, char *a, char *b, char *d) { char ptyname[] = "/dev/ptyCP"; char c; char *line=NULL; int i; int pty=-1, t; int gotpty=0; struct stat stb; for (c='p'; c <= 'z'; c++) { line = ptyname; line[strlen("/dev/pty")] = c; line[strlen("/dev/ptyC")] = '0'; if (stat(line,&stb) < 0) break; for (i=0; i < 16; i++) { line[strlen("/dev/ptyC")]= "0123456789abcdef"[i]; if ( (pty=open(line,O_RDWR)) > 0) { gotpty = 1; break; } } if (gotpty) break; } if (!gotpty) { debuglog(("No ptys available for connection")); return -1; } line[strlen("/dev/")] = 't'; if ( (t=open(line,O_RDWR)) < 0) { debuglog(("Error connecting to physical terminal: %m")); return -1; } *master = pty; *slave = t; return 0; } #endif /* Expand \ sequences in /etc/issue.net file and add CRs to LFs */ int expand_issue(const char *original, int len, char *newstring, int maxlen, const char *servicename) { int i,j; char scratch[132]; time_t t; struct tm *tm; struct utsname un; uname(&un); j=0; for (i=0; i= maxlen) break; if (original[i] == '\n') newstring[j++] = '\r';; if (original[i] == '\\' || original[i] == '%') { i++; switch (original[i]) { case '\\': case '%': newstring[j++] = original[i]; break; case 'b': strcpy(newstring+j, "9600"); j+=4; break; case 'd': t = time(NULL); tm = localtime(&t); strftime(scratch, sizeof(scratch), "%a %b %d %Y", tm); strcpy(newstring+j, scratch); j+=strlen(scratch); break; case 's': strcpy(newstring+j, un.sysname); j+=strlen(un.sysname); break; case 'l': strcpy(newstring+j, servicename); j+=strlen(servicename); break; case 'm': strcpy(newstring+j, un.machine); j+=strlen(un.machine); break; case 'n': strcpy(newstring+j, un.nodename); j+=strlen(un.nodename); break; #ifdef __GNU_SOURCE case 'o': strcpy(newstring+j, un.domainname); j+=strlen(un.domainname); break; #endif case 'r': strcpy(newstring+j, un.release); j+=strlen(un.release); break; case 't': t = time(NULL); tm = localtime(&t); strftime(scratch, sizeof(scratch), "%H:%M:%S", tm); strcpy(newstring+j, scratch); j+=strlen(scratch); break; /* No, I am not doing number of users logged in... */ case 'v': strcpy(newstring+j, un.version); j+=strlen(un.version); break; } } else { newstring[j++] = original[i]; } } return j; }