📄 env_nt.c
字号:
/* success if no longer NLI */ if (!server_nli) return env_init (user,NIL); } } s = (logtry-- > 0) ? "Login failure" : "Excessive login attempts"; /* note the failure in the syslog */ syslog (LOG_INFO,"%s user=%.80s host=%.80s",s,user,tcp_clienthost ()); sleep (3); /* slow down possible cracker */ return NIL;}/* 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){ 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")))) { /* 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 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 *dir = myhomedir (); *dst = '\0'; /* default to empty string */ /* check for INBOX */ if (((name[0] == 'I') || (name[0] == 'i')) && ((name[1] == 'N') || (name[1] == 'n')) && ((name[2] == 'B') || (name[2] == 'b')) && ((name[3] == 'O') || (name[3] == 'o')) && ((name[4] == 'X') || (name[4] == 'x')) && !name[5]) return dst; /* reject names with / */ if (strchr (name,'/')) return NIL; else if (*name == '#') { /* 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 */ for (dir = dst,name += 6; *name && (*name != '\\'); *dir++ = *name++); *dir++ = '\0'; /* tie off user name */ if (!(dir = win_homedir (dst))) return NIL; /* build resulting name */ sprintf (dst,"%s\\%s",dir,name); fs_give ((void **) &dir); /* clean up other user's home dir */ return dst; } else return NIL; /* unknown namespace name */ } /* absolute path name? */ else if ((*name == '\\') || (name[1] == ':')) return strcpy (dst,name); /* build resulting name */ 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; *first; c = *s++ = *first++); if (last && *last) { /* copy last part if specified */ /* write trailing \ in case not in first */ if (c != '\\') *s++ = '\\'; while (*last) c = *s++ = *last++; } if (c == '\\') --s; /* delete trailing \ if any */ *s = '\0'; /* tie off name at this point */ return stat (lock,&sbuf) ? NIL : s; } 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 DEFAULTPROTO; return &DEFAULTPROTO; /* return default driver's prototype */}/* 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 + -