1
0
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:
Simon Tatham
2003-08-25 13:53:41 +00:00
parent 66fa6f320e
commit bfb9b28393
10 changed files with 726 additions and 450 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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.