mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-06-30 11:02:48 -05:00
Windows PSCP now links against winsftp.c, and scp.c is now a
platform-independent source file. Haven't yet added the extra abstraction routines to uxsftp.c to create a Unix PSCP port, but it shouldn't take long. Also in this checkin, a change of semantics in platform_default_s(): now strings returned from it are expected to be dynamically allocated. [originally from svn r3420]
This commit is contained in:
@ -5,6 +5,8 @@
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <pwd.h>
|
||||
|
||||
#include "putty.h"
|
||||
|
||||
@ -19,6 +21,8 @@ unsigned long getticks(void)
|
||||
return tv.tv_sec * 1000000 + tv.tv_usec;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Filename filename_from_str(const char *str)
|
||||
{
|
||||
Filename ret;
|
||||
@ -57,3 +61,43 @@ void dputs(char *buf)
|
||||
fflush(debug_fp);
|
||||
}
|
||||
#endif
|
||||
|
||||
char *get_username(void)
|
||||
{
|
||||
struct passwd *p;
|
||||
uid_t uid = getuid();
|
||||
char *user, *ret = NULL;
|
||||
|
||||
/*
|
||||
* First, find who we think we are using getlogin. If this
|
||||
* agrees with our uid, we'll go along with it. This should
|
||||
* allow sharing of uids between several login names whilst
|
||||
* coping correctly with people who have su'ed.
|
||||
*/
|
||||
user = getlogin();
|
||||
setpwent();
|
||||
if (user)
|
||||
p = getpwnam(user);
|
||||
else
|
||||
p = NULL;
|
||||
if (p && p->pw_uid == uid) {
|
||||
/*
|
||||
* The result of getlogin() really does correspond to
|
||||
* our uid. Fine.
|
||||
*/
|
||||
ret = user;
|
||||
} else {
|
||||
/*
|
||||
* If that didn't work, for whatever reason, we'll do
|
||||
* the simpler version: look up our uid in the password
|
||||
* file and map it straight to a name.
|
||||
*/
|
||||
p = getpwuid(uid);
|
||||
if (!p)
|
||||
return NULL;
|
||||
ret = p->pw_name;
|
||||
}
|
||||
endpwent();
|
||||
|
||||
return dupstr(ret);
|
||||
}
|
||||
|
@ -74,48 +74,11 @@ static Config cfg;
|
||||
char *platform_default_s(const char *name)
|
||||
{
|
||||
if (!strcmp(name, "X11Display"))
|
||||
return getenv("DISPLAY");
|
||||
return dupstr(getenv("DISPLAY"));
|
||||
if (!strcmp(name, "TermType"))
|
||||
return getenv("TERM");
|
||||
if (!strcmp(name, "UserName")) {
|
||||
/*
|
||||
* Remote login username will default to the local username.
|
||||
*/
|
||||
struct passwd *p;
|
||||
uid_t uid = getuid();
|
||||
char *user, *ret = NULL;
|
||||
|
||||
/*
|
||||
* First, find who we think we are using getlogin. If this
|
||||
* agrees with our uid, we'll go along with it. This should
|
||||
* allow sharing of uids between several login names whilst
|
||||
* coping correctly with people who have su'ed.
|
||||
*/
|
||||
user = getlogin();
|
||||
setpwent();
|
||||
if (user)
|
||||
p = getpwnam(user);
|
||||
else
|
||||
p = NULL;
|
||||
if (p && p->pw_uid == uid) {
|
||||
/*
|
||||
* The result of getlogin() really does correspond to
|
||||
* our uid. Fine.
|
||||
*/
|
||||
ret = user;
|
||||
} else {
|
||||
/*
|
||||
* If that didn't work, for whatever reason, we'll do
|
||||
* the simpler version: look up our uid in the password
|
||||
* file and map it straight to a name.
|
||||
*/
|
||||
p = getpwuid(uid);
|
||||
ret = p->pw_name;
|
||||
}
|
||||
endpwent();
|
||||
|
||||
return ret;
|
||||
}
|
||||
return dupstr(getenv("TERM"));
|
||||
if (!strcmp(name, "UserName"))
|
||||
return get_username();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1,12 +1,11 @@
|
||||
/*
|
||||
* uxsftp.c: the Unix-specific parts of PSFTP.
|
||||
* uxsftp.c: the Unix-specific parts of PSFTP and PSCP.
|
||||
*/
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <pwd.h>
|
||||
|
||||
#include "putty.h"
|
||||
#include "psftp.h"
|
||||
@ -34,45 +33,6 @@ void platform_get_x11_auth(char *display, int *protocol,
|
||||
*/
|
||||
char *platform_default_s(const char *name)
|
||||
{
|
||||
if (!strcmp(name, "UserName")) {
|
||||
/*
|
||||
* Remote login username will default to the local username.
|
||||
*/
|
||||
struct passwd *p;
|
||||
uid_t uid = getuid();
|
||||
char *user, *ret = NULL;
|
||||
|
||||
/*
|
||||
* First, find who we think we are using getlogin. If this
|
||||
* agrees with our uid, we'll go along with it. This should
|
||||
* allow sharing of uids between several login names whilst
|
||||
* coping correctly with people who have su'ed.
|
||||
*/
|
||||
user = getlogin();
|
||||
setpwent();
|
||||
if (user)
|
||||
p = getpwnam(user);
|
||||
else
|
||||
p = NULL;
|
||||
if (p && p->pw_uid == uid) {
|
||||
/*
|
||||
* The result of getlogin() really does correspond to
|
||||
* our uid. Fine.
|
||||
*/
|
||||
ret = user;
|
||||
} else {
|
||||
/*
|
||||
* If that didn't work, for whatever reason, we'll do
|
||||
* the simpler version: look up our uid in the password
|
||||
* file and map it straight to a name.
|
||||
*/
|
||||
p = getpwuid(uid);
|
||||
ret = p->pw_name;
|
||||
}
|
||||
endpwent();
|
||||
|
||||
return ret;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -98,6 +58,18 @@ Filename platform_default_filename(const char *name)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Stubs for the GUI feedback mechanism in Windows PSCP.
|
||||
*/
|
||||
void gui_update_stats(char *name, unsigned long size,
|
||||
int percentage, unsigned long elapsed,
|
||||
unsigned long done, unsigned long eta,
|
||||
unsigned long ratebs) {}
|
||||
void gui_send_errcount(int list, int errs) {}
|
||||
void gui_send_char(int is_stderr, int c) {}
|
||||
void gui_enable(char *arg) {}
|
||||
|
||||
|
||||
/*
|
||||
* Set local current directory. Returns NULL on success, or else an
|
||||
* error message which must be freed after printing.
|
||||
|
Reference in New Issue
Block a user