⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 env_nt.c

📁 广泛使用的邮件服务器!同时
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Authenticated server log in * Accepts: user name string *	    authentication user name string *	    argument count *	    argument vector * Returns: T if password validated, NIL otherwise */long authserver_login (char *user,char *authuser,int argc,char *argv[]){  return server_login (user,NIL,authuser,argc,argv);}/* Log in as anonymous daemon * Accepts: argument count *	    argument vector * Returns: T if successful, NIL if error */long anonymous_login (int argc,char *argv[]){  return server_login ("Guest",NIL,NIL,argc,argv);}/* Initialize environment * Accepts: user name *          home directory, or NIL to use default * Returns: T, always */long env_init (char *user,char *home){				/* don't init if blocked */  if (block_env_init) return LONGT;  if (myUserName) fatal ("env_init called twice!");  myUserName = cpystr (user);	/* remember user name */  if (!myHomeDir)		/* only if home directory not set up yet */    myHomeDir = (home && *home) ? cpystr (home) : win_homedir (user);  return T;}/* Check if NT * Returns: T if NT, NIL if Win9x */int check_nt (void){  if (is_nt < 0) {		/* not yet set up? */    OSVERSIONINFO ver;    ver.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);    GetVersionEx (&ver);    is_nt = (ver.dwPlatformId == VER_PLATFORM_WIN32_NT) ? T : NIL;  }  return is_nt;}/* Return Windows home directory * Accepts: user name * Returns: home directory */char *win_homedir (char *user){  char *s,*t,tmp[MAILTMPLEN];  PUSER_INFO_1 ui;				/* Win9x default */  if (!check_nt ()) sprintf (tmp,"%s\\My Documents",defaultDrive ());				/* get from user info on NT */  else if ((netapi || (netapi = LoadLibrary ("netapi32.dll"))) &&	   (getinfo ||	    (getinfo = (GETINFO) GetProcAddress (netapi,"NetUserGetInfo"))) &&	   MultiByteToWideChar (CP_ACP,0,user,strlen (user) + 1,				(WCHAR *) tmp,MAILTMPLEN) &&	   !(*getinfo) (NIL,(LPWSTR) &tmp,1,(LPBYTE *) &ui) &&	   WideCharToMultiByte (CP_ACP,0,ui->usri1_home_dir,-1,				tmp,MAILTMPLEN,NIL,NIL) && tmp[0]) {				/* make sure doesn't end with delimiter */    if ((*(s = tmp + strlen (tmp) - 1) == '\\') || (*s == '/')) *s = '\0';  }				/* no home dir, found Win2K user profile? */  else if ((s = getenv ("USERPROFILE")) && (t = strrchr (s,'\\'))) {          strncpy (tmp,s,t-s);	/* copy up to user name */    sprintf (tmp+(t-s),"\\%.100s\\My Documents",user);  }				/* last resort NT default */  else sprintf (tmp,"%s\\users\\default",defaultDrive ());  return cpystr (tmp);}/* Return default drive * Returns: default drive */static char *defaultDrive (void){  char *s = getenv ("SystemDrive");  return (s && *s) ? s : "C:";}/* Return my user name * Accepts: pointer to optional flags * Returns: my user name */char *myusername_full (unsigned long *flags){  UCHAR usr[MAILTMPLEN];  DWORD len = MAILTMPLEN;  char *user,*path,*d,*p,pth[MAILTMPLEN];  char *ret = "SYSTEM";				/* get user name if don't have it yet */  if (!myUserName && !server_nli &&				/* use callback, else logon name */      ((mailusername && (user = (char *) (*mailusername) ())) ||       (GetUserName (usr,&len) && _stricmp (user = (char *) usr,"SYSTEM")))) {    if (block_env_init) {	/* don't env_init if blocked */      if (flags) *flags = MU_LOGGEDIN;      return user;    }				/* try HOMEPATH, then HOME */    if (p = getenv ("HOMEPATH"))      sprintf (path = pth,"%s%s",	       (d = getenv ("HOMEDRIVE")) ? d : defaultDrive (),p);    else if (!(path = getenv ("HOME")))      sprintf (path = pth,"%s\\My Documents",defaultDrive ());				/* make sure doesn't end with delimiter */    if ((*(p = path + strlen (path) -1) == '\\') || (*p == '/')) *p = '\0';    env_init (user,path);	/* initialize environment */  }  if (myUserName) {		/* logged in? */    if (flags)			/* Guest is an anonymous user */      *flags = _stricmp (myUserName,"Guest") ? MU_LOGGEDIN : MU_ANONYMOUS;    ret = myUserName;		/* return user name */  }  else if (flags) *flags = MU_NOTLOGGEDIN;  return ret;}/* Return my local host name * Returns: my local host name */char *mylocalhost (void){  if (!myLocalHost) {    char tmp[MAILTMPLEN];    if (!wsa_initted++) {	/* init Windows Sockets */      WSADATA wsock;      if (WSAStartup (WINSOCK_VERSION,&wsock)) {	wsa_initted = 0;	return "random-pc";	/* try again later? */      }    }    myLocalHost = cpystr ((gethostname (tmp,MAILTMPLEN-1) == SOCKET_ERROR) ?			  "random-pc" : tcp_canonical (tmp));  }  return myLocalHost;}/* Return my home directory name * Returns: my home directory name */char *myhomedir (){  if (!myHomeDir) myusername ();/* initialize if first time */  return myHomeDir ? myHomeDir : "";}/* Return system standard INBOX * Accepts: buffer string */char *sysinbox (){  char tmp[MAILTMPLEN];  if (!sysInbox) {		/* initialize if first time */    if (check_nt ()) sprintf (tmp,MAILFILE,myUserName);    else sprintf (tmp,"%s\\INBOX",myhomedir ());    sysInbox = cpystr (tmp);	/* system inbox is from mail spool */  }  return sysInbox;}/* Return mailbox directory name * Accepts: destination buffer *	    directory prefix *	    name in directory * Returns: file name or NIL if error */char *mailboxdir (char *dst,char *dir,char *name){  char tmp[MAILTMPLEN];  if (dir || name) {		/* if either argument provided */    if (dir) {      if (strlen (dir) > NETMAXMBX) return NIL;      strcpy (tmp,dir);		/* write directory prefix */    }    else tmp[0] = '\0';		/* otherwise null string */    if (name) {      if (strlen (name) > NETMAXMBX) return NIL;      strcat (tmp,name);	/* write name in directory */    }				/* validate name, return its name */    if (!mailboxfile (dst,tmp)) return NIL;  }  else strcpy (dst,myhomedir());/* no arguments, wants home directory */  return dst;			/* return the name */}/* Return mailbox file name * Accepts: destination buffer *	    mailbox name * Returns: file name or empty string for driver-selected INBOX or NIL if error */char *mailboxfile (char *dst,char *name){  char homedev[3];  char *dir = myhomedir ();  if (dir[0] && isalpha (dir[0]) && (dir[1] == ':')) {    homedev[0] = dir[0];	/* copy home device */    homedev[1] = dir[1];    homedev[2] = '\0';  }  else homedev[0] = '\0';	/* ??no home device?? */  *dst = '\0';			/* default to empty string */				/* check for INBOX */  if (!compare_cstring (name,"INBOX"));				/* reject names with / */  else if (strchr (name,'/')) dst = NIL;  else switch (*name) {  case '#':			/* namespace names */    if (((name[1] == 'u') || (name[1] == 'U')) &&	((name[2] == 's') || (name[2] == 'S')) &&	((name[3] == 'e') || (name[3] == 'E')) &&	((name[4] == 'r') || (name[4] == 'R')) && (name[5] == '.')) {				/* copy user name to destination buffer */      for (dir = dst,name += 6; *name && (*name != '\\'); *dir++ = *name++);      *dir++ = '\0';		/* tie off user name */				/* look up homedir for user name */      if (dir = win_homedir (dst)) {				/* build resulting name */	sprintf (dst,"%s\\%s",dir,name);	fs_give ((void **) &dir);      }      else dst = NIL;    }    else dst = NIL;		/* unknown namespace name */    break;  case '\\':			/* absolute path on default drive? */    sprintf (dst,"%s%s",homedev,name);    break;  default:			/* any other name */    if (name[1] == ':') {	/* some other drive? */      if (name[2] == '\\') strcpy (dst,name);      else sprintf (dst,"%c:\\%s",name[0],name+2);    }				/* build home-directory relative name */    else sprintf (dst,"%s\\%s",dir,name);  }  return dst;			/* return it */}/* Lock file name * Accepts: return buffer for file name *	    file name *	    locking to be placed on file if non-NIL * Returns: file descriptor of lock or -1 if error */int lockname (char *lock,char *fname,int op){  int ld;  char c,*s;				/* Win2K and Win98 have TEMP under windir */  if (!((s = lockdir (lock,getenv ("windir"),"TEMP")) ||				/* NT4, NT3.x and Win95 use one of these */	(s = lockdir (lock,getenv ("TEMP"),NIL)) ||	(s = lockdir (lock,getenv ("TMP"),NIL)) ||	(s = lockdir (lock,getenv ("TMPDIR"),NIL)) ||				/* try one of these */	(s = lockdir (lock,defaultDrive (),"WINNT\\TEMP")) ||	(s = lockdir (lock,defaultDrive (),"WINDOWS\\TEMP")) ||				/* C:\TEMP is last resort */	(s = lockdir (lock,defaultDrive (),"TEMP")))) {    mm_log ("Unable to find temporary directory",ERROR);    return -1;  }				/* generate file name */  while (c = *fname++) switch (c) {  case '/': case '\\': case ':':    *s++ = '!';			/* convert bad chars to ! */    break;  default:    *s++ = c;    break;  }  *s++ = c;			/* tie off name */				/* get the lock */  if (((ld = open (lock,O_BINARY|O_RDWR|O_CREAT,S_IREAD|S_IWRITE)) >= 0) && op)    flock (ld,op);		/* apply locking function */  return ld;			/* return locking file descriptor */}/* Build lock directory, check to see if it exists * Accepts: return buffer for lock directory *	    first part of possible name *	    optional second part * Returns: pointer to end of buffer if buffer has a good name, else NIL */char *lockdir (char *lock,char *first,char *last){  struct stat sbuf;  char c,*s;  if (first && *first) {	/* first part must be non-NIL */				/* copy first part */    for (s = lock; c = *first++; *s++ = (c == '/') ? '\\' : c);    if (last && *last) {	/* copy last part if specified */				/* write trailing \ in case not in first */      if (s[-1] != '\\') *s++ = '\\';      while (c = *last++) *s++ = (c == '/') ? '\\' : c;    }    if (s[-1] == '\\') --s;	/* delete trailing \ if any */    *s = s[1] = '\0';		/* tie off name at this point */    if (!stat (lock,&sbuf)) {	/* does the name exist? */      *s++ = '\\';		/* yes, reinstall trailing \ */      return s;			/* return the name */    }  }  return NIL;			/* failed */}/* Unlock file descriptor * Accepts: file descriptor *	    lock file name from lockfd() */void unlockfd (int fd,char *lock){  flock (fd,LOCK_UN);		/* unlock it */  close (fd);			/* close it */}/* Determine default prototype stream to user * Accepts: type (NIL for create, T for append) * Returns: default prototype stream */MAILSTREAM *default_proto (long type){  extern MAILSTREAM CREATEPROTO,APPENDPROTO;  return type ? &APPENDPROTO : &CREATEPROTO;}/* Default block notify routine * Accepts: reason for calling *	    data * Returns: data */void *mm_blocknotify (int reason,void *data){  void *ret = data;  switch (reason) {  case BLOCK_SENSITIVE:		/* entering sensitive code */    ret = (void *) alarm (0);    break;  case BLOCK_NONSENSITIVE:	/* exiting sensitive code */    if ((unsigned int) data) alarm ((unsigned int) data);    break;  default:			/* ignore all other reasons */    break;  }  return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -