📄 env_nt.c
字号:
/* 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 + -